Localizando um conjunto de soluções maximamente diferentes usando programação linear ou outra técnica de otimização


8

Tradicionalmente, a programação linear é usada para encontrar a solução ideal para um conjunto de restrições, variáveis ​​e um objetivo (todos descritos como relacionamentos lineares). Às vezes, quando o objetivo é paralelo a uma restrição, existem infinitas ou muitas soluções ótimas igualmente boas. Não estou perguntando sobre este último caso.

Estou mais interessado em encontrar muitas soluções que estão na região viável gerada pelo meu conjunto de restrições. Mas gostaria que as soluções que encontrei fossem "dispersas" pela região viável, no sentido de que elas estão no máximo uma da outra. Existe uma maneira conhecida de, sem executar um solucionador várias vezes, gerar várias soluções e usar a função objetivo para impor que as soluções sejam separadas?

Por exemplo, qualquer programa linear com as decisões aeb e restrições w <= a <= x e y <= b <= z pode ser 'duplicado' para encontrar duas soluções. Nosso novo programa linear tem variáveis ​​a1, a2, b1 e b2 e as restrições w <= a1 <= x e w <= a2 <= x e similares para b1, b2. No entanto, quando se trata de formar uma função objetiva, encontramos problemas, pois não podemos usar outras normas além da norma L1 sem descartar a linearidade e não podemos usar verdadeiramente a norma L1 porque não é possível (tanto quanto sei ) para codificar valores absolutos.

Talvez eu deva procurar otimização convexa ou programação semidefinida ou algo assim?

Existe uma maneira conhecida de gerar um conjunto de soluções para um programa linear e usar um objetivo que imponha "distância" entre as soluções?


1
Calcule o menor cubo em torno de sua região viável (se não houver limites, escolha alguma parte delimitada), coloque uma hiper-grade com a resolução desejada sobre ela e descarte todos os pontos que não cumprirem as restrições. Isso funcionaria para você?
Raphael

Isso pode funcionar para mim, embora não esteja claro para mim como eu calcularia o hipercubo, e acho que a região viável que estou investigando é altamente não trivial - espero que muitos pontos tenham que ser descartados. Meu aplicativo em particular possui dezenas de milhares de variáveis ​​/ decisões e centenas de restrições.
Ross

Uma solução básica viável está em um vértice do politopo. Você não pode olhar para as normais das faces do incidente para calcular uma direção "através" do politopo e segui-la até o limite da região viável? Isso deve fornecer soluções razoavelmente diferentes, mas provavelmente não as mais diferentes.
precisa saber é o seguinte

Não use um cubo. Use um elipsóide (especificamente, um pequeno elipsóide contendo o politopo, que pode ser encontrado pelo método elipsóide). Dessa forma, você garante um número razoável de pontos na região.
Peter Shor

Respostas:


2

Uma heurística, usando programação linear

Uma abordagem pode ser escolher uma função objetiva aleatória e maximizá-la. Em seguida, repita, com um conjunto diferente de funções objetivas a cada vez.

Em outras palavras, suponha que as incógnitas sejam e você tenha algumas restrições . Em cada iteração, você escolhe aleatoriamente e, em seguida, procura uma solução que maximize sujeita às restrições .x1,x2,,xnCc1,c2,,cnRc1x1++cnxnC

Eu esperaria que essa heurística frequentemente encontrasse um conjunto de soluções um tanto dispersas - não necessariamente dispersas ao máximo (maximamente distantes uma da outra), mas provavelmente também não muito próximas umas das outras.

Maximizando a distância L2 média em pares, usando programação quadrática

Como alternativa, use programação quadrática. Para simplificar, vejamos o problema de encontrar duas soluções. Suponha que você queira duas soluções tão distantes uma da outra quanto possível, sob a norma (distância euclidiana). Então isso pode ser formulado como um problema de programação quadrática .x,yL2

Basicamente, você deseja maximizar a distância ao quadrado entre e , sujeito ao requisito de que e devem satisfazer as restrições. Esse é o problema de maximizar uma função objetiva quadrática, com restrições lineares - isto é, programação quadrática.d(x,y)2=(x1y1)2++(xnyn)2xyxy

Se você quiser pontos com dispersão máxima, isso também é possível. Digamos que os pontos sejam . Então você pode maximizar a função objetivokx1,,xkRn

i<jd(xi,xj)2,

ou seja, a função

i<j(xixj)2.

Essa é uma função quadrática e você tem restrições lineares em cada um dos pontos , portanto, essa é uma instância de programação quadrática. Ele encontra pontos que estão espalhados ao máximo, no sentido de que a distância média por pares é maximizada.Cxi

Você também pode formular uma variante gananciosa desse algoritmo, onde você já possui soluções , e deseja encontrar uma solução que atenda a todas as desigualdades lineares e também maximize a distância média de L2 dele para as outras soluções . Isso também pode ser formulado como um problema de programação quadrática.kk+1k

A programação quadrática é mais difícil do que a programação linear, mas existem solucionadores independentes que resolverão problemas de programação quadrática para você.

Maximizando a distância L2 mínima em pares, usando QCQP

Finalmente, digamos que você queira que seus pontos sejam dispersos no sentido de que você deseja maximizar a distância mínima em pares. Em outras palavras, digamos que você queira encontrar o maior limite possível modo que seja possível encontrar pontos que satisfaçam as restrições lineares, e tal que cada par de pontos esteja à distância um do outro: para todos os . Então isso pode ser formulado como um programa de otimização quadrática com restrições quadráticas, ou seja, QCQP . O QCQP é ainda mais difícil, mas existem soluções prontas para uso para o QCQP que você também pode experimentar.ktkx1,,xkRntd(xi,xj)ti<j


1

Eu encontrei uma abordagem para gerar valores absolutos.

Suponha que tenhamos as variáveis , , e e restrições. Nossas funções objetivas se parecem com: maximizar; a ideia é que queremos maximizar a norma L1 dessas duas soluções (conforme a pergunta original).a1a2b1b2|a1a2|+|b1b2|

Podemos introduzir "variáveis ​​de folga" abs_a e abs_b e as restrições:

absa+a1a20

absaa1+a20

e da mesma forma para e . Essas restrições forçam a ter no máximo a diferença entre e e possivelmente menos. Em outras palavras, não pode ser maior que a diferença máxima entre e .b1b2absaa1a2absaa1a2

O que resta é substituir a função objetivo: maximize .absa+absb


Na verdade, essas codificações funcionam apenas para a minimização de valores absolutos. Nele, não resolve o meu problema. Mais informações aqui: lpsolve.sourceforge.net/5.5/absolute.htm
Ross
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.