Como iniciar o método Simplex a partir de um ponto interno viável?

8

Eu tenho um algoritmo que gera uma solução viável para um problema de programação linear. No entanto, é muito provável que este não seja um ponto de partida. Isso o torna inadequado para uso direto como solução inicial viável para um solucionador Simplex limitado. Como posso encontrar com eficiência um ponto de vantagem dessa solução que posso usar?

Em resumo, como posso iniciar o método Simplex a partir de um ponto interno viável?

Dylan
fonte
Existem algoritmos que vão de um ponto interno ideal a uma solução básica ideal (usada para obter uma solução básica ideal depois que um algoritmo de ponto interior converge para uma solução não básica ideal). Talvez você possa usar algo assim, mas por que você deseja fornecer uma solução inicial viável para um LP? Você tem um LP em que a viabilidade é um gargalo?
user327301
O algoritmo que mencionei que gera a solução viável de fato apenas gera isso como um subproduto. Seu principal resultado é o conjunto de restrições para o LP. Gostaria apenas de aproveitar ao máximo esta solução viável, em vez de ignorá-lo e usá Fase 1.
Dylan
Tem certeza de que isso ajudará? Você já olhou os logs do seu solucionador e viu qual a porcentagem de tempo gasta em encontrar uma solução viável e em encontrar uma solução ideal? Estou cético quanto a isso ajudar, a menos que você esteja fornecendo soluções iniciais muito boas para um programa linear muito grande ou muito denso (ou seja, difícil).
user327301
Independentemente de ajudar, estou curioso para saber se é possível. Há uma boa chance de que a solução inicial viável esteja quase ótima. O LP é muito denso - os zeros são improváveis ​​em qualquer parte do quadro.
Dylan
1
Quando o CPLEX usa algoritmos de pontos internos, ele executa o que a documentação chama de crossover para passar para uma solução básica. Não sei nada sobre crossover, mas esse pode ser um ponto de partida para você encontrar algo. (Agora você está me fazendo querer afiar meu conhecimento LP!)
user327301

Respostas:

6

Todo livro sobre otimização linear explica o método simplex como um algoritmo de dois estágios: o primeiro para encontrar um canto viável como ponto de partida e o segundo para encontrar o ideal. O primeiro usa um problema duplo. Veja D. Bertsimas e JN Tsitsiklis: "Introdução à otimização linear" , por exemplo.

A razão pela qual precisamos da abordagem em duas fases é que normalmente é difícil encontrar qualquer ponto viável - em espaços dimensionais altos, o conjunto viável é muito pequeno comparado com, por exemplo, a caixa da unidade. Da sua pergunta, parece que você tem uma maneira diferente de encontrar pelo menos um ponto possível e, nesse caso, pode ser possível gerar um vértice do poliedro possível a partir deste ponto. Uma idéia seria usar a seguinte abordagem: cada restrição de desigualdade representa um meio espaço separado por um hiperplano. Dado um ponto possível , encontre os hiperplanos n + 1 mais próximos de x xn+1xe pegue a interseção deles. Intuitivamente, esse vértice deve ser viável, embora eu admita que seria necessário pensar um pouco mais sobre isso.

Wolfgang Bangerth
fonte
1
Infelizmente, todos os algoritmos de dois estágios para o método simplex que encontrei descrevem a "Fase 1", onde variáveis ​​artificiais são usadas para encontrar uma solução viável básica a partir de uma solução não viável básica. No entanto, o que eu quero é encontrar uma solução viável básica a partir de uma solução viável não básica. Estou perdendo algo sobre a "Fase 1" que pode ser aplicada a soluções não básicas?
Dylan
Eu não entendo por que você precisa disso. Tudo o que você precisa para a fase 2 é qualquer vértice (uma solução viável básica). Por que você se importaria onde a fase 1 começa desde que saiba onde termina?
Wolfgang Bangerth
Mas a Fase 1 requer uma solução básica (não viável). Se, de alguma forma, eu puder iniciar a Fase 2 com uma solução viável não básica, ela deverá resolver muito mais rapidamente do que iniciar a Fase 1 a partir da origem.
Dylan
Mas a fase 2 - o método simplex real - caminha de vértice para vértice do poliedro que é o conjunto possível. Ele precisa começar com um vértice, ou seja, um ponto básico viável. Não há maneira de contornar isso. A Fase 1 tem como objetivo fornecer exatamente esse ponto de partida. Eu imagino que você poderia realmente acelerar o algoritmo se tivesse uma maneira de gerar um vértice do conjunto viável a partir de qualquer outro ponto possível, e imagino que isso nem seria muito difícil (apenas projete nas restrições mais próximas ) O problema em geral é encontrar qualquer ponto viável. n+1
Wolfgang Bangerth
Se não for muito difícil, você poderia detalhar? Tanto quanto posso ver, ao projetar cada restrição, por sua vez, você pode insatisfar as restrições anteriores. Então, como você projeta todas as restrições de uma só vez? Este é o problema que estou pedindo para resolver. Não é o caso geral de encontrar um ponto viável.
Dylan
4

Infelizmente, a solução de Wolfgang Bangerth não garante que funcione:

insira a descrição da imagem aqui

EuEu(n-Eu)n


fonte
3

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

maxcx

sujeito a

UMAx=b

euxvocê

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

  1. 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. UMAx=b

  1. 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

  1. 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.

  2. 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.

Brian Borchers
fonte
-3

Eu estava procurando a solução para uma pergunta semelhante: para um programa linear esparso muito grande, apenas o método simplex testado funciona, mas somente quando a solução 0 padrão é viável. Parece que o algoritmo da fase um (como no linprog do Matlab) é ruim. E o código-fonte da fase um é tão complexo para substituí-lo por outro algoritmo, como o algoritmo genético; portanto, um método para contornar isso é fazer a transformação linear do problema original, de modo que nas novas variáveis ​​a solução viável inicial fornecida seja 0, e isso 0 será usado pela fase um sem usar seu próprio método para encontrar um ponto de partida diferente.

Ao testar esse método, passo a passo através de linprog.m, simplex.m, simplexpresolve.m e simplexphaseone.m, nos casos em que apenas restrições de desigualdade são usadas, confirma-se que o 0 padrão será usado para as variáveis ​​originais, em que as variáveis ​​de folga terão as diferenças. Portanto, a transformação linear pode deslocar x0 para simplex, impedindo intencionalmente o usuário de fornecer x0. Você pode ver a mensagem "O ponto inicial padrão é possível, ignorando a Fase 1". Por outro lado, geralmente o GA pode encontrar uma solução próxima do programa linear para 0,01% usando tempos duplos ou triplos, portanto, pode não merecer os esforços da transformação linear dessas restrições, objetivo e limites, especialmente quando as restrições são criadas artificialmente .

Frank
fonte
Olá Frank e bem-vindo ao Scicomp! A pergunta que você faz é perfeitamente válida, mas como ela realmente não aborda a pergunta do OP original, ela realmente não pertence a uma 'resposta'. Você realmente deve excluí-lo e repassá-lo com mais detalhes como uma pergunta separada.
Paul
Não importa: esse método é o suficiente para simplex usar um x0 inicial fornecido após converter o x0 para 0, o método simplex originalmente ignora qualquer x0 fornecido.
18713 Frank