In den folgenden Abschnitten finden Sie eine Einführung in OR-Tools für Python:
- Was ist ein Optimierungsproblem?
- Optimierungsproblem in Python lösen
- Weitere Python-Beispiele
- Die Art des zu lösenden Problems identifizieren
Was ist ein Optimierungsproblem?
Das Ziel der Optimierung besteht darin, aus einer Vielzahl möglicher Lösungen die beste Lösung für ein Problem zu finden. (Manchmal sind Sie damit zufrieden, jede praktikable Lösung zu finden. Das ist auch mit OR-Tools möglich.)
Hier ist ein typisches Optimierungsproblem. Angenommen, ein Versandunternehmen liefert Pakete mit einer LKW-Fuhrpark an seine Kunden. Das Unternehmen muss täglich LKWs Pakete zuweisen und dann für jeden LKW eine Route für die Zustellung der Pakete auswählen. Für jede mögliche Zuweisung von Paketen und Routen fallen Kosten an, die auf der Gesamtstrecke für die LKWs und eventuell auch auf anderen Faktoren basieren. Das Problem besteht darin, die Zuweisungen von Paketen und Routen mit den geringsten Kosten auszuwählen.
Wie alle Optimierungsprobleme weist dieses Problem folgende Elemente auf:
Das Ziel: die Menge, die Sie optimieren möchten Im obigen Beispiel besteht das Ziel darin, Kosten zu minimieren. Zum Einrichten eines Optimierungsproblems müssen Sie eine Funktion definieren, die den Wert des Ziels für jede mögliche Lösung berechnet. Dies wird als Zielfunktion bezeichnet. Im vorherigen Beispiel würde die Zielfunktion die Gesamtkosten für eine Zuweisung von Paketen und Routen berechnen.
Eine optimale Lösung ist eine Lösung, für die der Wert der Zielfunktion am besten ist. „Am besten“ kann entweder ein Höchstwert oder ein Minimum sein.
Einschränkungen: Einschränkungen für die Anzahl möglicher Lösungen basierend auf den spezifischen Anforderungen des Problems. Wenn das Versandunternehmen beispielsweise keine Pakete mit einem bestimmten Gewicht LKWs zuweisen kann, würde dies eine Einschränkung der Lösungen darstellen.
Eine praktische Lösung ist eine Lösung, die alle gegebenen Einschränkungen für das Problem erfüllt, aber nicht unbedingt optimal ist.
Der erste Schritt zur Lösung eines Optimierungsproblems besteht darin, das Ziel und die Einschränkungen zu identifizieren.
Optimierungsproblem in Python lösen
Als Nächstes geben wir ein Beispiel für ein Optimierungsproblem und zeigen, wie es in Python eingerichtet und gelöst wird.
Beispiel für eine lineare Optimierung
Einer der ältesten und am häufigsten verwendeten Optimierungsbereiche ist die lineare Optimierung (oder lineare Programmierung), bei der die Zielfunktion und die Einschränkungen als lineare Ausdrücke geschrieben werden können. Hier ist ein einfaches Beispiel für diese Art von Problem.
3x + y
unterliegt den folgenden Einschränkungen:
- 0 ≤
x
≤ 1 - 0 ≤
y
≤ 2 x + y
≤ 2
Die Zielfunktion in diesem Beispiel ist 3x + y
.
Sowohl die Zielfunktion als auch die Einschränkungen werden durch lineare Ausdrücke vorgegeben, was dies zu einem linearen Problem macht.
Hauptschritte zur Lösung des Problems
Die grundlegenden Schritte zum Einrichten und Lösen eines Problems sind für jede Sprache gleich:
- Importieren Sie die erforderlichen Bibliotheken,
- Deklariere den Solver,
- Erstellen Sie die Variablen,
- Definieren Sie die Einschränkungen,
- Definieren Sie die Zielfunktion,
- Rufen Sie den Solver auf und
- Zeige die Ergebnisse an.
Python-Programm
In diesem Abschnitt wird ein Python-Programm beschrieben, das das Problem einrichtet und löst.
Und so gehts:
- Importieren Sie die erforderlichen Bibliotheken.
from ortools.init.python import init from ortools.linear_solver import pywraplp
- Deklariere den Solver.
# Create the linear solver with the GLOP backend. solver = pywraplp.Solver.CreateSolver("GLOP") if not solver: print("Could not create solver GLOP") return
pywraplp
ist ein Python-Wrapper für den zugrunde liegenden C++-Resolver. Das Argument"GLOP"
gibt GLOP an, den linearen Löser mit OR-Tools. - Erstellen Sie die Variablen.
# Create the variables x and y. x_var = solver.NumVar(0, 1, "x") y_var = solver.NumVar(0, 2, "y") print("Number of variables =", solver.NumVariables())
- Definieren Sie die Einschränkungen.
Die ersten beiden Einschränkungen,
0
≤x
≤1
und0
≤y
≤2
, wurden bereits durch die Definitionen der Variablen festgelegt. Der folgende Code definiert die Einschränkungx + y
≤2
:infinity = solver.infinity() # Create a linear constraint, x + y <= 2. constraint = solver.Constraint(-infinity, 2, "ct") constraint.SetCoefficient(x_var, 1) constraint.SetCoefficient(y_var, 1) print("Number of constraints =", solver.NumConstraints())
Die MethodeSetCoefficient
legt die Koeffizienten vonx
undy
im Ausdruck für die Einschränkung fest. - Definieren Sie die Zielfunktion.
# Create the objective function, 3 * x + y. objective = solver.Objective() objective.SetCoefficient(x_var, 3) objective.SetCoefficient(y_var, 1) objective.SetMaximization()
Die MethodeSetMaximization
deklariert dies als ein Maximierungsproblem. - Rufen Sie den Solver auf und zeigen Sie die Ergebnisse an.
print(f"Solving with {solver.SolverVersion()}") result_status = solver.Solve() print(f"Status: {result_status}") if result_status != pywraplp.Solver.OPTIMAL: print("The problem does not have an optimal solution!") if result_status == pywraplp.Solver.FEASIBLE: print("A potentially suboptimal solution was found") else: print("The solver could not solve the problem.") return print("Solution:") print("Objective value =", objective.Value()) print("x =", x_var.solution_value()) print("y =", y_var.solution_value())
Programm abschließen
Das vollständige Programm wird unten angezeigt.
from ortools.init.python import init
from ortools.linear_solver import pywraplp
def main():
print("Google OR-Tools version:", init.OrToolsVersion.version_string())
# Create the linear solver with the GLOP backend.
solver = pywraplp.Solver.CreateSolver("GLOP")
if not solver:
print("Could not create solver GLOP")
return
# Create the variables x and y.
x_var = solver.NumVar(0, 1, "x")
y_var = solver.NumVar(0, 2, "y")
print("Number of variables =", solver.NumVariables())
infinity = solver.infinity()
# Create a linear constraint, x + y <= 2.
constraint = solver.Constraint(-infinity, 2, "ct")
constraint.SetCoefficient(x_var, 1)
constraint.SetCoefficient(y_var, 1)
print("Number of constraints =", solver.NumConstraints())
# Create the objective function, 3 * x + y.
objective = solver.Objective()
objective.SetCoefficient(x_var, 3)
objective.SetCoefficient(y_var, 1)
objective.SetMaximization()
print(f"Solving with {solver.SolverVersion()}")
result_status = solver.Solve()
print(f"Status: {result_status}")
if result_status != pywraplp.Solver.OPTIMAL:
print("The problem does not have an optimal solution!")
if result_status == pywraplp.Solver.FEASIBLE:
print("A potentially suboptimal solution was found")
else:
print("The solver could not solve the problem.")
return
print("Solution:")
print("Objective value =", objective.Value())
print("x =", x_var.solution_value())
print("y =", y_var.solution_value())
print("Advanced usage:")
print(f"Problem solved in {solver.wall_time():d} milliseconds")
print(f"Problem solved in {solver.iterations():d} iterations")
if __name__ == "__main__":
init.CppBridge.init_logging("basic_example.py")
cpp_flags = init.CppFlags()
cpp_flags.stderrthreshold = True
cpp_flags.log_prefix = False
init.CppBridge.set_flags(cpp_flags)
main()
Programm durchführen
Sie können das obige Programm wie folgt ausführen:
- Kopieren Sie den obigen Code, fügen Sie ihn in eine neue Datei ein und speichern Sie ihn als
program.py
. - Öffnen Sie ein Befehlsfenster und wechseln Sie in das Verzeichnis, in dem Sie
program.py
gespeichert haben. Geben Sie in der Eingabeaufforderung Folgendes ein:python relative/path/to/program.py
, wobeirelative/path/to/
der Pfad zu dem Verzeichnis ist, in dem Sie das Programm gespeichert haben.
Das Programm gibt die Werte von x
und y
zurück, mit denen die Zielfunktion maximiert wird:
Solution:
x = 1.0
y = 1.0
Weitere Python-Beispiele
Weitere Python-Beispiele, die veranschaulichen, wie sich verschiedene Arten von Optimierungsproblemen lösen lassen, finden Sie unter Beispiele.
Die Art des zu lösenden Problems identifizieren
Es gibt auf der Welt viele verschiedene Arten von Optimierungsproblemen. Für jede Art von Problem gibt es unterschiedliche Ansätze und Algorithmen, um eine optimale Lösung zu finden.
Bevor Sie mit dem Schreiben eines Programms zur Lösung eines Optimierungsproblems beginnen können, müssen Sie ermitteln, mit welcher Art von Problem Sie es zu tun haben, und dann einen geeigneten Resolver auswählen – einen Algorithmus zur Suche nach einer optimalen Lösung.
Nachfolgend finden Sie eine kurze Übersicht über die Arten von Problemen, die mit ODER-Tools gelöst werden können. Außerdem finden Sie Links zu den Abschnitten in diesem Leitfaden, in denen erklärt wird, wie die einzelnen Problemtypen gelöst werden können.
- Lineare Optimierung
- Optimierung der Einschränkung
- Gemischte Ganzzahloptimierung
- Zuweisung
- Planung
- Verpackung
- E-Mail-Routing
- Netzwerkflüsse
Lineare Optimierung
Wie Sie im vorherigen Abschnitt gelernt haben, besteht ein lineares Optimierungsproblem darin, dass die Zielfunktion und die Einschränkungen lineare Ausdrücke in den Variablen sind.
Der primäre Löse in OR-Tools für diese Art von Problem ist der Lösungslöser für lineare Optimierung, der tatsächlich ein Wrapper für mehrere verschiedene Bibliotheken für die lineare und gemischte Ganzzahl-Optimierung ist, einschließlich Bibliotheken von Drittanbietern.
Weitere Informationen zur linearen Optimierung
Gemischte Ganzzahloptimierung
Ein Problem mit der Optimierung von gemischten Ganzzahlen liegt vor, wenn einige oder alle Variablen Ganzzahlen sein müssen. Ein Beispiel hierfür ist das Zuweisungsproblem, bei dem eine Gruppe von Mitarbeitern einer Reihe von Aufgaben zugewiesen werden muss. Für jeden Worker und jede Aufgabe definieren Sie eine Variable, deren Wert 1 ist, wenn der jeweilige Worker der angegebenen Aufgabe zugewiesen ist, und andernfalls 0. In diesem Fall können die Variablen nur die Werte 0 oder 1 annehmen.
Weitere Informationen zur gemischten Ganzzahl-Optimierung
Einschränkungsoptimierung
Die Einschränkungsoptimierung oder Constraint Programming (CP) identifiziert aus einer sehr großen Anzahl von Kandidaten machbare Lösungen, bei denen das Problem in Bezug auf beliebige Einschränkungen modelliert werden kann. CP basiert auf Machbarkeit (Finden einer durchführbaren Lösung) und nicht auf Optimierung (Finden einer optimalen Lösung) und konzentriert sich auf die Einschränkungen und Variablen anstatt auf die objektive Funktion. Mit CP lassen sich jedoch Optimierungsprobleme lösen, indem Sie einfach die Werte der Zielfunktion für alle möglichen Lösungen vergleichen.
Weitere Informationen zur Einschränkungsoptimierung
Assignment
Bei Zuweisungsproblemen wird einer Gruppe von Agenten (z. B. Workern oder Maschinen) eine Gruppe von Aufgaben zugewiesen. Für die Zuweisung der einzelnen Agents zu einer bestimmten Aufgabe fallen feste Kosten an. Das Problem besteht darin, die Zuweisung mit den geringsten Gesamtkosten zu finden. Zuweisungsprobleme sind eigentlich ein Sonderfall von Netzwerkflussproblemen.
Weitere Informationen zu Zuweisungen
Einpacken
Beim Bin-Packen wird eine Reihe von Objekten unterschiedlicher Größe in Container mit unterschiedlichen Kapazitäten gepackt. Das Ziel besteht darin, je nach Kapazität der Container so viele Objekte wie möglich zu verpacken. Ein Sonderfall ist das Knapsack-Problem, bei dem es nur einen Container gibt.
Weitere Informationen zum Bin-Packing
Wird geplant
Bei Planungsproblemen werden Ressourcen zugewiesen, um eine Reihe von Aufgaben zu bestimmten Zeiten auszuführen. Ein wichtiges Beispiel ist das Jobgeschäftsproblem, bei dem mehrere Jobs auf mehreren Maschinen verarbeitet werden. Jeder Job besteht aus einer Abfolge von Aufgaben, die in einer bestimmten Reihenfolge ausgeführt werden müssen, wobei jede Aufgabe auf einer bestimmten Maschine verarbeitet werden muss. Das Problem besteht darin, einen Zeitplan zuzuweisen, damit alle Jobs in so kurzer Zeit wie möglich abgeschlossen werden.
Weitere Informationen zur Terminplanung
Routing
Routing-Probleme beinhalten die Suche nach den optimalen Routen für eine Fahrzeugflotte, die ein Netzwerk durchqueren kann, definiert durch einen gerichteten Graph. Das unter Was ist ein Optimierungsproblem? beschriebene Problem beim Zuweisen von Paketen zu Lieferwagen ist ein Beispiel für ein Routingproblem. Ein weiteres Problem ist das Problem der reisenden Verkäufer.
Weitere Informationen zum Routing
Netzwerkflüsse
Viele Optimierungsprobleme können durch einen gerichteten Graphen dargestellt werden, der aus Knoten und gerichteten Bögen dazwischen besteht. Beispielsweise können Transportprobleme, bei denen Waren über ein Bahnnetz transportiert werden, durch ein Diagramm dargestellt werden, in dem die Bögen Bahnlinien und die Knoten Verteilungszentren sind.
Beim Problem mit dem maximalen Fluss hat jeder Bogen eine maximale Kapazität, die über ihn transportiert werden kann. Das Problem besteht darin, die zu versendende Warenmenge über jeden Bogen so festzulegen, dass die insgesamt zu transportierende Menge so groß wie möglich ist.