Optimierung mit Pyomo: Ein vollständiger Schritt-für-Schritt-Leitfaden

Optimierung ist ein grundlegendes Werkzeug, das in verschiedenen Branchen und Disziplinen verwendet wird, um unter gegebenen Einschränkungen die bestmöglichen Entscheidungen zu treffen. Egal ob es den Kosten in einem Supply-Chain-System minimieren geht, die Effizienz in Energiesystemen maximieren ist oder optimalen Parametern in Maschinenlernmodellen finden, Optimierungstechniken sind unerlässlich.

Python, bekannt für seine Einfachheit und Vielseitigkeit, bietet leistungsstarke Bibliotheken für Optimierungsprobleme. Dabei hebt sich Pyomo als umfassende und flexible Bibliothek hervor, die Benutzern erlaubt, komplexe Optimierungsmodelle einfach definitions- und lösbar zu machen.

In diesem Lehrbuch werden wir Pyomo von der Grundisierung an erkunden. Wir werden alles behandeln, von der Installation und Einrichtung von Lösern bis zu der Formulierung und Lösung verschiedener Optimierungsprobleme!

Untersuchung von Möglichen Lösungen in der linearen Programmierung. Bild von Autor.

Was ist Pyomo?

Pyomo ist eine Open-Source-Bibliothek zum Aufbau und Lösen von Optimierungsmodellen mittels Python. Es ermöglicht Ihnen, Optimierungsmodelle auf eine mathematisch präzise und für Python-Programmierer intuitiv syntaktische Weise zu definieren. Es unterstützt eine breite Palette von Problemtypen, einschließlich:

  1. Lineare Programmierung (LP): LP beinhaltet die Optimierung einer linearen Zielfunktion unter linearen Gleich- und Ungleichheitsbedingungen. Es wird breit für Ressourcenallokation, Planung und Finanzierungsprobleme verwendet.
  2. Nichtlineare Programmierung (NLP): NLP befasst sich mit der Optimierung einer nichtlinearen Zielfunktion unter nichtlinearen Bedingungen. Es wird oft in der Ingenieurwissenschaft und der Wirtschaft für komplexere Systeme verwendet, wo die Beziehungen nichtlinear sind.
  3. Mixed-Integer Programming (MIP): MIP beinhaltet Optimierungsprobleme, bei denen einige Variablen auf Ganzzahlen beschränkt sind, während andere kontinuierliche Werte annehmen können. Dies ist nützlich in Szenarien wie Supply-Chain-Design oder Projektplanung, wo Entscheidungen diskrete sind (z.B., ein/aus).
  4. Zufälliges Programmieren: Zufälliges Programmieren behandelt Optimierungsprobleme, bei denen einige Elemente ungewiss sind und als Zufallsvariablen modelliert werden. Es wird häufig in der Finanzen und Supply-Chain-Management angewendet, um Entscheidungen unter Unsicherheit zu optimieren.
  5. Dynamische Optimierung: Dynamische Optimierung konzentriert sich auf die Optimierung von Entscheidungsvariablen im Verlauf der Zeit, typischerweise in dynamisch entwickelten Systemen. Sie wird in Bereichen wie Prozesssteuerung, Robotik und Wirtschaftswissenschaften zur Verwaltung zeitabhängiger Prozesse verwendet.

Funktionen von Pyomo

Nun, da wir Pyomo besser verstehen, lassen uns eine Übersicht über einige seiner wichtigsten Funktionen machen. 

Flexibilität und Erweiterbarkeit

Die Flexibilität von Pyomo ergibt sich aus seiner Fähigkeit, komplexe Beziehungen mit standardmäßigen Python-Konstrukten zu modellieren. Es integriert sich mit verschiedenen Open-Source- und kommerziellen Solver, was es einfach macht, viele Optimierungsprobleme zu lösen.

Pythonische Syntax

Pyomo-Modelle basieren auf Python und werden mit standardmäßiger Python-Syntax geschrieben. Dies macht die Lernkurve sanft für diejenigen, die mit Python vertraut sind, und ermöglicht es Ihnen, die umfangreichen Bibliotheken von Python innerhalb Ihrer Modelle zu nutzen.

Starke Gemeinschaft und Dokumentation

Pyomo hat eine robuste Benutzer-Community und umfassende Dokumentation, die Beispiele und Tutorials enthält, um Benutzern auf allen Ebenen zu helfen.

Anwendungsfälle für Pyomo

Pyomo hat eine Vielzahl von Anwendungen in der realen Welt. Hier sind einige davon:

1. Optimierung der Lieferkette

Supply-Chain-Optimierung beinhaltet die Verbesserung der Logistik, die Inventar-Bewirtschaftung und die Schaffung effizienter Produktionspläne.

Dies kann u. a. die Minimierung der Transportkosten, die Optimierung der Lagerorte oder die Ausgleichung von Angebot und Nachfrage beinhalten.

Zum Beispiel müsste eine Firma möglicherweise den Kundenbedarf in mehreren Regionen erfüllen, während die Frachtkosten minimiert und die Lagerbestände jedes Distributionszentrums aufrecht gehalten werden.

2. Finanzmodellierung

In der Finanzmodellierung verwendet man Optimierungsmethoden, um Ressourcen wie Kapital optimal zu allokieren, um die Renditen zu maximieren und Risiken zu minimieren.

Dies kann die Portfolioptimierung beinhalten, bei der Investoren zwischen verschiedenen Anlageinstrumenten eine Kombination wählen, um ein optimales Risiko-Gewinn-Verhältnis zu erzielen und sich dabei an Grenzen wie Budgetbegrenzungen, regulatorischen Vorschriften oder Risikotoleranz zu halten.

Finanzmodellierung stellt sicher, dass Finanzstrategien mit langfristigen Zielen übereinstimmen und potenzielle Risiken gemindert werden.

3. Energiesysteme

Die Optimierung in Energiesystemen konzentriert sich auf die Maximierung der Effizienz von Stromerzeugung, -verteilung und -verbrauch.

Dies kann die Bestimmung der optimalen Mischung von Energiequellen (z. B. erneuerbare vs. nicht erneuerbare) beinhalten, während die Brennstoffkosten minimiert, Emissionsgrenzen eingehalten und sich an schwankende Nachfrage angepasst wird.

Diese Art der Optimierung spielt eine zentrale Rolle im Netzmanagement, im Betrieb von Kraftwerken und bei der Reduzierung von Umweltauswirkungen.

4. Maschinelles Lernen und Datenwissenschaft

Optimierung ist zentral für viele maschinelles Lernen und datenwissenschaftliche Aufgaben, wie z. B. Hyperparameter-Optimierung und Merkmalsauswahl.

Beim Hyperparameter-Tuning helfen Optimierungsalgorithmen, die beste Modelkonfiguration zu finden, um die vorhersageperformance zu verbessern.

Feature Selection, eine weitere wichtige Aufgabe, umfasst die Identifizierung der wichtigsten Merkmale, die zur Genauigkeit eines Modells beitragen, was zu einer Vereinfachung und Verbesserung der Effizienz führt.

Nun, da der Kontext festgelegt ist, lassen Sie uns praktisch greifen und Pyomo auf einige Beispielmodellierungsprobleme anwenden!

Pyomo einrichten

Bevor wir uns der Modellierung widmen, müssen wir unsere Arbeitsumgebung einrichten, indem wir Pyomo installieren und einen angepassten Löser auswählen.

1. Voraussetzungen

Um pyomo zu verwenden, müssen Sie Python 3.6 oder höher haben. Pyomo kann über pip installiert werden.

pip install pyomo

Dieser Leitfaden wurde mit der Pyomo-Version 6.8.0 erstellt.

import pyomo print(pyomo.__version__)

Ausgabe:

>>> 6.8.0

2. Auswahl und Installation des richtigen Lösers

In der Optimierung sind Lösersysteme unerlässlich, da sie die Algorithmen sind, die die optimale Lösung für das von Ihnen definierte Problem finden. Je nachdem, welcher Problemtyp (z.B. lineare, nichtlineare, integrierte) vorliegt, sind verschiedene Lösersysteme besser geeignet. Pyomo ist ein Modellierungswerkzeug, das auf externen Lösern aufbaut, um die tatsächlichen Rechnungen durchzuführen.

Lassen Sie uns einige der am häufigsten verwendeten Lösersysteme durchgehen.

Open-Source-Lösersysteme

1. GLPK (GNU Linear Programming Kit)

GLPK ist ein populäres Werkzeug zur Lösung linearer Programmierungsprobleme (LP) und gemischt-integer Programmierungsprobleme (MIP).

Es ist eine hervorragende Wahl für grundlegende lineare Optimierungsaufgaben und wird breit in wissenschaftlichen und industriellen Anwendungen verwendet.

Installation

brew install glpk
  • Linux: 
sudo apt-get install glpk-utils
2. CBC (Coin-or Branch and Cut)

CBC ist ein Open-Source-Lösungsalgorithmus für lineare Programmierungs- (LP) und gemischt-integer Programmierungsprobleme (MIP).

Er bietet fortschrittliche Funktionen und bessere Leistung im Vergleich zu GLPK, was ihn zu einer robusten Option für komplexere Optimierungsaufgaben macht.

CBC kann über den Conda-Paketmanager installiert werden.

conda install -c conda-forge coincbc
3. IPOPT (Interior Point OPTimizer)

IPOPT ist ein leistungsstarker Löser, der für großskalige nichtlineare Programmierungsprobleme (NLP) entwickelt wurde. 

Er ist besonders gut geeignet, um komplexe, nichtlineare Modelle zu behandeln, was ihn zu einer hervorragenden Wahl für Probleme außerhalb der linearen Optimierung macht. 

IPOPT kann über den Conda-Paketmanager installiert werden.

!conda install -c conda-forge ipopt

Kommerzielle Lösungen

1. CPLEX

CPLEX ist ein fortschrittlicher Optimierungs-Löser, der effizient lineare Programmierungsprobleme (LP), gemischte Ganzzahlprogrammierungsprobleme (MIP) und quadratische Programmierungsprobleme (QP) bearbeitet.

Es erfordert eine Lizenz von IBM, ist jedoch für akademische Nutzer kostenlos verfügbar und somit eine hervorragende Wahl für Forschung und Bildungszwecke.

2. Gurobi

Gurobi ist ein führender kommerzieller Löser, der für seine Schnelligkeit und Effizienz bei der Lösung von LP, MIP, QP und nichtlinearen Programmierungsproblemen (NLP) bekannt ist.

Wie CPLEX erfordert es eine Lizenz, bietet aber akademischen Nutzern kostenlosen Zugang. Daher ist es ein Industriestandard-Tool für fortgeschrittene Optimierung.

Open-Source- versus kommerzielle Löser

Open-source-Lösungsmethoden wie GLPK und CBC sind kostenlos und genügen für die meisten grundlegenden Optimierungsanforderungen. Sie sind hervorragende Wahl für kleinere Projekte und für pädagogische Zwecke.

Allerdings bieten kommerzielle Lösungsmethoden wie CPLEX und Gurobi in der Regel bessere Leistung, insbesondere für größere und komplexere Probleme. Diese Lösungsmethoden verfügen über fortschrittliche Features, einschließlich verbesserter quadratischer und nichtlinearer Programmierungsunterstützung und sind optimiert für großskalige Industriestandards.

Obwohl open-source-Lösungsmethoden viele alltägliche Optimierungsaufgaben bewältigen können, sind kommerzielle Lösungsmethoden oft eine bessere Wahl, wenn es um komplexere, hochleistungsorientierte Anforderungen geht.

Bitte beachten Sie, dass kommerzielle Lösungsmethoden Lizenzen erfordern, obwohl sie akademischen Nutzern kostenlos zur Verfügung stehen.

Jetzt sehen wir, wie man in Pyomo einen Löser einrichtet. Ich werde GLPK in diesem Fall verwenden.

3. Einrichten eines Lösers in Pyomo

Zuerst stellen Sie sicher, dass die ausführbare Datei des Lösers nach der Installation im Ihren Systempfad ist.

Wenden Sie dann ein Python-Skript an und fügen Sie die folgenden hinzu:

from pyomo.environ import SolverFactory solver = SolverFactory('glpk')

Um zu bestätigen, dass sowohl Pyomo als auch Ihr Löser korrekt installiert sind, lösen wir einfache Testprobleme aus.

Testproblem: einfaches lineares Programm

Ziel: MinimierenZ=x+y

Unter Berücksichtigung von:

  • x + 2y ≥ 4
  • x – y ≤ 1
  • x ≥ 0
  • y ≥ 0

Dieses Problem betrifft das Finden des kleinstmöglichen Werts vonZ, der die Summe von zwei Variablenx und y ist. Allerdings müssenx und y bestimmte Bedingungen erfüllen.

Erstens, wenn Sie x addieren y, muss das Ergebnis mindestens 4 sein. Zweitens, x minus y muss kleiner oder gleich 1 sein. Schließlich müssen sowohl x als auch y Null oder positive Zahlen sein (sie dürfen nicht negativ sein). 

Das Ziel besteht darin, Werte von x und y zu finden, die diese Bedingungen erfüllen, während Z so klein wie möglich gehalten wird.

Implementierung mit Pyomo:

import pyomo.environ as pyo # Ein Modell erzeugen model = pyo.ConcreteModel() # Variablen definieren model.x = pyo.Var(within=pyo.NonNegativeReals) model.y = pyo.Var(within=pyo.NonNegativeReals) # Ziel definieren model.obj = pyo.Objective(expr=model.x + model.y, sense=pyo.minimize) # Bedingungen definieren model.con1 = pyo.Constraint(expr=model.x + 2 * model.y >= 4) model.con2 = pyo.Constraint(expr=model.x - model.y <= 1) # Löser auswählen solver = pyo.SolverFactory('glpk') # Das Problem lösen result = solver.solve(model) # Ergebnisse anzeigen print('Status:', result.solver.status) print('Termination Condition:', result.solver.termination_condition) print('Optimal x:', pyo.value(model.x)) print('Optimal y:', pyo.value(model.y)) print('Optimal Objective:', pyo.value(model.obj))

Wenn alles korrekt funktioniert, erhalten Sie die erwartete Ausgabe:

Status: ok Termination Condition: optimal Optimal x: 0.0 Optimal y: 2.0 Optimal Objective: 2.0

Gehen wir durch den oben stehenden Code: Zunächst definiert er zwei Variablen, x und y, die nur nicht-negative Werte annehmen können. Das Ziel des Modells besteht darin, die Summe von x und y (x + y) zu minimieren. Der Code definiert den Lösungsalgorithmus als glpk, um die optimale Werte von x und y zu finden, die diese Bedingungen erfüllen und die Zielfunktion minimieren.

Nach der Ausführung des Codes stellen wir fest, dass die optimalen Werte der Variablen sindx = 0.0 undy = 2.0, die die ZielfunktionZ = x + y minimieren. Daher ist der minimale Wert der Zielfunktion2.0, der die gegebenen Bedingungen erfüllt.

Basis der Modellierung mit Pyomo

Es ist notwendig, zu verstehen, wie die grundlegenden Komponenten eines Optimierungsmodells in Pyomo definiert werden, um Optimierungsprobleme effektiv aufzusetzen und zu lösen.

1. Definition von Variablen

Variablen repräsentieren die in einer Optimierungsproblem zu treffenden Entscheidungen. In Pyomo sind Variablen die Quantitäten, die der Löser anpassen wird, um die Zielfunktion zu optimieren und alle Constraints zu erfüllen.

Skalare Variablen

Eine skalare Variable ist eine einzelne Variable, die sich über kein Menge indexiert. Um eine skalare Variable in Pyomo zu definieren, verwendet man die Klasse Var aus dem Modul pyomo.environ.

from pyomo.environ import Var model.x = Var()

Wir importieren zunächst die Var und definieren mit Var() eine Variable x. Diese Variable hat keine festgelegten Grenzen, was bedeutet, dass sie beliebige reale Werte annehmen kann, solange sie nicht anders in dem Modell eingeschränkt wird.

Hinzufügen von Grenzen

Sie können die möglichen Werte einer Variable durch Angabe von Grenzen einschränken. Grenzen werden als Tupel (lower_bound, upper_bound) definiert:

from pyomo.environ import Var model.x = Var(bounds=(0, None))

Domänen angeben

Pyomo bietet vordefinierte Domänen, die Sie verwenden können, um den Typ der Werte, die eine Variable annehmen kann, zu definieren, wie z.B. NonNegativeReals, Integers oder Binary

from pyomo.environ import Var, NonNegativeReals model.x = Var(domain=NonNegativeReals)

Indexierte Variablen

Bei der Behandlung mehrerer Variablen, die in ihrer Natur ähnlich sind, wie z.B. Variablen, die verschiedene Zeitperioden oder Artikel repräsentieren, ist es effizient, indexierte Variablen zu verwenden. Indexierte Variablen sind Variablen, die über einen Satz definiert sind.

import pyomo.environ as pyo model.I = pyo.Set(initialize=[1, 2, 3]) model.y = pyo.Var(model.I, domain=pyo.NonNegativeReals)

Nehmen Sie beispielsweise an, Sie modelleien die Produktionsmengen für drei Produkte. Sie könnten definieren:

model.Products = pyo.Set(initialize=['A', 'B', 'C']) model.production = pyo.Var(model.Products, domain=pyo.NonNegativeReals)

Jetzt repräsentieren model.production['A'], model.production['B'] und model.production['C'] die Produktionsmengen für die Produkte A, B und C jeweils.

2. Ziele definieren

Die Zielfunktion ist das, was wir optimieren möchten (minimieren oder maximieren). Sie definiert das Ziel des Modells, wie z.B. das Minimieren von Kosten oder das Maximieren von Gewinnen, und wird typischerweise als mathematische Gleichung mit den Entscheidungsvariablen ausgedrückt.

Diese werden mit der Klasse Objective definiert:

from pyomo.environ import ConcreteModel, Var, Objective, minimize, maximize, NonNegativeReals # Erstellen eines Modells model = ConcreteModel() # Definieren von Variablen model.x = Var(within=NonNegativeReals) model.y = Var(within=NonNegativeReals) # Minimierung (Kosten) model.cost = Objective(expr=2 * model.x + 3 * model.y, sense=minimize) # Bei Maximierung von Gewinnen - (kann nur ein Ziel gleichzeitig geben) # model.profit = Objective(expr=5 * model.x + 4 * model.y, sense=maximize)

3. Einschränkungen hinzufügen

Einschränkungen definieren die Beschränkungen oder Anforderungen des Problems:

from pyomo.environ import Constraint model.con1 = Constraint(expr=model.x + model.y >= 10)

Der obige Beispiel definiert eine Einschränkung in der Pyomo-Modell mit der Constraint Klasse. Die Einschränkung model.con1 legt fest, dass die Summe der Variablen x und y ungleich null sein muss.10.

4. Parametrisierung von Modellen

Parameter sind festgelegte Werte, die im Modell verwendet werden, um bekannte Größen oder Konstanten zu repräsentieren, die während des Optimierungsprozesses nicht ändern.

Sie helfen dabei, die Beziehungen zwischen Variablen und Einschränkungen zu definieren und bieten dem Modell Struktur, indem reale Weltdaten oder Annahmen eingebunden werden:

from pyomo.environ import Param model.p = Param(initialize=5)

Der obenstehende Code definiert einen Parameter p in der Pyomo-Modelle mit der Param -Klasse und initialisiert ihn mit einer festen Wert von5. Der Parameter p kann nun im Modell verwendet werden, um eine Konstante zu repräsentieren, die während des Optimierungsprozesses nicht ändert.

Nun arbeiten wir an einem Enddiagnoseproblem!

Pyomo-Enddiagnosebeispiel

Sehen wir uns ein Enddiagnosebeispiel an, wie ein Optimierungsproblem mit Pyomo gelöst wird. Wir werden eine realweltliche Situation modellieren, in der eine Fabrik zwei Produkte herstellt und das Ziel ist, den Gewinn zu maximieren, während die Maschinenzeitbegrenzungen berücksichtigt werden.

1. Problemstellung

Eine Fabrik produziert zwei Produkte, P1 und P2. Der Gewinn pro Einheit ist:

  • P1: $40
  • P2: 50 €

Verfügbare Maschinenzeit:

  • Maschine A: 100 Stunden
  • Maschine B: 80 Stunden
  • Maschine C: 90 Stunden

Zeit pro Einheit:

Produkt

Maschine A (Stunden)

Maschine B (Stunden)

Maschine C (Stunden)

P1

1

2

0

P2

2

1

3

Ziel: Maximale Gewinn maximieren.

Entscheidungsvariable:

  • x₁: Einheiten von P1 zu produzieren.
  • x₂: Einheiten von P2 zu produzieren.

2. mathematische Formulierung

Zielfunktion:

Maximiere Z = 40x₁ + 50x₂

Einschränkungen:

  1. Maschine A Kapazität: 1x₁ + 2x₂ ≤ 100
  2. Maschinenkapazität B: 2x₁ + 1x₂ ≤ 80
  3. Maschinenkapazität C: 3x₂ ≤ 90
  4. Non-negativität: x₁, x₂ ≥ 0

3. Implementierung

Basierend auf dem Ziel und den Bedingungen des Problems, folgt hier der Python-Code, um es zu modellieren, wiederum verwendet er GLPK.

Schritt 1: Importieren von Bibliotheken import pyomo.environ as pyo Schritt 2: Erstellen eines konkreten Modells model = pyo.ConcreteModel() Schritt 3: Definieren von Entscheidungsvariablen (Mengen von P1 und P2 zu produzieren) model.x1 = pyo.Var(within=pyo.NonNegativeReals) model.x2 = pyo.Var(within=pyo.NonNegativeReals) Schritt 4: Definieren der Zielfunktion (Maximiere Gewinn) model.profit = pyo.Objective(expr=40 * model.x1 + 50 * model.x2, sense=pyo.maximize) Schritt 5: Definieren von Einschränkungen Einschränkung der Maschine A: 1x1 + 2x2 <= 100 model.machine_a = pyo.Constraint(expr=1 * model.x1 + 2 * model.x2 <= 100) Einschränkung der Maschine B: 2x1 + 1x2 <= 80 model.machine_b = pyo.Constraint(expr=2 * model.x1 + 1 * model.x2 <= 80) Einschränkung der Maschine C: 3x2 <= 90 model.machine_c = pyo.Constraint(expr=3 * model.x2 <= 90) Schritt 6: Lösen des Modells mit dem GLPK-Solver solver = pyo.SolverFactory('glpk') result = solver.solve(model) Schritt 7: Analyse der Ergebnisse Zeige den Status des Lösers und die Beendigungsbedingung an print('Solver Status:', result.solver.status) print('Termination Condition:', result.solver.termination_condition) Holze und zeige die optimale Werte für x1, x2 und den höchsten Gewinn an x1_opt = pyo.value(model.x1) x2_opt = pyo.value(model.x2) profit_opt = pyo.value(model.profit) print(f'Optimal production of P1 (x1): {x1_opt}') print(f'Optimal production of P2 (x2): {x2_opt}') print(f'Maximum Profit: ${profit_opt}')

Ausgabe:

>>> Solver Status: ok >>> Termination Condition: optimal >>> Optimal production of P1 (x1): 25.0 >>> Optimal production of P2 (x2): 30.0 >>> Maximum Profit: $2500.0

In dem obenstehenden Code definieren wir ein lineares Optimierungsmodell, um den Gewinn von zwei Produkten (P1 und P2) zu maximieren. Die Zielfunktion ist auf maximale Gewinnorientierung festgelegt, wobei jedes einzelne Unit von P1 einen Beitrag von 40 USD und jedes einzelne Unit von P2 einen Beitrag von 50 USD leistet.

Wir stellen drei Bedingungen fest, die die Maschinenzeitbegrenzungen für Maschinen A, B und C repräsentieren.

Schließlich verwenden wir den GLPK-Solver, um das Problem zu lösen.

Die Lösung ist die Produktion von 25 Einheiten von P1 und 30 Einheiten von P2, wodurch uns ein maximaler Gewinn von 2.500 USD möglich wird..

Erweiterte Features in Pyomo

In der vorhergehenden Abschnitt haben wir seen, wie einfach es ist, ein Enddiagnose-Optimierungsproblem mit Pyomo umzusetzen. Allerdings sind die meisten reale Lebensprobleme nicht direkt zu lösen.

In diesem Abschnitt zeige ich Ihnen einige erweiterte Features, die Sie verwenden können, um komplexere Szenarien zu lösen.

1. Nichtlineare Optimierung

Nichtlineare Optimierung minimiert oder maximiert eine nichtlineare Zielfunktion unter nichtlinearen Bedingungen. Lassen Sie uns ein Beispiel anschauen, wo wir die Summe der quadrierten Differenzen minimieren möchten unter einer kreisförmigen Bedingung.

Problemstellung

Ziel minimieren:Z = (x – 1)² + (y – 2)²

unter den Bedingungen:

  • x² + y² ≤ 4
  • x, y ≥ 0

In Pyomo können wir die Entscheidungsvariablen x und y mit Grenzen von 0 definieren, um die Non-Negativität zu gewährleisten. Die Zielfunktion ist als die Summe der Quadrate der Differenzen von bestimmten Punkten geschrieben, und die Constraint sichert die Lösung innerhalb eines Kreises mit Radius 2 ein.

In diesem Fall ist der IPOPT-Solver wegen seiner Fähigkeit, nichtlineare Optimierungsprobleme zu lösen, geeignet:

import pyomo.environ as pyo model = pyo.ConcreteModel() # Variable mit unteren Grenzen definieren model.x = pyo.Var(bounds=(0, None)) model.y = pyo.Var(bounds=(0, None)) # Zielfunktion: (x - 1)² + (y - 2)² minimieren model.obj = pyo.Objective(expr=(model.x - 1)**2 + (model.y - 2)**2, sense=pyo.minimize) # Bedingung: x² + y² ≤ 4 (Kreis mit Radius 2) model.circle = pyo.Constraint(expr=model.x**2 + model.y**2 <= 4) solver = pyo.SolverFactory('ipopt') result = solver.solve(model) print('Optimal x:', pyo.value(model.x)) print('Optimal y:', pyo.value(model.y)) print('Minimum Z:', pyo.value(model.obj))

2. Misch-integer-Programmierung (MIP)

Misch-integer-Programmierung wird verwendet, wenn einige Entscheidungsvariable ganze Zahlen sind (oft binär) während andere kontinuierlich sind. Es ist wertvoll für Entscheidungsprobleme wie Standortwahl und Produktionsplanung.

Problemstellung

Eine Firma muss entscheiden, ob sie Lagerhallen in den Orten A, B und C eröffnet. Ziel ist es, die Gesamtkosten zu minimieren, die aus den fixen Kosten der Lagerhalleneröffnung und den Transportkosten bestehen.

Wir beginnen mit der Initialisierung der Daten, einschließlich der fixen Kosten der Lagerhalleneröffnung, den Transportkosten, den Kapazitätsbegrenzungen und dem Gesamtbedarf:

locations = ['A', 'B', 'C'] FixedCost = {'A': 1000, 'B': 1200, 'C': 1500} TransportCost = {'A': 5, 'B': 4, 'C': 6} Capacity = {'A': 100, 'B': 80, 'C': 90} Demand = 150 model = pyo.ConcreteModel() # Binäre Variable: 1, wenn Lagerhalle geöffnet, sonst 0 model.y = pyo.Var(locations, domain=pyo.Binary) # Kontinuierliche Variable: Menge der transportierten Güter model.x = pyo.Var(locations, domain=pyo.NonNegativeReals) model.cost = pyo.Objective( expr=sum(FixedCost[i] * model.y[i] + TransportCost[i] * model.x[i] for i in locations), sense=pyo.minimize ) # Bedarfsbedingung model.demand = pyo.Constraint(expr=sum(model.x[i] for i in locations) >= Demand) # Kapazitätsbeschränkungen def capacity_rule(model, i): return model.x[i] <= Capacity[i] * model.y[i] model.capacity = pyo.Constraint(locations, rule=capacity_rule) solver = pyo.SolverFactory('cbc') result = solver.solve(model) for i in locations: print(f"Warehouse {i}: Open={pyo.value(model.y[i])}, Transported={pyo.value(model.x[i])}") print('Minimum Total Cost:', pyo.value(model.cost))

Das Modell beinhaltet zwei Arten von Entscheidungsvariablen: eine binäre Variable y, die darstellt, ob ein Lagerhaus geöffnet ist (1 bei geöffnet, 0 sonst), und eine kontinuierliche Variable x, die die Menge der Güter von jedem Lagerhaus transportiert repräsentiert.

Das Zielfunktion kumuliert die fixen Kosten und Transportkosten jedes Lagerhauses und minimiert den Gesamtbetrag. Die Beschränkungen stellen sicher, dass der insgesamt transportierte Güterbedarf erfüllt wird und dass die Kapazität jedes Lagerhauses nicht bei einer Öffnung überschritten wird.

3. Mehrere Ziele behandeln

Manchmal enthalten Optimierungsprobleme mehrere Ziele, die miteinander in Konflikt stehen, wie z.B. maximieren des Gewinns bei minimalisierung des Umwelteinflusses. Ein häufig verwendeter Ansatz ist die gewichtete Summenmethode, bei der jedem Ziel ein Gewicht zugewiesen wird, um seine Bedeutung auszugleichen.

Problemstellung

Wir zielen auf die maximale Profitabilität bei minimaler Umwelteinfluss ab:

  • Profit: Z₁ = 3x + 5y
  • Umwelteinfluss: Z₂ = 2x + y

Wir können diese Ziele mit Gewichtungen w1=0.6, w2=0.4 kombinieren, wobei das Gesamtziel eine gewichtete Summe wird:

w1 = 0.6 w2 = 0.4 model.obj = pyo.Objective( expr=w1 * (3 * model.x + 5 * model.y) - w2 * (2 * model.x + model.y), sense=pyo.maximize )

Mit dieser kombinierten Zielsetzung maximieren wir den Profit und minimieren den Umwelteinfluss durch Anpassen der Gewichtungen.

4. Verwendung externer Datenquellen

Bei der Behandlung großer Datensets ist die Importierung von Daten aus externen Quellen wie CSV-Dateien oft hilfreich. Pyomo arbeitet gut mit Pandas zusammen, um Daten aus externen Quellen zu lesen und zu verwenden.

Wir können mit Pandas eine CSV-Datei lesen und die Daten verwenden, um Sets und Parameter in unserem Modell zu initialisieren:

import pandas as pd data = pd.read_csv('parameters.csv') # Definiere Set aus CSV-Daten model.I = pyo.Set(initialize=data['index'].unique()) # Definiere Parameter aus CSV-Daten initialisieren param_dict = data.set_index('index')['value'].to_dict() model.param = pyo.Param(model.I, initialize=param_dict)

Tipps und Best Practices für die Verwendung von Pyomo

Bei der Arbeit mit Pyomo ist es wichtig, Ihre Modelle effizient, gut dokumentiert und leicht zu troubleshooten zu halten.

1. Debugging und Troubleshooting

Beim Aufbau von Optimierungsmodellen in Pyomo ist es häufig zu Problemen wie unmöglichen Lösungen, Löserfehlschlägen oder falscher Ergebnisse zu stoßen. Hier sind einige Best Practices für das Debugging:

  • Prüfung von Einschränkungen: Überprüfen Sie Ihre Einschränkungen, wenn Ihr Modell keine praktikable Lösung erzeugt. Engmasche Einschränkungen können ein Problem unlösbar machen. Verwenden Sie das .display()-Methode von Pyomo, um die Werte von Variablen und Einschränkungen auszugeben, um zu überprüfen, ob sie wie erwartet verhalten.
  • Lösungsverfahrensergebnis: Aktivieren Sie detaillierte Logs des Lösungsverfahrens, indem Sie tee=True übergeben, wenn Sie die solve()-Methode aufrufen. Dies kann Insiderwissen in Bezug auf Probleme liefern, mit denen das Lösungsverfahren zu kämpfen hat, wie unbegrenzte Variablen oder Unlösbarkeit.
  • Erstellen Sie zunächst einfache Modelle: Bei komplexen Modellen sollten Sie zuerst eine vereinfachte Version testen. Dies kann dazu beitragen, mögliche Probleme isoliert zu behandeln, ohne sich mit dem Overhead eines vollständig definierten Modells zu befassen.

Fehlerdiagnose ist viel einfacher, wenn Sie systematisch vorangehen, indem Sie Bedingungen, die Zielfunktion und die Lösungsergebnisse des Löser überprüfen.

2. Modellierungseffizienz

Optimierungsprobleme können mit zunehmender Größe des Modells rechnungsmäßig aufwendiger werden. Um eine effiziente Modellierung zu gewährleisten, sollten Sie die folgenden Tipps in Betracht ziehen:

  • Sparsität nutzen: Vermeiden Sie beim Definieren von Einschränkungen oder Zielen über unnötige Indizes zu iterieren. Die Nutzung der Sparsität in Ihrem Problem reduziert die Berechnungszeit.
  • Binäre vs. kontinuierliche Variablen: Wann immer möglich, reduzieren Sie die Anzahl binärer oder ganzzahliger Variablen. Kontinuierliche Variablen sind für Lösungsalgorithmen einfacher zu handhaben und führen zu schneller Lösung.
  • Einschränkungsformulierung: Halten Sie Einschränkungen so einfach wie möglich, sowohl in mathematischer Form als auch in der Implementierung. Vermeiden Sie unnötige nichtlineare Beziehungen und zerlegen Sie komplexe Einschränkungen in kleinere, verwaltbare Teile.

Effiziente Modelle lösen schneller und sind einfacher zu debuggen und zu warten.

3. Dokumentation und Wartung

Die Pflege von gut dokumentierten Pyomo-Modellen ist eine gute Praxis für die langfristige Nutzung und Zusammenarbeit. Gute Dokumentation erleichtert auch die Wiederholung und Aktualisierung der Modelle mit der Zeit:

  • Verwende Inline-Kommentare: Füge immer Kommentare hinzu, um zu erklären, worum es mit den Variablen, den Constraints und der Zielfunktion geht. Dies ist besonders wichtig in Optimierungsmodellen, wo die Logik möglicherweise nicht sofort offensichtlich ist.
  • Ihr Code modulare化: Ihre Modelle in logische Abschnitte oder sogar separate Funktionen aufsplitten. Dieser modulare Ansatz kann die Lesbarkeit verbessern und das Debuggen und Verändern bestimmter Modellelemente erleichtern.
  • Modelländerungen verfolgen: Halten Sie eine Versionsgeschichte Ihrer Modelle auf, insbesondere wenn es sich um eine Entwicklung handelt. Verwenden Sie Versionsverwaltungstools wie Git, um Änderungen zu verfolgen und sicherzustellen, dass jeder Update oder Verbesserung rückverfolgt werden kann.

Angemessene Dokumentation und strukturierter Code werden Ihre Pyomo-Modelle für zukünftige Mitwirkende zugänglicher machen und die Skalierung oder Modifizierung Ihrer Anforderungen erleichtern.

Schlussfolgerung

Pyomo ist ein leistungsstarkes und flexibles Werkzeug zur Erstellung und Lösung von Optimierungsmodellen in Python. In diesem Lehrgang haben wir erkundet, wie Pyomo Nutzern erlaubt, verschiedene Optimierungsprobleme zu modellieren, von linearen Programmierung bis zu nichtlinearen und gemischt-integer Programmierung.

Mit seiner benutzerfreundlichen Syntax und Integration mit Lösern gestaltet Pyomo das Formulieren und Lösen von realen Weltoptimierungsproblemen sowohl für Anfänger als auch für fortgeschrittene Nutzer zugänglich.

Wenn Sie mehr erfahren möchten, wie Sie mit Optimierungsvorgängen real-weltliche Probleme lösen, dann schauen Sie sich das kostenlose Kurs Einführung in die Optimierung in Python auf DataCamp an!

Source:
https://www.datacamp.com/tutorial/pyomo