Traditionnellement, la programmation linéaire est utilisée pour trouver la solution optimale à un ensemble de contraintes, de variables et d'un objectif (tous décrits comme des relations linéaires). Parfois, lorsque l'objectif est parallèle à une contrainte, il existe une infinité ou de nombreuses solutions optimales tout aussi bonnes. Je ne pose pas de question sur ce dernier cas.
Je suis plus intéressé à trouver de nombreuses solutions qui sont dans la région réalisable générée par mon ensemble de contraintes. Mais j'aimerais que les solutions que je trouve soient «dispersées» autour de la région réalisable dans le sens où elles sont au maximum éloignées les unes des autres. Existe-t-il un moyen connu, sans exécuter plusieurs fois un solveur, de générer plusieurs solutions et d'utiliser la fonction objectif pour imposer la séparation des solutions?
Par exemple, tout programme linéaire avec les décisions a et b et les contraintes w <= a <= x et y <= b <= z peut être «dupliqué» pour trouver deux solutions. Notre nouveau programme linéaire a des variables a1, a2, b1 et b2 et les contraintes w <= a1 <= x et w <= a2 <= x et similaires pour b1, b2. Cependant, quand il s'agit de former une fonction objective, nous rencontrons des problèmes car nous ne pouvons pas utiliser des normes autres que la norme L1 sans rejeter la linéarité et nous ne pouvons même pas vraiment utiliser la norme L1 car ce n'est pas possible (pour autant que je sache) ) pour coder des valeurs absolues.
Peut-être que je devrais me pencher sur l'optimisation convexe ou la programmation semi-définie ou quelque chose?
Existe-t-il un moyen connu de générer un ensemble de solutions pour un programme linéaire et d'utiliser un objectif qui impose une "distance" entre les solutions?
Réponses:
Une heuristique, utilisant la programmation linéaire
Une approche pourrait être de choisir une fonction objective aléatoire et de la maximiser. Répétez ensuite, avec un ensemble différent de fonctions objectives à chaque fois.
En d'autres termes, supposons que les inconnues soientX1,X2, … ,Xn et vous avez des contraintes C . Dans chaque itération que vous choisissezc1,c2, … ,cn∈ R au hasard, puis recherchez une solution qui maximise c1X1+ ⋯ +cnXn soumis aux contraintes C .
Je m'attendrais à ce que cette heuristique trouve souvent un ensemble de solutions quelque peu dispersées - pas nécessairement dispersées au maximum (au maximum éloignées les unes des autres), mais probablement pas trop proches les unes des autres non plus.
Maximiser la distance L2 moyenne par paire, en utilisant la programmation quadratique
Vous pouvez également utiliser la programmation quadratique. Par souci de simplicité, examinons le problème de la recherche de deux solutions. Supposons que vous souhaitiez deux solutionsx , y aussi éloignés les uns des autres que possible, en vertu de la L2 norme (distance euclidienne). Ensuite, cela peut être formulé comme un problème de programmation quadratique .
Fondamentalement, vous voulez maximiser la distance au carréré( x , y)2= (X1-y1)2+ ⋯ + (Xn-yn)2 entre X et y , sous réserve que les deux X et y doit satisfaire aux contraintes. C'est le problème de la maximisation d'une fonction objectif quadratique, avec des contraintes linéaires - c'est-à-dire une programmation quadratique.
Si tu veuxk points qui sont diffusés au maximum, cela est également possible. Dites que les points sontX1, … ,Xk∈Rn . Ensuite, vous pouvez maximiser la fonction objectif
c'est-à-dire la fonction
Ceci est une fonction quadratique, et vous avez des contraintes linéairesC sur chacun des points Xje , il s'agit donc d'une instance de programmation quadratique. Il vous trouve des points qui sont diffusés au maximum dans le sens où la distance moyenne par paire est maximisée.
Vous pouvez également formuler une variante gourmande de cet algorithme, où vous avez déjàk solutions, et vous voulez trouver un k + 1 e solution qui satisfait toutes les inégalités linéaires et maximise également la distance moyenne L2 de celle-ci à l'autre k solutions. Cela aussi peut être formulé comme un problème de programmation quadratique.
La programmation quadratique est plus difficile que la programmation linéaire, mais il existe des solveurs autonomes qui résoudront les problèmes de programmation quadratique pour vous.
Maximiser la distance L2 par paire minimale, en utilisant QCQP
Enfin, disons que vous voulez que votrek points à disperser dans le sens où vous souhaitez maximiser la distance minimale par paire. En d'autres termes, disons que vous voulez trouver le seuil le plus grand possiblet de telle sorte qu'il est possible de trouver k points X1, … ,Xk∈Rn qui satisfont chacune aux contraintes linéaires, et telles que chaque paire de points soit à distance t Loin les uns des autres: ré(Xje,Xj) ≥ t pour tous i < j . Ensuite, cela peut être formulé comme un programme d'optimisation quadratique avec des contraintes quadratiques, c'est-à-dire QCQP . QCQP est encore plus difficile, mais il existe également des solveurs prêts à l'emploi pour QCQP.
la source
J'ai trouvé une approche pour générer des valeurs absolues.
Supposons que nous ayons les variablesune1 , une2 , b1 et b2 et un tas de contraintes. Nos fonctions objectives ressemblent à: maximiser|une1-une2| + |b1-b2| ; l'idée étant que nous voulons maximiser la norme L1 de ces deux solutions (selon la question d'origine).
On peut introduire des "variables slack" abs_a et abs_b et les contraintes:
et de même pourb1 et b2 . Ces contraintes forcenta bsune être au plus la différence entre une1 et une2 , et peut-être moins. En d'autres termesunebsune ne peut pas être supérieur à la différence maximale entre une1 et une2 .
Il ne reste alors plus qu'à remplacer la fonction objectif: maximisera bsune+ a bsb .
la source