Trouver un ensemble de solutions au maximum différentes en utilisant la programmation linéaire ou une autre technique d'optimisation

8

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?

Ross
la source
1
Calculez le plus petit cube entourant votre région réalisable (s'il n'est pas borné, choisissez une partie délimitée), posez dessus une hypergrille avec la résolution souhaitée et jetez tous les points qui ne respectent pas les restrictions. Cela marcherait-il pour toi?
Raphael
Cela pourrait fonctionner pour moi, bien que je ne sache pas comment je procéderais pour calculer l'hypercube, et je pense que la région réalisable que j'étudie est très non triviale - je m'attends à ce que de nombreux points doivent être ignorés. Mon application particulière comporte des dizaines de milliers de variables / décisions et des centaines de contraintes.
Ross
Une solution de base possible est dans un sommet du polytope. Ne pouvez-vous pas regarder les normales des faces incidentes pour calculer une direction "à travers" le polytope et la suivre jusqu'à la limite de la région réalisable? Cela devrait vous donner des solutions raisonnablement différentes, mais probablement pas les plus différentes.
adrianN
N'utilisez pas de cube. Utilisez un ellipsoïde (en particulier, un petit ellipsoïde contenant le polytope, qui peut être trouvé par la méthode des ellipsoïdes). De cette façon, vous êtes assuré de trouver un nombre raisonnable de points dans la région.
Peter Shor

Réponses:

2

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 soient X1,X2,,Xnet vous avez des contraintes C. Dans chaque itération que vous choisissezc1,c2,,cnR 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 L2norme (distance euclidienne). Ensuite, cela peut être formulé comme un problème de programmation quadratique .

Fondamentalement, vous voulez maximiser la distance au carré (X,y)2=(X1-y1)2++(Xn-yn)2 entre X et y, sous réserve que les deux X et ydoit 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 veux kpoints qui sont diffusés au maximum, cela est également possible. Dites que les points sontX1,,XkRn. Ensuite, vous pouvez maximiser la fonction objectif

je<j(Xje,Xj)2,

c'est-à-dire la fonction

je<j(Xje-Xj)2.

Ceci est une fonction quadratique, et vous avez des contraintes linéaires C 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+1e solution qui satisfait toutes les inégalités linéaires et maximise également la distance moyenne L2 de celle-ci à l'autre ksolutions. 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 votre kpoints à 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,,XkRn qui satisfont chacune aux contraintes linéaires, et telles que chaque paire de points soit à distance t Loin les uns des autres: (Xje,Xj)t pour tous je<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.

DW
la source
1

J'ai trouvé une approche pour générer des valeurs absolues.

Supposons que nous ayons les variables une1, une2, b1 et b2et 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:

unebsune+une1-une20

unebsune-une1+une20

et de même pour b1 et b2. Ces contraintes forcentunebsune ê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: maximiser unebsune+unebsb.

Ross
la source
En fait, ces encodages ne fonctionnent que pour la minimisation des valeurs absolues. Cela ne résout pas mon problème. Plus d'informations ici: lpsolve.sourceforge.net/5.5/absolute.htm
Ross