Localizando todas as soluções para um problema de programação linear inteira (ILP)

8

Meu problema é encontrar todas as soluções inteiras para um ILP. Como exemplo, estou usando um ILP com duas variáveis, mas posso ter mais de duas variáveis. Descrevo o método que atualmente uso para resolver esse problema próximo ao fim, mas estou interessado em saber se existe um algoritmo ou método adequado e eficiente para resolver esse tipo de problema.

Não há função objetiva, mas as restrições para este ILP são

02xy801x+3y502+xy2x,yZ

Como esse ILP possui duas variáveis, posso inspecionar visualmente a região da solução, fazendo um gráfico das linhas formadas pelas restrições, que são

y2xy2x8y13x13y13x+43yx+2yx

Gráfico

Por inspeção, existem 6 soluções inteiras para (x,y) : {(0,0),(1,1),(1,0),(2,0),(2,1),(3,1)} .

No entanto, meu método atual é usar a programação linear com a não-negatividade relaxada e números inteiros de ramificação e corte. Tentei usar um conjunto de quatro funções objetivas: minimizar x , maximizar x , minimizar y e maximizar y . Isso fornece uma área de pesquisa menor, como

3x01y1

Eu itero sobre todas as tuplas inteiras válidas nessa área menor e a filtre por tuplas que satisfazem as restrições originais. As tuplas restantes são todas soluções válidas de número inteiro.

resiste
fonte

Respostas:

8

"Programação linear" é um problema de otimização. O problema que você está tentando resolver é contar pontos de rede dentro de um polítopo racional convexo finito.

Esse problema tem um algoritmo de tempo polinomial, cujo caso geral foi descoberto por Alexander Barvinok em 1994. Parece que todos os algoritmos modernos são amplamente baseados nesse método. O artigo de Barvinok & Pommershein, de 1999, Uma teoria algorítmica de pontos de treliça em Poliedros , é provavelmente a melhor introdução à teoria. (Na verdade, parece que Barvinok posteriormente escreveu um livro ou monografia; isso pode ser ainda melhor.)

Provavelmente há desenvolvimentos mais recentes do que eu sei, mas isso lhe dará um ponto de partida para buscar citações.

Pseudônimo
fonte
Obrigado por essa observação. Não estou familiarizado com os tópicos mencionados, mas após uma breve inspeção, acredito que eles são um bom ponto de partida para aprender mais. Infelizmente, minha reputação é muito baixa para te ajudar.
resyst 27/08/16
4
Hã. Isso é surpreendente. Verificar se existe algum ponto inteiro dentro de um politopo convexo (se o número desses pontos é 0 ou ) é equivalente a verificar a viabilidade de uma instância de programação linear inteira (ILP). ILP é NP-difícil. Portanto, eu teria inferido que é NP-difícil até mesmo verificar se um politopo contém um ponto integral, e muito menos contar o número deles. Como reconciliamos esses dois fatos? Onde eu errei? >0
DW
O problema é provavelmente que o algoritmo de Barvinok é polinomial para uma dimensão fixa. Se o número de variáveis ​​for fixo, o algoritmo é escalado polinomialmente à medida que você adiciona restrições. Os casos típicos em que você deseja enumerar pontos de rede são coisas como as soluções para equações diofantinas lineares, e aí a dimensão tende a ser baixa.
Pseudônimo 28/08
2

Land e Doig (1960) propuseram um método para resolver problemas de programação discretos. Você pode modificar seu algoritmo para que, em vez de resolver um problema de otimização, enumere todas as soluções possíveis possíveis de número inteiro.

Referência

AH Land e AG Doig (1960). "Um método automático para resolver problemas de programação discretos". Econometrica. 28 (3) 497-520. doi: 10.2307 / 1910129.

John Frederick Chionglo
fonte
0

leia este artigo: Computando cascos convexos e contando pontos inteiros com polymake. Eu acho que o polymake pode fazer isso por você.

Asghar Moeini
fonte
2
Esta pode ser uma informação interessante. Esse documento está disponível online? Quem são os autores? Você leu o guia sobre como fornecer referências ?
John John