CAPÍTULO 7. O MÉTODO SIMPLEX 69Observe que no exemplo anterior, foi possível obter facilmente uma solução básica viávelinicial. De fato, quando o PLmin cxs.a. Ax ≤ bé tal que b ≥ 0, ao colocarmos-o na forma padrãox ≥ 0min cx + 0x fs.a. Ax + I m x f = bx, x f ≥ 0temos a base trivial I m relativa às variáveis <strong>de</strong> folga x f (neste caso, as VB’s). Essa base forneceuma solução básica viável, pois x Im = I −1m b = b ≥ 0. Quando o problema não está nessaforma, a obtenção <strong>de</strong> uma base inicial não é tão simples. Além disso, <strong>de</strong>ve-se garantir que ocálculo da inversa da base inicial não seja difícil. Veremos no próximo capítulo como em geralpo<strong>de</strong>mos obter uma base sem precisar calcular sua inversa (método <strong>de</strong> duas fases).7.8 Exercícios1. Fazer os seguintes exercícios do livro do Bazaraa [1]: 3.1, 3.3, 3.4, 3.10, 3.11, 3.13(b-e,g),3.18, 3.25, 3.26, 3.27, 3.35.7.9 Uma implementação básica do SimplexNesta seção apresentamos uma implementação simples em C do método Simplex visto nestecapítulo. Com ela será possível somente resolver problemas viáveis da formamin cxs.a. Ax ≤ bx ≥ 0on<strong>de</strong> b ≥ 0 pois, como visto, neste caso po<strong>de</strong>mos iniciar o Simplex com a base viável I. Vocêpo<strong>de</strong> usá-lo para verificar os exercícios <strong>de</strong> resolução <strong>de</strong> problemas.Vale uma observação sobre o código. Note que no QS, há sempre um bloco i<strong>de</strong>ntida<strong>de</strong>,relativo às variáveis básicas. De fato, as linhas das VB’s vêm da equação Ix B + B −1 N = B −1 b(observe isso no último exemplo <strong>de</strong>ste capítulo). Por isso, essas colunas são retiradas da matrizque armazena o QS, e também não são impressas na tela. Ou seja, no programa somenteas colunas das VNB’s são armazenadas. Isso reduz a quantida<strong>de</strong> <strong>de</strong> memória requerida peloprograma. O mesmo acontece com a coluna <strong>de</strong> z, que é constituída do um da linha zero e <strong>de</strong>zeros nas linhas restantes.Alertamos ainda sobre exercícios durante o código. Todos eles po<strong>de</strong>rão ser respondidos àluz da teoria apresentada, e servem para melhor entendimento dos procedimentos realizados.Por fim, o programa abaixo não foi concebido para ser eficiente. Tem apenas caráterdidático. Implementações eficientes levam em consi<strong>de</strong>ração questões que fogem à estas notas.
CAPÍTULO 7. O MÉTODO SIMPLEX 707.9.1 Preâmbulo do códigoEsta é a parte inicial do código. Contém <strong>de</strong>finições das variáveis e pré-<strong>de</strong>finições das funções./∗SIMPLEX para problemas na forma :min cxsa Ax = 0com b >= 0Formato do arquivo <strong>de</strong> entrada :m nc1 c2 . . . cnb1 b2 . . . bma11 a12 . . . a1n. . .. . .. . .am1 am2 . . . amnon<strong>de</strong>m = número <strong>de</strong> r e s t r i ç õ e sn = número <strong>de</strong> v a r i á v e i s l e g í t i m a sObs . : O problema é v i á v e l p o i s 0 é solução . Portanto , asúnicas p o s s i b i l i d a d e s são a <strong>de</strong> um problema i l i m i t a d oou <strong>de</strong> um problema com solução ótima .∗∗∗∗∗∗∗∗ EXERCÍCIO ∗∗∗∗∗∗∗∗Sendo o problema na forma d e s c r i t a acima , quantas VNB’ s e x i s t i r ã oapós a i n s e r ç ão <strong>de</strong> v a r i á v e i s <strong>de</strong> f o l g a ?∗/#inclu<strong>de</strong> #inclu<strong>de</strong> #<strong>de</strong>fine ERRO 1e−8 // a c e i t a ç ã o <strong>de</strong> erro numérico#<strong>de</strong>fine INF 1e+12 // representação <strong>de</strong> i n f i n i t o/∗Quadro simplexQS[ 0 ] = l i n h a <strong>de</strong> z∗/double ∗∗QS = NULL;unsigned int m, n ; //m r e s t r i ç õ e s , n var (com f o l g a ) (n > m)unsigned int ∗VNB = NULL; // í n d i c e s das VNB’ sunsigned int ∗VB = NULL; // í n d i c e s das VB’ s