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?
Respostas:
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,…,xn C c1,c2,…,cn∈R c1x1+⋯+cnxn C
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,y L2
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=(x1−y1)2+⋯+(xn−yn)2 x y x y
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 objetivok x1,…,xk∈Rn
ou seja, a função
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.C xi
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.k k+1 k
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.k t k x1,…,xk∈Rn t d(xi,xj)≥t i<j
fonte
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).a1 a2 b1 b2 |a1−a2|+|b1−b2|
Podemos introduzir "variáveis de folga" abs_a e abs_b e as restrições:
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 .b1 b2 absa a1 a2 absa a1 a2
O que resta é substituir a função objetivo: maximize .absa+absb
fonte