Na verdade, existem muitas abordagens diferentes para a fase I no método simplex. Em particular, existem algoritmos de fase I que usam iterações simplex simplex primárias e outros algoritmos de fase I que usam iterações simplex duplas. Aqui está uma abordagem muito geral que pode ser facilmente adaptada para usar uma solução viável conhecida. Esta versão usa o método simplex duplo na fase I e o método simplex primal na fase II, mas há uma variante que usa iterações simplex primárias na fase I e iterações simplex duplas na fase II que mencionarei no final. A abordagem que vou descrever aqui é discutida em muitos livros didáticos sobre programação linear. Por exemplo, veja o texto de Robert Vanderbei .
Suponha que estamos resolvendo
max c x
sujeito a
A x = b
l ≤ x ≤ u
onde do tamanho por . Por uma questão de simplicidade, suponha que as linhas de sejam linearmente independentes (isso pode ser conseguido por uma fatoração reveladora da classificação).UMAmnUMA
- Escolha uma base inicial. Esta é uma coleção de variáveis para que as colunas correspondentes de formem uma matriz não singular . As demais variáveis não básicas podem ser definidas para seus limites superior ou inferior (ou zero se uma variável não tiver limites). mUMAB
Uma maneira fácil de fazer isso em sua solução inicial é selecionar como variáveis básicas as variáveis que estão mais distantes de seus limites na solução viável conhecida e, em seguida, verificar se não é singular. Pode ser necessário modificar a base para tornar não singular. O ponto aqui é que existem muitas bases possíveis, mas essa tem como variáveis básicas as variáveis que parecem estar corretas em sua solução viável. BB
Resolva as equações para obter os valores das variáveis básicas. A x = b
- A solução básica que você obtém provavelmente será primordial inviável no sentido de que algumas das variáveis primárias estão fora de seus limites. Também é provável que seja duplamente inviável no sentido de que alguns dos custos reduzidos das variáveis não básicas apresentam sinais errados (por exemplo, variáveis não básicas nos limites inferiores com custos reduzidos positivos ou variáveis não básicas nos limites superiores com custos reduzidos negativos).
Superaremos esse problema alterando a função objetivo para uma que seja dupla viável. Para cada variável não básica em seu limite inferior, subtraia uma grande quantidade positiva do coeficiente da função objetivo. Para cada variável não básica em seu limite superior, adicione uma grande quantidade positiva ao coeficiente. Isso garante que o dicionário seja duplo viável. MM
O objetivo dessa modificação da função objetivo é tentar trabalhar em direção à viabilidade primordial, mas também avançar em direção à otimização em relação à função objetivo original. Você quer que seja grande o suficiente para ter dupla viabilidade, mas deseja manter o máximo de influência possível da função objetivo original. M
Execute métodos simplex duplos para obter uma solução básica que seja ao mesmo tempo primal viável (todas as variáveis básicas dentro dos boudns) e viável dupla (todos os custos reduzidos têm o sinal desejado.) Essa solução é ideal para o problema da fase I.
Substitua a função objetivo modificada da fase I pela função objetivo original. Agora você terá uma solução básica que é primal viável (alterar a função objetivo não afeta isso), mas que é dupla inviável. Execute iterações simplais primárias para voltar à otimização.
Uma alternativa óbvia a essa abordagem seria modificar o lado direito b no início da fase I, usar iterações simplex primárias na fase I para obter a otimização e, em seguida, colocar o lado direito original de volta na fase II e usar iterações simplex duplas na fase II.