L'algorithme simplex parcourt goulûment les coins d'un polytope pour trouver la solution optimale au problème de programmation linéaire. En conséquence, la réponse est toujours un coin du polytope. Les méthodes de point intérieur parcourent l'intérieur du polytope. Par conséquent, lorsqu'un plan entier du polytope est optimal (si la fonction objectif est exactement parallèle au plan), nous pouvons obtenir une solution au milieu de ce plan.
Supposons que nous voulons plutôt trouver un coin du polytope. Par exemple, si nous voulons faire une correspondance maximale en la réduisant à une programmation linéaire, nous ne voulons pas obtenir une réponse consistant en "la correspondance contient 0,34% du bord XY et 0,89% du bord AB et ...". Nous voulons obtenir une réponse avec des 0 et des 1 (ce que le simplex nous donnerait puisque tous les coins se composent de 0 et de 1). Existe-t-il un moyen de le faire avec une méthode de point intérieur qui garantit de trouver des solutions de coin exactes en temps polynomial? (par exemple on peut peut-être modifier la fonction objectif pour privilégier les coins)
Réponses:
Vous voudrez peut-être lire le document:
la source
Bien que la question en général ait un sens, il est étrange que vous choisissiez la correspondance maximale à titre d'exemple, car il existe de nombreux algorithmes (flux max pour la correspondance bipartite de cardinalité maximale, algorithme d'Edmonds pour la correspondance non bipartite et algorithme hongrois pour la correspondance bipartite de poids maximal) qui donneront toutes des solutions de vertex entières au problème.
la source
Pour le manque de détails, ce n'est qu'un commentaire plus long:
L'algorithme de temps polynomial de Karmarkar ne se déplace que près du bord. À la fin, il trouve une solution de base appropriée (par exemple coin) qui est optimale en utilisant un schéma de purification ¹. Vous pouvez utiliser cette technique ou une technique similaire pour vous déplacer dans un coin d'un plan.
¹ Je ne peux pas le distinguer dans le papier original de Karmarkar . Ma référence est "Lineare Optimierung und Netzwerkoptimierung" (anglais: optimisation linéaire et réseau) par Hamacher et Klamroth qui a côte à côte du texte allemand et anglais.
la source
Oui, il existe une méthode simple et je l'ai implémentée en C ++ pour combiner la vitesse des méthodes de point intérieur avec la précision des méthodes simplexes (en utilisant le raffinement itératif de l'inverse de la matrice de base, je peux obtenir des précisions de 1 partie sur 10 ^ 15 et mieux sur des matrices de contraintes denses avec plus de 1000 variables et contraintes).
La clé se trouve dans la méthode simplex que vous utilisez. Supposons que la méthode simplex dispose d'un mécanisme de refactorisation d'une base (par exemple, après que des erreurs d'arrondi cumulatives la rendent nécessaire), et que cette méthode de refactorisation recrée simplement une matrice inverse de base pour une base qui contient toute la liste souhaitée de variables de base. Supposons en outre que même si la base souhaitée ne peut pas être recréée en totalité, que l'algorithme simplex est capable de continuer à partir d'une base qui contient 95% de la base cible, alors la réponse est très simple.
Tout ce que vous avez à faire est de prendre la solution de votre méthode de point intérieur, d'éliminer la variable dont les valeurs de solution primaires sont supposées être nulles par relâchement complémentaire, et étant donné une taille de base dans le problème simplex de b, prenez les variables b à l'intérieur solution ponctuelle avec les valeurs les plus élevées (ou autant qu'il existe de valeurs non nulles si elles sont inférieures à b), et refactoriser la base du simplexe pour contenir ces b variables. Continuez ensuite la méthode simplex jusqu'à ce qu'elle soit résolue. Puisque vous commencez le problème simplex près de l'arrivée, cela est généralement très rapide.
la source