Obwohl die gemischte ganzzahlige lineare Programmierung (MILP) in der Tat NP-vollständig ist, gibt es lösbare (nicht-triviale) Instanzen der gemischten ganzzahligen linearen Programmierung.
NP-complete bedeutet, dass die gemischte ganzzahlige lineare Programmierung wie folgt lautet:
a) lösbar in polynomialer Zeit mit einer nichtdeterministischen Turingmaschine (der NP-Teil)
b) auf 3-SAT reduzierbare Polynomzeit (der komplette Teil; für den Rest der Diskussion ist dieser Teil wirklich egal)
O ( 2n)n
Diese Aussage bedeutet nicht, dass "kleine" Instanzen unlösbar sind. Leider kann ich keine genaue Aussage darüber machen, was klein für eine MILP-Instanz bedeutet. Ich löse routinemäßig Probleme mit 3.000 oder mehr binären Entscheidungsvariablen. Abhängig von der Problemformulierung können die Probleme weniger als 0,01 Sekunden dauern (was bei relativ unterbeschränkten Problemen der Fall ist) oder länger als eine Stunde (was bei Problemen der Fall ist, bei denen viele Einschränkungen aktiv sind), da die Probleme zu sein scheinen günstige Struktur haben. Ich kann sagen, dass hochmoderne LP-Löser LPs mit mehreren Millionen kontinuierlichen Entscheidungsvariablen lösen können, und dass es ohne spezielle Struktur höchst unwahrscheinlich ist, dass ein Problem irgendwo zwischen 1.000 und 10 auftritt.
Wenn Sie glauben, dass Sie eine lösbare Instanz von MILP haben, sollten Sie einen Branch-and-Bound- oder Branch-and-Cut-Algorithmus verwenden. Die besten Implementierungen sind CPLEX und Gurobi . Beide sind kommerzielle Produkte, die eine kostenlose akademische Lizenz haben, wenn Sie genug suchen. Wenn Sie wirklich einen Open Source-Löser benötigen, sind Projekte in der COIN-OR- Community besser geeignet, obwohl die Quellpakete manchmal heikel sein können. Die relevantesten Projekte wären der CBC-Branch-and-Cut-Solver , der SYMPHONY-Solver , der BCP-Branch- and -Cut-Price-Solver und der ABACUS-Branch-and-Cut-Solver . Alle diese Projekte erfordern mehrere Pakete von COIN-ORAufgrund seiner modularen Struktur.
Wenn Sie die Möglichkeit haben möchten, mehrere Löser auszuprobieren, verwenden Sie am besten die Open Solver-Oberfläche von COIN-OR . Beachten Sie, dass Sie in Teilen dieser Benutzeroberfläche nur grundlegende Solver-Optionen festlegen können. Um erweiterte Optionen für Solver festzulegen, sollten Sie die Mailing-Listen von COIN-OR zu Rate ziehen, um weitere Informationen zu erhalten. Die kommerziellen MILP-Löser sind VIEL (manchmal um eine Größenordnung oder mehr) schneller als die Open-Source-Löser. Eine weitere Option für das Prototyping ist die Verwendung einer algebraischen Modellierungssprache wie GAMS oder AMPL . Beide Softwarepakete sind kommerziell, verfügen jedoch über Testversionen, die für kleine Problemfälle verwendet werden können. Für größere Problemfälle können Sie GAMS- oder AMPL-Dateien an sendenZu lösender NEOS-Server ; Dieser Server ist für die Öffentlichkeit zugänglich.
Wenn Sie über eine ausreichend große Instanz von MILP verfügen, funktioniert keiner dieser Solver ordnungsgemäß. Sie können die Ganzzahlvariablen zu kontinuierlichen Variablen lockern, das Problem lösen und dann zur nächsten Auflistung von Ganzzahlvariablen runden, die eine praktikable Lösung Ihrer Probleminstanz darstellt. Eine optimale Lösung der LP-Relaxation Ihrer MILP gibt Ihnen eine Untergrenze für den optimalen Zielfunktionswert Ihrer MILP (natürlich unter der Annahme einer Minimierung), und eine durchführbare Lösung Ihrer MILP gibt Ihnen eine Obergrenze für das optimale Ziel Funktionswert Ihrer MILP.
Wenn Sie wirklich Glück haben und Ihre Constraint-Matrix völlig unimodular ist , können Sie mit einem LP-Solver ganzzahlige Lösungen für Ihre MILP generieren und Ihr Problem trotz seiner Größe effizient lösen. Andere Problemklassen haben schnelle Approximationsalgorithmen, wie z. B. Probleme mit dem Rucksack und Probleme beim Schneiden von Material . Spezialisierte MILP-Zerlegungsalgorithmen gibt es auch für Probleme, die eine spezielle Struktur haben, obwohl ich mit den Einzelheiten nicht vertraut bin, da diese Themen etwas spezialisiert sind und außerhalb des Geltungsbereichs meiner Arbeit liegen.
Mir ist kein vollständig polynomielles Zeitnäherungsschema (FPTAS) speziell für MILP bekannt, obwohl es ein FPTAS einer Problemklasse gibt, die MILP enthält (siehe dieses Dokument)). Meine Empfehlung wäre, einen der oben genannten linearen Programmierlöser mit gemischten ganzen Zahlen in Verbindung mit einem Zeitlimit und geeigneten Toleranzen für Optimalitätslücken zu verwenden. Wenn Sie dies tun, erhalten Sie die bestmögliche, realisierbare Lösung für Ihre MILP innerhalb des Zeitlimits. Wenn der Solver vor dem Zeitlimit erfolgreich beendet wird, ist die realisierbare Lösung innerhalb der von Ihnen festgelegten Toleranzen für die Optimalitätslücke optimal. Diese Vorgehensweise würde Ihnen immer noch Grenzen für die Qualität der Lösung setzen, da Ihre realisierbare Lösung eine Obergrenze ist und der Löser Ihnen eine angemessene Untergrenze geben könnte. Es wäre nicht garantiert, dass die Schranke innerhalb einer bestimmten faktoroptimalen Lösung liegt, aber andererseits wird jedes FPTAS teurer, wenn die Annäherung besser wird.
Das Wichtigste, was Sie tun können, bevor Sie sich für eine MILP-Formulierung entscheiden, ist, die stärkste Formulierung auszuwählen, die Sie finden können. Tipps zur Auswahl starker Formulierungen finden Sie unter Einführung in die lineare Optimierung von Bertsimas und Tsitsiklis. Die Hauptidee besteht darin, eine Formulierung auszuwählen, deren Bedingungen ein Polytop definieren, das so nahe wie möglich an der konvexen Hülle der Formulierung liegt (siehe auch diese Kursnotizen ). Die Auswahl einer starken Formulierung kann einen großen Unterschied in der Zeit bedeuten, die zur Lösung eines Problems benötigt wird.