Ich habe einen Algorithmus, der eine praktikable Lösung für ein lineares Programmierproblem generiert. Es ist jedoch sehr wahrscheinlich, dass dies kein Eckpunkt ist. Dies macht es nicht für die direkte Verwendung als anfänglich realisierbare Lösung für einen gebundenen Simplex-Löser geeignet. Wie kann ich mit dieser Lösung effizient einen Eckpunkt finden, den ich verwenden kann?
Kurz gesagt, wie kann ich die Simplex-Methode von einem möglichen internen Punkt aus starten?
Antworten:
Jedes Buch über lineare Optimierung erklärt die Simplex-Methode als zweistufigen Algorithmus: den ersten zum Finden einer realisierbaren Ecke als Ausgangspunkt und den zweiten zum Finden des Optimums. Der erste verwendet ein doppeltes Problem. Schauen Sie sich zum Beispiel D. Bertsimas und JN Tsitsiklis an: "Einführung in die lineare Optimierung" .
Der Grund, warum man den Zwei-Phasen-Ansatz benötigt, ist, dass es normalerweise schwierig ist, einen realisierbaren Punkt zu finden - in hochdimensionalen Räumen ist die realisierbare Menge im Vergleich zum Beispiel der Einheitsbox sehr klein. Aus Ihrer Frage geht hervor, dass Sie einen anderen Weg haben, um mindestens einen realisierbaren Punkt zu finden. In diesem Fall ist es möglicherweise möglich, aus diesem Punkt einen Scheitelpunkt des realisierbaren Polyeders zu generieren. Eine Idee wäre, den folgenden Ansatz zu verwenden: Jede Ungleichheitsbedingung repräsentiert einen halben Raum, der durch eine Hyperebene getrennt ist. Finden Sie bei einem möglichen Punkt die n + 1 Hyperebenen, die x ∗ am nächsten liegenx∗ n + 1 x∗ und nehmen ihre Kreuzung. Intuitiv sollte dieser Scheitelpunkt machbar sein, obwohl ich zugeben werde, dass man etwas mehr darüber nachdenken müsste.
quelle
Leider funktioniert die Lösung von Wolfgang Bangerth nicht garantiert:
quelle
Es gibt tatsächlich viele verschiedene Ansätze für Phase I in der Simplex-Methode. Insbesondere gibt es Phase-I-Algorithmen, die ursprüngliche Simplex-Simplex-Iterationen verwenden, und andere Phase-I-Algorithmen, die duale Simplex-Iterationen verwenden. Hier ist ein sehr allgemeiner Ansatz, der leicht angepasst werden kann, um eine bekannte realisierbare Lösung zu verwenden. Diese Version verwendet die Dual-Simplex-Methode in Phase I und die Primal-Simplex-Methode in Phase II, aber es gibt eine Variante, die Primal-Simplex-Iterationen in Phase I und Dual-Simplex-Iterationen in Phase II verwendet, die ich am Ende erwähnen werde. Der Ansatz, den ich hier beschreiben werde, wird in vielen Lehrbüchern zur linearen Programmierung diskutiert. Siehe zum Beispiel den Text von Robert Vanderbei .
Angenommen, wir lösen
vorbehaltlich
wobei der Größe von . Nehmen Sie der Einfachheit halber an, dass die Zeilen von linear unabhängig sind (dies kann durch eine rangaufdeckende Faktorisierung erreicht werden).m n A.A m n A
Eine einfache Möglichkeit, dies aus Ihrer ursprünglichen Lösung heraus zu tun, besteht darin, als Basisvariablen diejenigen Variablen auszuwählen, die in der bekannten realisierbaren Lösung am weitesten von ihren Grenzen entfernt sind, und dann zu überprüfen, ob nicht singulär ist. Möglicherweise müssen Sie die Basis ändern, um nicht singulär zu machen . Der Punkt hier ist, dass es viele mögliche Grundlagen gibt, aber diese hat als grundlegende Variablen diejenigen Variablen, die aus Ihrer realisierbaren Lösung richtig zu sein scheinen. B.B B
Lösen Sie die Gleichungen , um die Werte der Grundvariablen zu erhalten.Ax=b
Wir werden dieses Problem lösen, indem wir die Zielfunktion in eine doppelt realisierbare ändern. Subtrahieren Sie für jede nichtbasische Variable an ihrer Untergrenze eine große positive Größe vom Zielfunktionskoeffizienten. Addieren Sie für jede nichtbasische Variable an ihrer Obergrenze eine große positive Größe zum Koeffizienten. Dies stellt sicher, dass das Wörterbuch doppelt machbar ist. M.M M
Der Sinn dieser Modifikation der Zielfunktion besteht darin, auf die ursprüngliche Machbarkeit hinzuarbeiten, aber auch auf die Optimalität in Bezug auf die ursprüngliche Zielfunktion hinzuarbeiten. Sie möchten, dass groß genug ist, um eine doppelte Machbarkeit zu erreichen, aber Sie möchten so viel Einfluss wie möglich auf die ursprüngliche Zielfunktion haben.M
Führen Sie Dual-Simplex-Methoden durch, um eine Basislösung zu erhalten, die sowohl primär realisierbar (alle grundlegenden Variablen innerhalb von Boudns) als auch dual realisierbar (alle reduzierten Kosten haben das gewünschte Vorzeichen). Diese Lösung ist optimal für das Phase-I-Problem.
Ersetzen Sie die modifizierte Phase-I-Zielfunktion durch die ursprüngliche Zielfunktion. Jetzt haben Sie eine grundlegende Lösung, die ursprünglich machbar ist (eine Änderung der Zielfunktion wirkt sich nicht darauf aus), aber doppelt unmöglich ist. Führen Sie ursprüngliche Simplex-Iterationen durch, um zur Optimalität zurückzukehren.
Eine naheliegende Alternative zu diesem Ansatz wäre, die rechte Seite b zu Beginn der Phase I zu modifizieren, in Phase I ursprüngliche Simplex-Iterationen zu verwenden, um zur Optimalität zu gelangen, dann die ursprüngliche rechte Seite für Phase II zurückzusetzen und duale Simplex-Iterationen zu verwenden in Phase II.
quelle
Ich habe nach der Lösung für eine ähnliche Frage gesucht: Für ein sehr großes, spärliches lineares Programm funktioniert nur die mit der Simplex-Methode getestete Arbeit, aber nur, wenn die Standardlösung 0 machbar ist. Der Phase-1-Algorithmus (wie in Linprog von Matlab) scheint schlecht zu sein. Und der Quellcode der ersten Phase ist so komplex, dass er durch einen anderen Algorithmus wie den genetischen Algorithmus ersetzt werden kann. Eine Umgehungsmethode besteht darin, das ursprüngliche Problem linear zu transformieren, sodass in den neuen Variablen die bereitgestellte anfängliche realisierbare Lösung 0 ist, und dies 0 wird von Phase eins verwendet, ohne eine eigene Methode zu verwenden, um einen anderen Ausgangspunkt zu finden.
Beim Testen dieser Methode wird schrittweise durch linprog.m, simplex.m, simplexpresolve.m und simplexphaseone.m in Fällen, in denen nur Ungleichheitsbeschränkungen verwendet werden, bestätigt, dass die Standard 0 für die ursprünglichen Variablen verwendet wird, wobei Die Slack-Variablen nehmen die Unterschiede auf. So kann die lineare Transformation x0 in Simplex schleichen, was absichtlich verhindert, dass der Benutzer x0 bereitstellt. Sie können dann die Meldung "Der Standardstartpunkt ist machbar, Phase 1 überspringen" sehen. Auf der anderen Seite kann GA normalerweise eine Lösung in der Nähe des linearen Programms bis zu 0,01 Prozent finden, indem es das Doppelte oder Dreifache verwendet. Daher ist es möglicherweise nicht sinnvoll, diese Einschränkungen, Ziele und Grenzen linear zu transformieren, insbesondere wenn die Einschränkungen künstlich erstellt werden .
quelle