Einführung in Optimierungsmodelle: Mit Beispielen und Real-World-Anwendungen in Python 3662673800, 9783662673805, 9783662673812

Dieses Buch könnte interessant für Sie sein, falls Sie über eine solide mathematische Ausbildung verfügen und nun Anwend

127 56 5MB

German Pages 216 Year 2023

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
Vorwort
Inhaltsverzeichnis
1 Einführung
1.1 Motivierendes Beispiel
1.2 Optimierungsmodelle
1.2.1 Grundbegriffe
1.2.2 Mathematische Notation
1.2.3 Indexmengen
1.2.4 Optimierungsmodelle und Optimierungsprobleme
1.3 Optimalpunkte und Optimalwerte
1.3.1 Anschauliche Erklärung
1.3.2 Mathematische Definition und Beispiele
1.3.3 Können verschiedene optimale Lösungen existieren?
1.3.4 Minimieren oder Maximieren?
1.3.5 Wann sind Optimierungsprobleme nicht lösbar?
2 Mathematische Grundlagen und Konvexität
2.1 Ein Wort vorab
2.2 Fahrplan für dieses Kapitel
2.3 Multivariate quadratische Funktionen
2.3.1 Anschauliche Erklärung
2.3.2 In Summenschreibweise
2.3.3 Als Matrix-Vektor-Produkt
2.3.4 Beispiele und erste Beobachtungen
2.4 Höherdimensionale Ableitungen
2.4.1 Der Gradient
2.4.2 Die Hesse-Matrix
2.5 Konvexität
2.5.1 Konvexe Mengen
2.5.2 Konvexe Funktionen
2.5.3 Definitheit von Matrizen
2.6 Eigenschaften konvexer Funktionen
2.6.1 Konvexe Funktionen und ihre Hesse-Matrizen
2.6.2 Summen konvexer Funktionen
2.7 Grafische Zusammenfassung
3 Unrestringierte quadratische Optimierungsmodelle
3.1 Motivation
3.2 Lesehinweis
3.3 Modellklasse
3.4 Mathematischer Hintergrund
3.4.1 Kritische Punkte
3.4.2 Kritische Punkte konvexer Funktionen
3.5 Praktische Hinweise
3.5.1 Modellierungstricks
3.5.2 Implementierung und Lösung in Python
3.6 Beispiele und Anwendungen
3.6.1 Umsatzmaximierung im Einproduktfall
3.6.2 Abstand, Punkt und Hyperebene
3.6.3 Über die Äquivalenz linearer Gleichungssysteme und UQPs
3.6.4 Mittlerer quadratischer Abstand zu Zahlen
3.6.5 Univariate lineare Regression und die Methode der kleinsten Quadrate
3.6.6 Multivariate lineare Regression und die Methode der kleinsten Quadrate
3.6.7 Ridge-Regression
4 Lineare Optimierungsmodelle
4.1 Motivation
4.2 Modellklasse
4.3 Mathematischer Hintergrund
4.3.1 Lineare Funktionen
4.3.2 Polyeder und Polytope
4.3.3 Dualitätstheorie für LPs
4.3.4 Lösungsalgorithmen
4.4 Praktische Hinweise
4.4.1 Modellierungstricks
4.4.2 Implementierung und Lösung in Python
4.5 Beispiele und Anwendungen
4.5.1 Mittlerer absoluter Abstand zu Zahlen
4.5.2 Lineare Regression und Least Absolute Deviations (LAD)
4.5.3 Produktionsproblem
4.5.4 Transportproblem
5 Gemischt-ganzzahlige lineare Optimierungsmodelle
5.1 Motivation
5.2 Modellklasse
5.3 Mathematischer Hintergrund
5.3.1 Kontinuierliche Relaxierungen und die Struktur der zulässigen Menge
5.3.2 Theoretische Komplexität und praktische Lösbarkeit
5.3.3 Lösungsalgorithmen
5.4 Praktische Hinweise
5.4.1 Modellierungstricks
5.4.2 Implementierung und Lösung in Python
5.5 Beispiele und Anwendungen
5.5.1 Zwölf Wächterinnen
5.5.2 Das schwerste Sudoku der Welt
5.5.3 Lineare Regression und Sparse Least Absolute Deviations
5.5.4 Unit Commitment Problem I: Pumpspeicherkraftwerk
5.5.5 Unit Commitment Problem II: Thermisches Kraftwerk
6 Gemischt-ganzzahlige quadratische Optimierungsmodelle
6.1 Motivation
6.2 Modellklasse
6.3 Mathematischer Hintergrund
6.3.1 Kontinuierliche Relaxierungen und Struktur der zulässigen Menge
6.3.2 Durch nichtkonvexe Funktionen beschriebene Mengen können trotzdem konvex sein
6.3.3 Lösungsalgorithmen
6.4 Praktische Hinweise
6.4.1 Modellierungstricks
6.4.2 Implementierung und Lösung in Python
6.5 Beispiele und Anwendungen
6.5.1 Verschnittminimierung
6.5.2 Das Lasso-Problem
6.5.3 Standortplanung I: Positionierung einer futuristischen Pizzeria
6.5.4 Standortplanung II: Bau eines Lagers für radioaktiven Abfall
7 Fortgeschrittene Modellierungstechniken
7.1 Linearisierung
7.1.1 Linearisierung konvexer Zielfunktionen und konvexer Ungleichungen
7.1.2 Linearisierung nichtkonvexer Funktionen
7.2 Dynamischer Modellaufbau am Beispiel des Traveling Salesman Problems
7.2.1 Problembeschreibung
7.2.2 Das TSP ist NP-schwer und doch für große Instanzen lösbar
7.2.3 Eine unvollständige MILP-Formulierung des TSPs
7.2.4 Subtour elimination constraints – eine naive Implementierung
7.3 Infeasibilities und Irreducible Inconsistent Subsystems
7.4 Mehrzieloptimierung
7.4.1 Ein einführendes Transportbeispiel
7.4.2 Lösungskonzepte
7.5 Sensitivitätsanalyse
7.5.1 Motivation und einführendes Beispiel aus der Netzwerkanalyse
7.5.2 Schattenpreise
7.5.3 Reduced Costs
8 Optimierungsmodelle in der Praxis
8.1 Erfolgsrezepte für den Einsatz von Optimierungsmodellen
8.1.1 Welche Probleme Sie mit Optimierung lösen sollten (und welche nicht)
8.1.2 Einbindung in die IT-Infrastruktur
8.1.3 Strategisch, taktisch oder operativ?
8.2 Vorgehen bei der Entwicklung eines Optimierungsmodells
8.3 Heuristiken
8.3.1 Was sind Heuristiken?
8.3.2 Heuristiken und Metaheuristiken
8.3.3 Wann sollten Sie Heuristiken einsetzen (und wann nicht)?
Literatur
Sachverzeichnis
Recommend Papers

Einführung in Optimierungsmodelle: Mit Beispielen und Real-World-Anwendungen in Python
 3662673800, 9783662673805, 9783662673812

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

Nathan Sudermann-Merx

Einführung in Optimierungsmodelle Mit Beispielen und Real-WorldAnwendungen in Python

Einführung in Optimierungsmodelle

Nathan Sudermann-Merx

Einführung in Optimierungsmodelle Mit Beispielen und Real-WorldAnwendungen in Python

Nathan Sudermann-Merx Institut für Informatik DHBW Mannheim Walldorf, Deutschland

ISBN 978-3-662-67380-5 ISBN 978-3-662-67381-2  (eBook) https://doi.org/10.1007/978-3-662-67381-2 Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. © Der/die Herausgeber bzw. der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung, die nicht ausdrücklich vom Urheberrechtsgesetz zugelassen ist, bedarf der vorherigen Zustimmung des Verlags. Das gilt insbesondere für Vervielfältigungen, Bearbeitungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Die Wiedergabe von allgemein beschreibenden Bezeichnungen, Marken, Unternehmensnamen etc. in diesem Werk bedeutet nicht, dass diese frei durch jedermann benutzt werden dürfen. Die Berechtigung zur Benutzung unterliegt, auch ohne gesonderten Hinweis hierzu, den Regeln des Markenrechts. Die Rechte des jeweiligen Zeicheninhabers sind zu beachten. Der Verlag, die Autoren und die Herausgeber gehen davon aus, dass die Angaben und Informationen in diesem Werk zum Zeitpunkt der Veröffentlichung vollständig und korrekt sind. Weder der Verlag noch die Autoren oder die Herausgeber übernehmen, ausdrücklich oder implizit, Gewähr für den Inhalt des Werkes, etwaige Fehler oder Äußerungen. Der Verlag bleibt im Hinblick auf geografische Zuordnungen und Gebietsbezeichnungen in veröffentlichten Karten und Institutionsadressen neutral. Planung/Lektorat: Andreas Ruedinger Springer Spektrum ist ein Imprint der eingetragenen Gesellschaft Springer-Verlag GmbH, DE und ist ein Teil von Springer Nature. Die Anschrift der Gesellschaft ist: Heidelberger Platz 3, 14197 Berlin, Germany

für Carmen, Livia, Viola, Kilian und Silas

Vorwort

Warum Sie dieses Buch lesen sollten Ziel dieses Buches ist es, Ihnen eine leicht verdauliche und praxisrelevante Einführung in die schöne Welt der Optimierungsmodelle zu bieten. Begleitet werden Sie hierbei von der vollwertigen und leicht zu erlernenden Programmiersprache Python. Optimierungsmodelle sind mathematische Modelle, die verwendet werden, um in komplexen Situationen mit vielen Freiheitsgraden und Abhängigkeiten optimale Entscheidungen zu berechnen. Sie möchten einen optimalen Produktionsplan für Ihren Betrieb, einen Stundenplan für Ihre Schule oder die bestmöglichen Parameter für Ihr Machine-Learning-Modell bestimmen? Ein Optimierungsmodell wird Ihnen helfen können. Die Zeiten waren nie besser, sich mit Optimierung zu beschäftigen. Das liegt zum einen an zahlreichen modernen Anwendungsmöglichkeiten und zum anderen daran, dass Optimierungsprobleme heute oft Billionen Mal schneller gelöst werden als zu Beginn der 90er Jahre, was neben schnelleren Computern vor allem besseren Algorithmen zu verdanken ist.1 Hier sind drei Beispiele für den Einsatz von Optimierungsmodellen als Appetizer. Weitere werden im Laufe des Buches folgen. Die National Football League (NFL) führt ihre Saisonplanung mithilfe mathematischer Optimierungsmodelle durch. Für die manuelle Durchführung dieser komplexen Planung mit vielen Abhängigkeiten wurden zuvor Monate aufgewandt. Heute werden innerhalb von Minuten tausende zulässige Konfigurationen berechnet, die anschließend von menschlichen Planerinnen evaluiert und umgesetzt werden. Aufgrund der guten Qualität kurzfristiger Wetterprognosen lässt sich die Stromproduktion durch erneuerbare Energien mit hoher Genauigkeit vorhersagen. Um eine Versorgungslücke zu vermeiden, wird die verbleibende Differenz durch hydrothermische Kraftwerke kostenminimal ausgeglichen. Diese sogenannte Kraftwerksoptimierung (Unit Commitment Problem) übersteigt schon lange

1 An dieser Stelle seien der Übersichtsartikel [4] von Robert Bixby sowie das Buch [2] von Dimitris Bertsimas empfohlen, die auf den enormen Geschwindigkeitszuwachs von Optimierungsalgorithmen während der letzten Jahrzehnte eingehen.

VII

VIII

Vorwort

menschliche Planungsfähigkeiten und wird deshalb seit Ende des 20. Jahrhunderts mithilfe von Optimierungsmodellen durchgeführt. Wenn Sie ein Machine-Learning-Modell trainieren, um beispielsweise die Verkaufszahlen eines Supermarkts basierend auf historischen Daten vorherzusagen, wird der sogenannte Vorhersagefehler minimiert. Dies geschieht durch – Sie ahnen es schon – das Lösen eines Optimierungsmodells. Modelle statt Algorithmen Wenn Sie die schöne Gelegenheit erhalten, ein Praxisproblem mit mathematischer Optimierung lösen zu wollen, werden Sie versuchen, das Problem zu verstehen und anschließend die wesentlichen Aspekte mathematisch zu beschreiben, d. h. zu modellieren. Dieser Schritt ist nicht leicht, denn es gibt gute und schlechte mathematische Beschreibungen desselben Sachverhalts, und die Kunst liegt darin, ein Modell zu entwickeln, das den Anwendungsfall mit ausreichender Genauigkeit beschreibt und gleichzeitig in angemessener Zeit gelöst werden kann. Sobald Sie das Problem modelliert haben, brauchen Sie einen Lösungsalgorithmus für das Optimierungsmodell nicht selbst zu implementieren, sondern können hier auf zahlreiche Algorithmen zurückgreifen, die bereits effizient implementiert wurden und Ihnen zum Beispiel in Form von Python-Paketen zur Verfügung stehen. Stellen Sie sich eine Handwerkerin vor, die den zu verwendenden Hammer vor Verwendung in der Regel auch nicht selbst herstellt. Für den praktischen Einsatz mathematischer Optimierung ist neben einem groben Verständnis der Optimierungstheorie und der zugehörigen Algorithmen also vor allem die Modellierung wichtig, worauf auch der Fokus dieses Buches liegt. Bestehende Literatur Während es viele Bücher über Optimierungstheorie und -algorithmen gibt, ist die Literatur zur Modellierung deutlich dünner besetzt. Explizit erwähnen möchten wir „Puzzles and Games – A Mathematical Approach“ von Tony Hürlimann [13]. Obwohl der Fokus, wie der Titel schon vermuten lässt, nicht auf Anwendungen liegt, die Sie in Ihrer beruflichen Praxis vorfinden werden, hat ein Modell zur Lösung eines Brettspiels oft starke mathematische Ähnlichkeiten mit einem Optimierungsmodell in der Praxis, weshalb hier auch einige Beispiele aus [13] betrachtet werden. Weitere Bücher mit Fokus auf der Modellbildung im Optimierungskontext sind [16, 29] sowie [12, 14]. Wie ist das Buch aufgebaut? Optimierungsmodelle lassen sich hinsichtlich ihrer mathematischen Struktur klassifizieren. Manche sind linear, andere nichtlinear, sie können kontinuierliche oder ganzzahlige Entscheidungsvariablen enthalten oder sich hinsichtlich anderer Kriterien strukturell unterscheiden. Warum ist das aus praktischer Sicht wichtig? Nun, die mathematische Struktur ermöglicht eine grobe Abschätzung der Laufzeit eines Algorithmus für die Berechnung der Lösung des Optimierungsmodells. So ist typischerweise ein kontinuierliches lineares Modell schneller zu lösen als ein

Vorwort

IX

nichtlineares Modell, das ganzzahlige Entscheidungsvariablen enthält. Wir werden daher die in diesem Buch untersuchten Optimierungsmodelle hinsichtlich ihres mathematischen Gerüsts kategorisieren. Dabei betrachten wir nur Problemklassen, deren Optimierungsalgorithmen performant genug sind, um Modelle in praxisrelevanter Größe lösen zu können. Erfreulicherweise hat sich hier innerhalb der letzten Jahrzehnte so viel getan, dass heutzutage viele Problemklassen innerhalb von Sekunden optimal gelöst werden können, die in den 90er Jahren noch nicht einmal in den Arbeitsspeicher gepasst hätten. Die Optimierungsmodelle in diesem Buch werden aufsteigend nach zu erwartender Rechenzeit für praktische Anwendungen sortiert. Deshalb werden Sie nach einem Einschub über mathematische Grundlagen zunächst von unrestringierten quadratischen Optimierungsproblemen (UQP) erfahren, da diese äquivalent sind zum Lösen eines linearen Gleichungssystems und dementsprechend für riesige Probleme in kurzer Zeit gelöst werden können. Bei linearen kontinuierlichen Optimierungsproblemen (LPs) verhält es sich ähnlich. Durch den enormen Fortschritt in der Solver-Technologie werden LPs heutzutage typischerweise schneller gelöst als es dauert, die zugehörigen Matrizen zu erzeugen und in den Arbeitsspeicher zu laden. Gemischt-ganzzahlige lineare Optimierungsmodelle (MILPs) stellen dank raffinierter Lösungsmethoden einen interessanten Trade-off dar, da sie oft für erstaunlich große Instanzen schnell zu lösen sind und gleichzeitig durch die Präsenz ganzzahliger Entscheidungsvariablen einen enormen Modellierungsspielraum bieten. Gemischt-ganzzahlige quadratische Optimierungsmodelle (MICQP) sind erst seit wenigen Jahren in Größenordnungen lösbar, die ausreichend sind, um Praxisprobleme zu modellieren. In Abb. 1 finden Sie eine Übersicht der in diesem Buch besprochenen Modellklassen. Je komplexer die Modellklasse, desto vielfältiger die Anwendungsbereiche, die sich damit modellieren lassen. Allerdings ist der Preis der Modellkomplexität in der Regel immer auch eine höhere erwarteten Laufzeit des Lösungsalgorithmus. Die Darstellung beschränkt sich dabei auf Modellklassen, deren Lösungsverfahren so gut sind, dass sie die Lösung praxisrelevanter Fragestellungen zulassen. Das bedeutet insbesondere, dass nichtlineare Optimierungsprobleme, deren Nichtlinearität „schlimmer“ als quadratisch ist, in diesem Buch nicht behandelt werden. Die Kapitel zu den einzelnen Optimierungsmodellen sind immer nach dem gleichen Schema aufgebaut. Nach einer Motivation wird die Modellklasse sauber definiert und Sie erhalten Informationen über den mathematischen Hintergrund. Anschließend gibt es praktische Hinweise zur Implementierung in Python und es werden Ihnen Modellierungstricks verraten, bevor Sie zum Herzstück des Buches, den vielen Beispielen, gelangen. Nach den Kapiteln zu den Modellklassen lernen Sie fortgeschrittene Modellierungstechniken kennen. Das Buch schließt im letzten Kapitel mit Tipps und Tricks zum Umgang mit Optimierungsmodellen in der Praxis.

X

Vorwort

Abb. 1  Eine Übersicht der in diesem Buch behandelten Klassen von Optimierungsmodellen

Für wen wurde dieses Buch geschrieben? Zunächst sei erwähnt, dass dieses Buch auf Vorlesungen basiert, die ich am KIT und an der DHBW Mannheim im Masterstudiengang Wirtschaftsingenieurwesen bzw. dem Bachelorstudiengang Informatik gehalten habe. Ich dachte beim Schreiben des Buches vor allem an Studierende ab dem zweiten Studienjahr und Modelliererinnen in der beruflichen Praxis. Neben grundlegenden mathematischen Kenntnissen, wie sie beispielsweise in den ersten beiden Studienjahren eines MINT-Studiums vermittelt werden, sollte die Leserin vor allem ein echtes Interesse mitbringen, Probleme am Computer zu modellieren und zu lösen. Die meisten verwendeten mathematischen und softwaretechnischen Konzepte werden in diesem Buch erklärt. Falls sich doch eine Wissenslücke auftut, empfehle ich Ihnen, das Buch zur Seite zu legen und diese Lücke beispielsweise bei YouTube zu schließen. Die Fülle an didaktisch wertvollen mathematischen Videoclips ist heutzutage enorm und Sie können dies zu Ihrem Vorteil nutzen. Viele der hier präsentierten Inhalte lernt man typischerweise nach einer sehr langwierigen theoretischen Grundlagenausbildung on the job. Hoffentlich gelingt durch dieses Buch auch Berufsneulingen oder Quereinsteigerinnen, z. B. aus dem Bereich Data Science, ein direkterer und schnellerer Zugang in die Materie. Hinweis zur verwendeten und empfohlenen Software Da dieses Buch konkrete Handlungsanweisungen für die Erstellung von Optimierungsmodellen enthält, werden auch konkrete Softwarepakete und Solver, wie etwa Python-MIP oder Gurobi, namentlich erwähnt. Ich möchte betonen, dass keine finanzielle oder anderweitig geartete Verquickung mit einem der genannten Softwareanbieter oder -entwickler besteht. Vielmehr basieren die

Vorwort

XI

Empfehlungen auf meinen praktischen Erfahrungen und sollten selbstverständlich je nach Anwendungsfall und persönlichen Vorlieben durch andere Software ersetzt werden. Danksagung Herzlicher Dank gilt allen Personen, die die Entstehung dieses Buches ermöglicht haben. Dies sind insbesondere Herr Dr. Rüdinger von Springer Nature, der das Buch auf eine sehr motivierende und wertschätzende Art betreut hat, und Maren Beck, die das Buch in ihrer Vorlesung „testete“ und anschließend viele wertvolle Hinweise zur Verbesserung des vorliegenden Materials gab. Vielen Dank auch allen Personen, mit denen ich mich bisher über Optimierung austauschen durfte. Das sind neben tollen Menschen im akademischen Umfeld vor allem auch meine geschätzten ehemaligen Kolleginnen und Kollegen bei der BASF und der EnBW. Besonders in Erinnerung geblieben ist mir der Ausspruch meines Kollegen Christian Timpe, dass ein angehender Maler „nicht lernt, wie man einen Pinsel baut, sondern wie man malt“. Ich habe versucht, diese Aussage beim Schreiben des Buches zu befolgen. Mein größter Dank gilt meiner Frau Carmen Merx. Ohne Dich wäre alles anders und auch dieses Buch nie entstanden. Verbesserungsvorschläge? Wenn Sie bei der Lektüre dieses Buches Fehler finden oder sonstige Verbesserungsvorschläge haben, lassen Sie es mich gern wissen. Sie erreichen mich unter [email protected]. Nathan Sudermann-Merx

Inhaltsverzeichnis

1 Einführung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1 Motivierendes Beispiel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Optimierungsmodelle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.1 Grundbegriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.2 Mathematische Notation. . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2.3 Indexmengen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2.4 Optimierungsmodelle und Optimierungsprobleme. . . . . . . . 7 1.3 Optimalpunkte und Optimalwerte . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.1 Anschauliche Erklärung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.2 Mathematische Definition und Beispiele . . . . . . . . . . . . . . . 8 1.3.3 Können verschiedene optimale Lösungen existieren? . . . . . 9 1.3.4 Minimieren oder Maximieren?. . . . . . . . . . . . . . . . . . . . . . . 10 1.3.5 Wann sind Optimierungsprobleme nicht lösbar? . . . . . . . . . 12 2 Mathematische Grundlagen und Konvexität . . . . . . . . . . . . . . . . . . . . . 15 2.1 Ein Wort vorab. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.2 Fahrplan für dieses Kapitel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3 Multivariate quadratische Funktionen . . . . . . . . . . . . . . . . . . . . . . . . 17 2.3.1 Anschauliche Erklärung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.3.2 In Summenschreibweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.3.3 Als Matrix-Vektor-Produkt. . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3.4 Beispiele und erste Beobachtungen. . . . . . . . . . . . . . . . . . . . 20 2.4 Höherdimensionale Ableitungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.4.1 Der Gradient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.4.2 Die Hesse-Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.5 Konvexität. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.5.1 Konvexe Mengen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.5.2 Konvexe Funktionen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.5.3 Definitheit von Matrizen. . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.6 Eigenschaften konvexer Funktionen. . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.6.1 Konvexe Funktionen und ihre Hesse-Matrizen. . . . . . . . . . . 31 2.6.2 Summen konvexer Funktionen . . . . . . . . . . . . . . . . . . . . . . . 32 2.7 Grafische Zusammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

XIII

XIV

Inhaltsverzeichnis

3 Unrestringierte quadratische Optimierungsmodelle . . . . . . . . . . . . . . 35 3.1 Motivation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2 Lesehinweis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.3 Modellklasse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.4 Mathematischer Hintergrund. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.4.1 Kritische Punkte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.4.2 Kritische Punkte konvexer Funktionen. . . . . . . . . . . . . . . . . 39 3.5 Praktische Hinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.5.1 Modellierungstricks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.5.2 Implementierung und Lösung in Python. . . . . . . . . . . . . . . . 44 3.6 Beispiele und Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.6.1 Umsatzmaximierung im Einproduktfall. . . . . . . . . . . . . . . . 44 3.6.2 Abstand, Punkt und Hyperebene. . . . . . . . . . . . . . . . . . . . . . 46 3.6.3 Über die Äquivalenz linearer Gleichungssysteme und UQPs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.6.4 Mittlerer quadratischer Abstand zu Zahlen. . . . . . . . . . . . . . 53 3.6.5 Univariate lineare Regression und die Methode der kleinsten Quadrate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 3.6.6 Multivariate lineare Regression und die Methode der kleinsten Quadrate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.6.7 Ridge-Regression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4 Lineare Optimierungsmodelle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.1 Motivation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.2 Modellklasse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.3 Mathematischer Hintergrund. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.3.1 Lineare Funktionen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4.3.2 Polyeder und Polytope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 4.3.3 Dualitätstheorie für LPs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.3.4 Lösungsalgorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 4.4 Praktische Hinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.4.1 Modellierungstricks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.4.2 Implementierung und Lösung in Python. . . . . . . . . . . . . . . . 83 4.5 Beispiele und Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.5.1 Mittlerer absoluter Abstand zu Zahlen . . . . . . . . . . . . . . . . . 84 4.5.2 Lineare Regression und Least Absolute Deviations (LAD). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.5.3 Produktionsproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4.5.4 Transportproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 5 Gemischt-ganzzahlige lineare Optimierungsmodelle. . . . . . . . . . . . . . . 93 5.1 Motivation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.2 Modellklasse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.3 Mathematischer Hintergrund. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 5.3.1 Kontinuierliche Relaxierungen und die Struktur der zulässigen Menge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Inhaltsverzeichnis

XV

5.3.2 Theoretische Komplexität und praktische Lösbarkeit. . . . . . 95 5.3.3 Lösungsalgorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.4 Praktische Hinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.4.1 Modellierungstricks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.4.2 Implementierung und Lösung in Python. . . . . . . . . . . . . . . . 100 5.5 Beispiele und Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 5.5.1 Zwölf Wächterinnen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 5.5.2 Das schwerste Sudoku der Welt . . . . . . . . . . . . . . . . . . . . . . 107 5.5.3 Lineare Regression und Sparse Least Absolute Deviations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 5.5.4 Unit Commitment Problem I: Pumpspeicherkraftwerk. . . . . 120 5.5.5 Unit Commitment Problem II: Thermisches Kraftwerk. . . . 127 6 Gemischt-ganzzahlige quadratische Optimierungsmodelle . . . . . . . . . 139 6.1 Motivation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 6.2 Modellklasse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 6.3 Mathematischer Hintergrund. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 6.3.1 Kontinuierliche Relaxierungen und Struktur der zulässigen Menge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 6.3.2 Durch nichtkonvexe Funktionen beschriebene Mengen können trotzdem konvex sein. . . . . . . . . . . . . . . . . 142 6.3.3 Lösungsalgorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 6.4 Praktische Hinweise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 6.4.1 Modellierungstricks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 6.4.2 Implementierung und Lösung in Python. . . . . . . . . . . . . . . . 147 6.5 Beispiele und Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 6.5.1 Verschnittminimierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 6.5.2 Das Lasso-Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 6.5.3 Standortplanung I: Positionierung einer futuristischen Pizzeria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 6.5.4 Standortplanung II: Bau eines Lagers für radioaktiven Abfall. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 7 Fortgeschrittene Modellierungstechniken. . . . . . . . . . . . . . . . . . . . . . . . 161 7.1 Linearisierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 7.1.1 Linearisierung konvexer Zielfunktionen und konvexer Ungleichungen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 7.1.2 Linearisierung nichtkonvexer Funktionen. . . . . . . . . . . . . . . 164 7.2 Dynamischer Modellaufbau am Beispiel des Traveling Salesman Problems. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 7.2.1 Problembeschreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 7.2.2 Das TSP ist NP-schwer und doch für große Instanzen lösbar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 7.2.3 Eine unvollständige MILP-Formulierung des TSPs. . . . . . . 168 7.2.4 Subtour elimination constraints – eine naive Implementierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

XVI

Inhaltsverzeichnis

7.3 Infeasibilities und Irreducible Inconsistent Subsystems. . . . . . . . . . . 175 7.4 Mehrzieloptimierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 7.4.1 Ein einführendes Transportbeispiel. . . . . . . . . . . . . . . . . . . . 178 7.4.2 Lösungskonzepte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 7.5 Sensitivitätsanalyse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 7.5.1 Motivation und einführendes Beispiel aus der Netzwerkanalyse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 7.5.2 Schattenpreise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 7.5.3 Reduced Costs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 8 Optimierungsmodelle in der Praxis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 8.1 Erfolgsrezepte für den Einsatz von Optimierungsmodellen. . . . . . . . 195 8.1.1 Welche Probleme Sie mit Optimierung lösen sollten (und welche nicht) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 8.1.2 Einbindung in die IT-Infrastruktur . . . . . . . . . . . . . . . . . . . . 196 8.1.3 Strategisch, taktisch oder operativ?. . . . . . . . . . . . . . . . . . . . 197 8.2 Vorgehen bei der Entwicklung eines Optimierungsmodells. . . . . . . . 198 8.3 Heuristiken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 8.3.1 Was sind Heuristiken?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 8.3.2 Heuristiken und Metaheuristiken . . . . . . . . . . . . . . . . . . . . . 202 8.3.3 Wann sollten Sie Heuristiken einsetzen (und wann nicht)?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 Literatur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Sachverzeichnis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

1

Einführung

1.1

Motivierendes Beispiel

Ein Urlaub in Frankreich In Sichtweite des Eiffelturms (s. Abb. 1.1) erleben Sie folgende Geschichte. Das Problem Sie befinden sich während Ihres Urlaubs in einer Bäckerei in Frankreich und möchten drei Croissants und zwei Baguettes erwerben, die insgesamt 7,77 e kosten. Um das Münzfach Ihres Portemonnaies maximal zu leeren, möchten Sie den Betrag passend mit möglichst vielen Münzen bezahlen. Eine schnelle Inventur Ihres Münzbestands ergibt eine Gesamtmenge von zwanzig 2-Cent-Münzen, drei 5-Cent-Münzen, zehn 20-Cent-Münzen, einer 50-Cent-Münze sowie fünf 2-Euro-Münzen. Was ist zu tun? Das Modell Während Sie ratlos in Ihr Münzfach blicken, werden Sie von einer freundlichen Kundin namens Marianne angesprochen, die Ihr Problem erraten hat und Ihnen gern helfen möchte. Sie setzen sich gemeinsam an einen Tisch in die Nähe der Theke, um die Situation zu analysieren. Da Marianne momentan eine Vorlesung zum Thema Optimierungsmodelle besucht, möchte sie das Problem mathematisch modellieren. Das geplante Vorgehen erklärt sie Ihnen anhand folgender Fragen.

Ergänzende Information Die elektronische Version dieses Kapitels enthält Zusatzmaterial, auf das über folgenden Link zugegriffen werden kann https://doi.org/10.1007/978-3-662-67381-2_1.

© Der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 N. Sudermann-Merx, Einführung in Optimierungsmodelle, https://doi.org/10.1007/978-3-662-67381-2_1

1

2

1

Einführung

Abb. 1.1 Der Eiffelturm. (Quelle: https://www.flickr.com/photos/pedrosz/27029805017, Lizenz: CC BY-SA 2.0)

1. Welche Größen Ihres Problems möchten Sie optimal bestimmen? Diese Bestandteile des Modells werden auch Entscheidungsvariablen genannt. Da Sie fünf verschiedene Münztypen besitzen, liegt der Gedanke nahe, die Anzahl der Münzen pro Münztyp als Entscheidungsvariable darzustellen. Sie führen also zunächst die Menge T = {2-Cent, 5-Cent, 20-Cent, 50-Cent, 2-Euro} ein und geben Ihren Entscheidungsvariablen die Namen xt mit t ∈ T . So bedeutet etwa x50-Cent = 2, dass Sie für Ihren Einkauf zwei 50-Cent-Münzen verwenden möchten. Gut. Das haben Sie verstanden. 2. Gibt es Restriktionen, auch Nebenbedingungen genannt, die Sie bei der Wahl der Entscheidungsvariablen einhalten müssen? Sie bejahen diese Frage. Zum Beispiel ist die oben erwähnte Belegung x50-Cent = 2 nicht zulässig, da Sie nur eine 50Cent-Münze besitzen. Eine weitere unzulässige Belegung von xt wäre xt = − 17 , da Sie weder Bruchteile von Münzen noch eine negative Anzahl darstellen wollen. Mathematisch formuliert ist xt für alle Münztypen t ∈ T eine nichtnegative ganze Zahl. Wir schreiben also xt ≥ 0 und xt ∈ Z f¨ur alle t ∈ T , und es gilt darüber hinaus x2-Cent ≤ 20, x5-Cent ≤ 3, x20-Cent ≤ 10, x50-Cent ≤ 1 und x2-Euro ≤ 5, da Sie nicht über beliebige Mengen jedes Münztyps verfügen, sondern die Nebenbedingungen berücksichtigen müssen, die Ihnen Ihr Münzfach auferlegt. Da Sie

1.1 Motivierendes Beispiel

3

den Betrag exakt bezahlen möchten, muss für die Entscheidungsvariablen gelten 2x2-Cent + 5x5-Cent + 20x20-Cent + 50x50-Cent + 200x2-Euro = 777, was eine weitere Restriktion darstellt. 3. Was ist die zu optimierende Zielgröße Ihres Modells? Sie möchten die Gesamtzahl x2-Cent + x5-Cent + x20-Cent + x50-Cent + x2-Euro der verwendeten Münzen maximieren, die unsere sogenannte Zielfunktion darstellt. Diese soll nun unter Berücksichtigung der Nebenbedingungen maximiert werden. Wir fassen zusammen: Das zu lösende Problem lautet

s.t.

max x2-Cent + x5-Cent + x20-Cent + x50-Cent + x2-Euro xt ≥ 0 und xt ∈ Z f¨ur alle t ∈ T x2-Cent ≤ 20, x5-Cent ≤ 3, x20-Cent ≤ 10, x50-Cent ≤ 1 und x2-Euro ≤ 5 2x2-Cent + 5x5-Cent + 20x20-Cent + 50x50-Cent + 200x2-Euro = 777.

Dabei gibt max die Optimierungsrichtung vor, und s.t., das auf den englischen Ausdruck subject to zurückgeht, wird der Aufzählung der Restriktionen vorangestellt. Herzlichen Glückwunsch! Sie haben mit Mariannes Hilfe Ihr erstes Optimierungsmodell erstellt und Ihr Münzproblem mathematisch beschrieben. Bemerkung 1.1.1 Sie hätten bei der Modellierung der Menge T der Vollständigkeit halber auch 1-Cent-, 10-Cent- und 1-Euro-Münzen modellieren können. Da Sie aber keine Münzen dieser Typen besitzen, hätten Sie dafür die Restriktionen x1−Cent ≤ 0, x10−Cent ≤ 0 und x1−Eur o ≤ 0 hinzufügen müssen, was zusammen mit den Nichtnegativitätsbedingungen dazu geführt hätte, dass die zugehörigen Entscheidungsvariablen immer den Wert Null annehmen. Es wäre also nicht falsch, aber in jedem Fall unnötig und weniger schlank gewesen, die fehlenden Münztypen ebenfalls zu modellieren. Sie sehen, bereits hier haben Sie ein Beispiel für eine schlechtere Möglichkeit der Modellierung kennengelernt. Die Lösung Da allerdings noch die optimale Entscheidung aussteht, sind Sie an einer Lösung des Optimierungsmodells interessiert. Eingeschüchtert fragen Sie Marianne, ob Sie nun etwa noch einen Lösungsalgorithmus erlernen und implementieren müssen. Marianne winkt lachend ab und zückt ihr Smartphone. In Windeseile hat sie eine mobile Version der Programmiersprache Python gestartet und gibt die gleich folgenden Zeilen Code ein. Da Sie ohnehin vorhaben, sich in nächster Zeit in Python einzuarbeiten, möchten Sie zunächst nur grob verstehen, was hier passiert, und sich die Details zu einem späteren Zeitpunkt anschauen.

4

1

Einführung

Das Python-Paket mip enthält einige nützliche Dinge, die Marianne für die spätere Nutzung importiert. from mip import CBC , INTEGER , Model , maximize , xsum

Anschließend definiert sie die zugrundeliegenden Daten, d. h. die Münztypen, den Inhalt des Münzfachs, den Wert der Münzen sowie den Kaufpreis, wobei alle Geldbeträge in Cent angegeben werden. # Data from problem d e s c r i p t i o n # Coin types T = [ "2 - Cent " , "5 - Cent " , " 20 - Cent " , " 50 - Cent " , "2 - Euro " ] # Content of the wallet cont = { "2 - Cent " : 20 , "5 - Cent " : 3 , " 20 - Cent " : 10 , " 50 - Cent " : 1 , "2 - Euro " : 5 , } # Coin value in cents val = { "2 - Cent " : 2 , "5 - Cent " : 5 , " 20 - Cent " : 20 , " 50 - Cent " : 50 , "2 - Euro " : 200 , } # Total price in cents price = 777

Basierend auf den Datenstrukturen implementiert Marianne nun das Optimierungsmodell. Dafür deklariert sie zunächst das Modell und definiert danach die Entscheidungsvariablen (decision variables), die Nebenbedingungen (constraints) sowie die Zielfunktion (objective function). # O p t i m i z a t i o n model # Model d e c l a r a t i o n m = Model ( solver_name = CBC ) # Decision variables coins = { t : m . add_var ( var_type = INTEGER , lb = 0 ) for t in T } # Constraints # x must not exceed the wallet ’s content for t in T : m + = coins [ t ] < = cont [ t ] # The total amount of coins meets the prices m + = xsum ( coins [ t ] * val [ t ] for t in T ) = = price # Objective function m . objective = maximize ( xsum ( coins [ t ] for t in T ) )

1.2 Optimierungsmodelle

5

Um das Optimierungsmodell zu lösen, reicht ein simples m.optimize() -Statement, welches das Modell an einen Lösungsalgorithmus übergibt, der das Optimum berechnet. # Solve o p t i m i z a t i o n model m . optimize ()

Stopp! Vermutlich haben Sie den bisherigen Teil mitprogrammiert und freuen sich schon darauf, die Lösung zu erfahren. Bevor Sie weiterlesen, möchten ich Sie dazu ermutigen, sich selbst zu überlegen, was wohl die optimale Lösung sein könnte. Finden Sie es durch scharfes Nachdenken oder eine kleine Rechnung mit Bleistift und Papier heraus? Und nun weiter mit der Geschichte... Mit dem Code # Inspect results print ( f " Total number of coins : { int ( m . objective_value ) } " ) for k in coins : if coins [ k ] . x > 0 : print ( f " { k } : { int ( coins [ k ]. x ) } " )

wird die Lösung des Optimierungsmodells ausgegeben und Sie erhalten folgende optimale Lösung: Total number of coins : 27 2 - Cent : 16 5 - Cent : 3 20 - Cent : 4 50 - Cent : 1 2 - Euro : 3

Sie bedanken sich herzlich bei Marianne und können nun Ihren Einkauf tätigen.

1.2

Optimierungsmodelle

1.2.1

Grundbegriffe

Wir möchten nun die Begriffe, die wir in der obigen Urlaubsgeschichte exemplarisch kennengelernt haben, auf allgemeine Optimierungsmodelle übertragen. Jedes Optimierungsmodell besteht aus Daten einer Zielfunktion, Entscheidungsvariablen und einer zulässigen Menge. • Daten quantifizieren die Rahmenbedingungen des Anwendungsfalls. Sie enthalten Informationen über den Inhalt Ihres Geldbeutels, die Produktionskapazitäten oder den Verkaufspreis einer Spielekonsole. Aus Sicht des Optimierungsmodells

6

1

Einführung

sind es feste vorgegebene Größen, die sich während der Berechnung einer Lösung nicht ändern. • Die Zielfunktion bestimmt unsere Zielgröße, die wir minimieren oder maximieren möchten. Vielleicht wollen Sie die Anzahl der ausgegebenen Münzen maximieren oder Ihren CO2 -Ausstoß minimieren? Dann sollte dies Teil Ihrer Zielfunktion sein. • Entscheidungsvariablen sind Freiheitsgrade, die Sie optimal wählen wollen, um Ihre Zielfunktion zu optimieren. Welche Münzen möchten Sie für den Einkauf ausgeben? An welchem Produktionsstandort soll wann wie viel von welcher Ware hergestellt werden? Welche Route wählen Sie für Ihre Weltreise? • Eine zulässige Menge enthält alle Restriktionen, welche die Entscheidungsvariablen erfüllen müssen. So möchten Sie vielleicht bei der Weltreise mindestens zehn Städte auf vier verschiedenen Kontinenten besuchen oder bei der Produktion berücksichtigen, dass zu jedem Zeitpunkt die Nachfrage gedeckt werden kann. Sie dürfen statt Restriktionen auch Nebenbedingungen, Randbedingungen oder einfach Constraints sagen. Ja, wir haben in diesem Buch keine Angst vor Anglizismen.

1.2.2

Mathematische Notation

All diese Größen werden unter Verwendung der Sprache der Mathematik formuliert. Wenn es n ∈ N, also z. B. n = 73, Entscheidungsvariablen gibt, fassen wir diese zu einem Spaltenvektor ⎛ ⎞ x1 ⎜ .. ⎟ x = ⎝ . ⎠ ∈ Rn xn zusammen, den wir aus Platzgründen oft als Punkt (x1 , . . . , xn ) darstellen. Wir versuchen also für jede der Komponenten x1 , . . . , xn von x den optimalen Wert zu finden. Wie gut die jeweilige Belegung von x ist, teilt uns die Zielfunktion f : Rn → R mit, die jedem x ihren Zielfunktionswert f (x) ∈ R zuweist. Die zulässige Menge M ist eine Teilmenge des Rn und enthält somit alle zulässigen Punkte unseres Optimierungsmodells. Das Optimierungsmodell selbst benennen wir in der Regel mit einem Großbuchstaben, beispielsweise P, und schreiben für ein Minimierungsproblem P :

min f (x) x

s.t.

Zielfunktion Entscheidungsvariable

x ∈ M . Zul¨assige Menge

Falls M = Rn gilt, ist unser Optimierungsmodell unrestringiert, ansonsten sprechen wir von einem restringierten Modell. Bei restringierten Optimierungsmodellen sind die Nebenbedingungen immer in Form von Gleichungen oder Ungleichungen angegeben, wie Sie es auch bereits im einführenden Urlaubsbeispiel gesehen haben.

1.2 Optimierungsmodelle

7

Sie werden sich in diesem Buch oft mit ganzzahligen Entscheidungsvariablen beschäftigen. Statt x ∈ Rn schreibt man dann an den entsprechenden Stellen x ∈ Zn oder x ∈ Bn , wobei B nur die Zahlen 0 und 1 enthält und für die Darstellung binärer Entscheidungsvariablen verwendet wird, die für Optimierungsmodelle immens wichtig sind. Entscheidungsvariablen, denen keine Ganzzahligkeitsbedingungen obliegen, sind kontinuierliche Entscheidungsvariablen.

1.2.3

Indexmengen

Der unten an einer Entscheidungsvariablen stehende Text ist ihr Index. Übrigens lautet hier die Mehrzahl nicht Indexe, sondern Indizes. Indexe gibt es zwar auch, aber das ist etwas anderes, wovon Sie sich gern durch eine kleine Recherche überzeugen können. Die Schreibweise x1 , . . . , xn suggeriert, dass Indizes von Entscheidungsvariablen typischerweise Zahlen sind, was vermutlich auch Ihrer bisherigen Erfahrung aus Schule und Studium entspricht. Dies ist für Optimierungsmodelle in der Regel nicht der Fall! Nutzen Sie Indexmengen, um Informationen über Ihren Anwendungsfall zu kodieren. So ist x20-Cent direkt zu verstehen und einfach zu interpretieren. x Index

5

x

20-Cent Ein weiterer Index

Noch vorteilhafter wird die Situation, wenn Sie mehrdimensionale Indexmengen haben und beispielsweise xKarlsruhe,Berlin die Transportmenge eines Produkts von Karlsruhe nach Berlin modelliert. Falls es dienlich ist und etwa Platz spart, werden wir natürlich nicht davor zurückschrecken, eine Entscheidungsvariable mit x5 zu bezeichnen, aber Sie sollten im Kopf behalten, dass es in echten Anwendungen nicht nur die Übersichtlichkeit erhöht, sondern Ihnen auch die Fehlersuche bei der Implementierung erleichtert, wenn Sie sprechende Namen für Ihre Indizes verwenden.

1.2.4

Optimierungsmodelle und Optimierungsprobleme

Die Begriffe Optimierungsmodell und Optimierungsproblem trennscharf zu definieren, ist eine Klippe, die wir hier unverschämterweise umschiffen werden, da sie für das Verständnis des Stoffes nicht weiter relevant ist. Beide bestehen aus denselben Bestandteilen: Daten, Entscheidungsvariablen, einer zulässigen Menge und einer Zielfunktion. Sie unterscheiden sich eher in den mitklingenden Zwischentönen. Tendenziell liest man in der algorithmischen Literatur eher von Optimierungsproblemen, bei denen die mathematische Struktur des Problems im Vordergrund steht. So werden Sie vielleicht von konvexen oder nichtkonvexen Optimierungsproblemen gehört haben. Auch in diesem Buch werden wir das Thema streifen. Betrachtet man Optimierung eher aus der Sicht der Anwenderin, geht es also um die kon-

8

1

Einführung

krete Beschreibung eines Anwendungsproblems durch entsprechende Gleichungen, Ungleichungen, usw., landet man in der Regel beim Begriff des Optimierungsmodells. Wir werden diese Begriffe hier synonym gebrauchen und jeweils so einsetzen, wie wir es für vorteilhaft halten.

1.3

Optimalpunkte und Optimalwerte

1.3.1

Anschauliche Erklärung

Im Urlaubsbeispiel aus Abschn. 1.1 bestand die Lösung des Optimierungsmodells aus zwei Komponenten, nämlich • der maximalen Anzahl an verwendeten Münzen, also einer Zahl mit dem Wert 27, sowie • der genauen Angabe verwendeter Münzen pro Münztyp, die sich auch als fünfdimensionaler Punkt mit den Koordinaten (16, 3, 4, 1, 3) darstellen lässt. Analog dazu besteht auch die Lösung eines allgemeinen Optimierungsmodells aus Optimalpunkten und einem Optimalwert. Dabei entspricht ein Optimalpunkt der optimalen Belegung der Entscheidungsvariablen und der Optimalwert ist der zugehörige Zielfunktionswert. Wenn Sie also beispielsweise ein Produkt kostenminimal herstellen möchten, erhalten Sie als Optimalwert die minimalen Produktionskosten und als Optimalpunkt den zugehörigen Produktionsplan.

1.3.2

Mathematische Definition und Beispiele

Es wird für den Moment angenommen, dass es sich bei dem Optimierungsproblem P um ein Minimierungsproblem mit n Entscheidungsvariablen handelt, wobei n eine beliebige natürliche Zahl ist, z. B. n = 73. Wir schreiben also P:

min f (x)

x∈Rn

s.t.

x ∈ M.

Ein Optimalpunkt von P erhält das schöne Symbol x  und verdient nur dann den Titel „Optimalpunkt“, wenn er folgende Bedingungen erfüllt: 1. Ein Optimalpunkt x  muss selbstverständlich zulässig sein, d. h., es gilt x  ∈ M, was bedeutet, dass x  alle Restriktionen des Problems P erfüllt. 2. Außerdem sollte x  unter allen zulässigen Punkten den besten Zielfunktionswert besitzen. Es muss also f (x  ) ≤ f (x) ∀x ∈ M

1.3 Optimalpunkte und Optimalwerte

9

Abb. 1.2 Minimierung der Funktion f : R → R, f (x) = (x − 1)2 + 2

gelten, wobei wir für die mathematische Formulierung den Allquantor ∀ verwendet haben. Die Aussage liest sich: „Für alle x aus der Menge M gilt, f (x  ) ist kleiner oder gleich f (x).“ Wenn Sie einen Optimalpunkt x  von P in die Zielfunktion f einsetzen, erhalten Sie den Optimalwert f (x  ) von P, den wir oft auch mit v bezeichnen. Bemerkung 1.3.1 Ein Optimalpunkt des unrestringierten Optimierungsproblems min x f (x) wird einfach Minimum von f genannt. Analog ist jeder Optimalpunkt von maxx f (x) ein Maximum von f . Beispiel 1.3.1 Wie in Abb. 1.2 dargestellt, ergibt die Minimierung der Funktion f : R → R, f (x) = (x −1)2 +2 den Optimalpunkt x  = 1 und den Optimalwert v = 2. Bemerkung 1.3.2 Da Optimierungsmodelle für praktische Anwendungen in der Regel viele Entscheidungsvariablen besitzen, ist üblicherweise der Optimalpunkt x  ∈ Rn ein mehrdimensionaler Vektor bzw. Punkt des Rn der Dimension n, wohingegen der Optimalwert immer eine reelle Zahl f (x  ) ∈ R ist. Beispiel 1.3.2 Das Minimum der Funktion f : R2 → R, f (x) = x12 + x22 ist x  = (0, 0), wie Sie sich leicht überlegen können, denn schließlich gilt f (x  ) = 0 und alle anderen x = x  besitzen einen positiven Zielfunktionswert f (x) > 0. Der Graph von f ist in Abb. 1.3 dargestellt.

1.3.3

Können verschiedene optimale Lösungen existieren?

Diese Frage erscheint auf den ersten Blick eventuell merkwürdig. Kann es verschiedene optimale Lösungen geben? Ja, und zwar, wenn verschiedene beste Lösungen

10

1

Einführung

Abb. 1.3 Graph der Funktion f (x) = x12 + x22

gleich gut sind. Das mag auf den ersten Blick konstruiert wirken, passiert in der Praxis aber häufig, z. B. durch Entscheidungsvariablen, die keinen Beitrag zur Zielfunktion leisten. Ob dieses Modelle gut formuliert wurden, steht auf einem anderen Blatt. Sie müssen bei der Frage nach der Eindeutigkeit der Lösung eines Optimierungsmodells auch hier wieder zwischen Optimalpunkten und Optimalwerten unterscheiden. Es ist zwar möglich und durchaus üblich, dass ein Optimierungsmodell, wie etwa in Beispiel 1.3.3 dargestellt, mehrere Optimalpunkte besitzt. Der Optimalwert ist jedoch stets eindeutig bestimmt und für jeden dieser Optimalpunkte gleich. Warum ist das so? – Gäbe es mehrere Optimalwerte, so müssten sich diese Zahlen unterscheiden. Dann wäre aber nur die kleinste dieser Zahlen wirklich ein Optimalwert des Optimierungsmodells. Ganz unbemerkt haben wir gerade einen kleinen mathematischen Beweis geführt, was nichts anderes ist als die Aneinanderreihung von Argumenten. Beispiel 1.3.3 Die Funktion f : R2 → R, f (x) = x12 besitzt unendlich viele Optimalpunkte in R2 . Natürlich ist nach wie vor der Punkt (0, 0) ein Minimum von f . Jedoch ist beispielsweise auch x¯ = (0, 1) ein Optimalpunkt, denn f (x) ¯ = 02 = 0. Beachten Sie, dass die Wahl der Variablen x2 in x keinen Einfluss auf den Funktionswert f (x) hat. Entsprechend sind alle Punkte der Menge {x ∈ R2 | x1 = 0} Minima von f . Abb. 1.4 zeigt den Graphen von f .

1.3.4

Minimieren oder Maximieren?

Sie können zu jedem Optimierungsproblem, das als Minimierungsproblem formuliert wurde, ein äquivalentes Maximierungsproblem aufstellen. Warum ist das so? – Anstatt die Zielfunktion Ihres Optimierungsproblems zu minimieren, können Sie

1.3 Optimalpunkte und Optimalwerte

11

Abb. 1.4 Graph der Funktion f : R2 → R, f (x) = x12

auch die negative Zielfunktion maximieren. Die Optimalpunkte Ihres Optimierungsproblems ändern sich dadurch nicht. Beim Optimalwert ändert sich natürlich das Vorzeichen. 

Trick 1 Ob Sie die Zielfunktion minimieren oder die negative Zielfunktion maximieren, ist für den Optimalpunkt irrelevant. Das Vorzeichen des Optimalwerts kehrt sich entsprechend um.

Anstatt die Funktion f : R → R, f (x) = (x − 1)2 + 2 zu minimieren, können Sie auch die Funktion − f (x) = −(x − 1)2 − 2 maximieren. In beiden Fällen erhalten Sie den Optimalpunkt x  = 1. Jedoch ändert sich das Vorzeichen des Optimalwerts v, wie Sie in Abb. 1.5 sehen können.

Abb. 1.5 Links: Minimum der Funktion f : R → R, f (x) = (x1 − 1)2 + 2; rechts: Maximum der Funktion − f (x) = −(x1 − 1)2 − 2

12

1.3.5

1

Einführung

Wann sind Optimierungsprobleme nicht lösbar?

Bis jetzt haben wir stillschweigend angenommen, dass jedes Optimierungsproblem mindestens einen Optimalpunkt besitzt. Unlösbare Optimierungsprobleme sind jedoch nicht nur theoretischer Natur, sondern können Ihnen schneller begegnen, als Ihnen lieb ist. Klassischerweise treten unlösbare Optimierungsmodelle durch Modellierungsfehler auf, die sich in der Entwicklungsphase großer Modelle kaum vermeiden lassen. Lassen Sie uns die drei häufigsten Gründe für Unlösbarkeit betrachten. Leere zulässige Menge Der Fall mag Ihnen vielleicht konstruiert vorkommen, aber die größte Horrorvorstellung einer Modellentwicklerin ist, wenn Python ihr mitteilt, dass ihr Modell infeasible sei und daher nicht lösbar ist. Infeasible, zu deutsch auch „unzulässig“ oder „inkonsistent“, bedeutet, dass die zulässige Menge des Optimierungsproblems leer ist. Wie kann das passieren? Gerade wenn binäre Entscheidungsvariablen involviert sind, haben Optimierungsmodelle oft eine komplizierte Constraint-Struktur, deren Formulierung oft nicht ganz einfach ist. Wenn Sie sich jetzt vertun und sich Restriktionen widersprechen, ist Ihr Modell nicht mehr lösbar. Es folgt ein Beispiel. Beispiel 1.3.4 Sie haben vier binäre Entscheidungsvariablen, die wir diesmal nicht mit x, sondern mit y kennzeichnen, wie es auch in der Literatur oft üblich ist. Es sei also y ∈ B4 , d. h. yi ∈ {0, 1} für alle i ∈ {1, . . . , 4}, und Sie formulieren die Restriktionen y1 + y2 + y3 + y4 = 1, y2 = 1 und y4 = 1. Aus y2 = 1 und y4 = 1 folgt direkt, dass die Summe der vier Binärvariablen nicht den Wert eins annehmen kann. Vielmehr lässt sich die Summenbedingung so interpretieren, dass genau eine der vier Binärvariablen den Wert eins annimmt, wohingegen die verbleibenden drei Variablen null sind. Dies ist durch die folgenden beiden Restriktionen verletzt, sodass es kein y ∈ B4 gibt, das alle Gleichungen erfüllt. Es entsteht also eine leere zulässige Menge. Für die Python-Implementierung des Beispiels 1.3.4 können Sie die folgenden Zeilen Code verwenden:

1.3 Optimalpunkte und Optimalwerte

13

from mip import BINARY , CBC , Model , xsum I = [1 , 2 , 3 , 4 ] # Model d e c l a r a t i o n m = Model ( solver_name = CBC ) # Decision variables y = { i : m . add_var ( var_type = BINARY ) for i in I } # m m m

Constraints + = xsum ( y [ i ] for i in I ) = = 1 += y[2] == 1 += y[4] == 1

# Solve opt i m i z a t i o n model m . optimize ()

An der Rückmeldung werden Sie sehen, dass auch Python der Meinung ist, das Problem habe keine zulässigen Punkte. Coin0507I Presolve determined that the problem was infeasible with tolerance of 1e - 08

Wie Sie die Ursachen für Unlösbarkeiten finden und beheben können, werden Sie in Abschn. 7.3 lernen. Unbeschränktheit Ein Minimierungsproblem heißt unbeschränkt (unbounded), falls es zulässige Punkte gibt, für die der Zielfunktionswert beliebig klein werden kann. Unbeschränkte Maximierungsprobleme sind entsprechend nach oben unbeschränkt. Solche Fälle ergeben sich typischerweise durch das Vergessen von Nebenbedingungen bei der Formulierung des Optimierungsmodells. Beispiel 1.3.5 Das Optimierungsproblem P:

min 2x x

s.t.

x ≤1

ist unbeschränkt, da der Zielfunktionswert für beliebig kleine Werte von x gegen minus unendlich geht. In diesem Fall liegt das vermutlich daran, dass fälschlicherweise statt x ≥ 1 die Restriktion x ≤ 1 formuliert wurde. Offene zulässige Menge Welchen Optimalpunkt besitzt folgende Optimierungsproblem? P:

min x x∈R

s.t.

x >0

Eigentlich müsste das Problem doch lösbar sein? Sie minimieren die reelle Zahl x, die nach unten durch null beschränkt ist. Ist also x = 0 der Optimalpunkt von P?

14

1

Einführung

Nein, das kann nicht sein, da die Ungleichung strikt ist und x = 0 somit nicht Teil der zulässigen Menge ist. Erkennen Sie das Problem? Mathematisch formuliert ist M = {x ∈ R | x > 0} eine offene Menge, was bedeutet, dass ihr Rand nicht in der Menge enthalten ist. Dies ist problematisch für Optimierungsprobleme, da wir in diesem Fall in Richtung eines Randes optimieren möchten, den wir nie erreichen können. Wir bevorzugen für die Optimierung sogenannte abgeschlossene Mengen, d. h. Mengen, deren Rand auch Teil der Menge selbst ist. Da strikte Ungleichungen die Abgeschlossenheit von Mengen zerstören, sind sie in der Formulierung von Optimierungsmodellen verboten. Diese Meinung teilt auch Python, denn die Formulierung from mip import CBC , Model # Model d e c l a r a t i o n m = Model ( solver_name = CBC ) # Decision variables y = m . add_var () # Constraints m += y > 1 # Solve o p t i m i z a t i o n model m . optimize ()

ergibt die folgende Fehlermeldung. TypeError : ’ > ’ not supported between instances of ’ Var ’ and ’ int ’

Ohne mathematischen Beweis sei Ihnen an dieser Stelle mitgeteilt, dass glücklicherweise zulässige Mengen immer abgeschlossen sind, wenn man für die Formulierung Gleichungen oder nichtstrikte Ungleichungen verwendet und alle auftauchenden Funktionen stetig sind, d. h. keine Sprungstellen enthalten. Insbesondere sind Sie auf der sicheren Seite, wenn alle verwendeten Ausdrücke von polynomieller Form sind, was auch lineare und quadratische Ausdrücke einschließt. Also merken Sie sich bitte: Strikte Ungleichungen sind schlecht! Bemerkung 1.3.3 Üblicherweise kehrt man die Frage in der Literatur um. Wann sind Optimierungsprobleme lösbar? Wir verlassen uns hier darauf, dass uns die Lösungsalgorithmen Bescheid geben, sollte das Optimierungsproblem nicht lösbar sein, und beschränken uns auf die Erklärung der häufigsten Ursachen für Unlösbarkeit. Per Default sind unsere Optimierungsprobleme also lösbar. Sollten Sie dennoch an hinreichenden Bedingungen für die Lösbarkeit eines Optimierungsproblems interessiert sein, so hilft Ihnen der sogenannte Satz von Weierstraß. Er besagt, dass jede stetige Funktion auf einer nicht-leeren und kompakten Menge Minima und Maxima besitzt. Dieser Satz existiert in vielen Variationen, die unter anderem auch Aussagen für unrestringierte Optimierungsprobleme treffen. Bei Interesse verweisen wir Sie an dieser Stelle auf Abschn. 1.2 im Buch „Grundzüge der Globalen Optimierung“ von Oliver Stein ([23]).

2

Mathematische Grundlagen und Konvexität

The watershed in optimization is between convexity and non-convexity instead of linearity and non-linearity. R. Tyrrell Rockafellar

2.1

Ein Wort vorab

Falls Sie das Buch gerade zum ersten Mal lesen und direkt zu den Optimierungsthemen gelangen wollen, können Sie dieses Kapitel zunächst auslassen und mit Kap. 3 fortfahren. Sie werden in Kap. 2 erfahren, was der Unterschied zwischen konvexen und nichtkonvexen Optimierungsproblemen ist. Dies ist wesentlich für die Optimierung, da nichtkonvexe Probleme deutlich komplizierter zu lösen sind. Im ersten Durchgang könnte Ihnen das aber egal sein. Spätestens, wenn Ihr Solver sich darüber beschwert, dass er das Problem aufgrund der Nichtkonvexität nicht lösen kann, sehen wir uns hier vermutlich wieder.

2.2

Fahrplan für dieses Kapitel

Wahrscheinlich haben Sie zu Schulzeiten fleißig die Minimalstellen quadratischer Polynome berechnet, indem Sie die Nullstelle der ersten Ableitung berechnet haben. Motiviert wurde dies durch die Beobachtung, dass die Ableitung genau der Steigung der Tangenten an der jeweiligen Stelle entspricht, wie Abb. 2.1 illustriert. Nun ist es so, dass bei der Minimierung quadratischer Polynome nicht sichergestellt ist, dass sie überhaupt einen Minimalpunkt besitzen. Wollen Sie statt der eindimensionalen Funktion f 1 (x) = (x − 1)2 + 2 die Funktion f 2 (x) = −(x − 1)2 + 2 minimieren, so werden Sie feststellen, dass f 2 nach unten unbeschränkt ist, wie Sie

© Der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 N. Sudermann-Merx, Einführung in Optimierungsmodelle, https://doi.org/10.1007/978-3-662-67381-2_2

15

16

2

Mathematische Grundlagen und Konvexität

Abb. 2.1 Links: Minimierung des quadratischen Polynoms f 1 : R → R, f 1 (x) = (x − 1)2 + 2 durch „Nullsetzen“ der Ableitung, rechts: Das „Nullsetzen“ der Ableitung von f 2 : R → R, f 2 (x) = −(x − 1)2 + 2 ergibt kein Minimum, sondern ein Maximum

auch Abb. 2.1 entnehmen können. Die Funktion f 2 hat also kein Minimum, obwohl wir hier auch problemlos Nullstellen der ersten Ableitung berechnen können. Was unterscheidet die Funktionen f 1 und f 2 strukturell? Bevor Sie weiterlesen, möchten wir Sie dazu ermutigen, sich darüber Gedanken zu machen, wie Sie die grundsätzlichen Unterschiede zwischen f 1 und f 2 mathematisch beschreiben würden. Der Schlüssel liegt in der Betrachtung der Krümmung. Die Krümmung von f 1 ist bekannterweise die Änderungsrate der ersten Ableitung, also die zweite Ableitung von f 1 . Sie wird im Eindimensionalen gern mit f 1 bezeichnet. Hier gilt f 1 (x) = 2 für alle x ∈ R. Die Krümmung von f 1 ist also positiv, was zeigt, dass der Graph von f 1 nach oben geöffnet ist. Wenn Sie f 2 untersuchen, erhalten Sie f 2 (x) = −2 für alle x ∈ R, was auch gut dazu passt, dass f 2 nach unten geöffnet ist. Eindimensionale Funktionen f mit nichtnegativer Krümmung f  (x) ≥ 0 an allen Punkten x ∈ R nennt man auch konvex. Dabei ist nichtnegativ kein Synonym für positiv, da eine nichtnegative Zahl im Gegensatz zu einer positiven Zahl auch null sein kann. Falls die Ableitung von f eine Nullstelle besitzt, ist diese ein kritischer Punkt von f , und alle kritischen Punkte konvexer Funktionen sind auch Minimalstellen derselbigen, wie Sie in den folgenden Abschnitten lernen werden. Nun haben Sie je nach mathematischer Vorbildung etwas Arbeit vor sich, da wir die obigen Erkenntnisse gern auf multivariate Funktionen f : Rn → R verallgemeinern wollen, die statt einer nun vielleicht 73 oder 7300 Entscheidungsvariablen besitzen. Auch im Höherdimensionalen sind Sie fein raus, wenn Ihre Zielfunktion f konvex ist. Allerdings müssen Sie vorher noch folgende Fragen klären, bei denen dieses Buch Sie gern unterstützen wird. • Wie sehen quadratische Funktion im Rn aus? • Wie sind erste und zweite Ableitungen im Höherdimensionalen definiert? • Wann ist eine Funktion f : Rn → R konvex?

2.3 Multivariate quadratische Funktionen

17

2.3

Multivariate quadratische Funktionen

2.3.1

Anschauliche Erklärung

Jede eindimensionale quadratische Funktion f ist ein Polynom und lässt sich mit reellen festen Zahlen a, b und c schreiben als f (x) = ax 2 + bx + c. So ist für a = 1, b = 0 und c = −1 beispielsweise f (x) = x 2 − 1 eine quadratische Funktion. Wie sehen quadratische Funktionen im Rn aus, wo der Input x ∈ Rn aus den Variablen x1 , . . . , xn ∈ R besteht? Zunächst sind quadratische Funktionen im Rn ebenfalls Polynome. Da „poly“ das griechische Wort für „viele/mehrere“ ist und „mono“ wiederum „allein“ oder „einzig“ bedeutet, wird es Sie nicht verwundern, dass ein Polynom aus mehreren Monomen besteht. Genauer gesagt besteht ein Polynom aus einer Summe von Monomen. Was sind Monome? Ein Monom ist ein Produkt aus Variablen und konstanten Faktoren. So sind etwa 2x oder x 2 y Monome, wohingegen x + y kein Monom ist, da es aus der Summe von x und y besteht. Eine quadratische Funktion f : Rn → R ist ein Polynom, bei dem jedes Monom aus dem Produkt einer Zahl mit höchstens zwei Variablen besteht. Sind die folgenden Funktionen quadratisch? • f : R3 → R, f (x) = 2 + x12 + 3x22 − x32 ist eine quadratische Funktion, da jedes Monom entweder konstant ist oder aus dem Produkt einer Variablen mit sich selbst besteht. Es werden also nie mehr als zwei Variablen miteinander multipliziert. • f : R2 → R, f (x) = x1 x2 + 2x2 ist eine quadratische Funktion, da in keinem Monom mehr als zwei Variablen miteinander multipliziert werden. • f : R2 → R, f (x) = x12 x2 + x12 ist keine quadratische Funktion, da wegen x12 x2 = x1 x1 x2 das erste Monom aus dem Produkt dreier Variablen entsteht.

2.3.2

In Summenschreibweise

Wenn Sie mathematisch sauber definieren möchten, welche Funktionen den Titel „quadratisch“ tragen dürfen, können Sie unter Verwendung des Summenzeichens  festlegen, dass sich jede quadratische Funktion f : Rn → R darstellen lassen muss als f (x) =

n

i=1

n

j=1 qij xi xj

Quadratischer Term

+

n

i=1

Linearer Term

di xi + c , Konstanter Term

wobei qi j , di und c reelle Zahlen sind, die die Koeffizienten und den konstanten Faktor angeben. Jede quadratische Funktion f besteht also aus einer Summe quadratischer, linearer und konstanter Terme, wobei natürlich jede Zahl den Wert Null annehmen darf.

18

2

Mathematische Grundlagen und Konvexität

n Als Erinnerung: Es gilt i=1 xi = x1 + . . . + xn . Falls Sie nicht (mehr) wissen, wie das Summenzeichen zu verstehen ist, empfehlen wir, die Lektüre jetzt zu unterbrechen und diese Wissenslücke bei Wikipedia, YouTube oder an einem sonstigen Ort Ihres Vertrauens zu schließen. Summen werden im Verlauf des Buches noch wichtig sein. Beispiel 2.3.1 Für n = 2 mit q11 = 0, q12 = q21 = 1, q22 = −2, d1 = 1, d2 = 0 und c = −1 erhalten Sie die Funktion f (x) = x1 x2 + x2 x1 − 2x22 + x1 − 1 = 2x1 x2 − 2x22 + x1 − 1, die auch gemäß der anschaulichen Erklärung aus Abschn. 2.3.1 als quadratische Funktion zu erkennen ist. Sie sehen die Vor- und Nachteile mathematischer Begriffe. Sie sind exakt und unmissverständlich definiert, aber teilweise haben mathematische Symbole eine einschüchternde Wirkung, die den Lesespaß hemmen kann.

2.3.3

Als Matrix-Vektor-Produkt

Matrix-Vektor-Produkte erlauben in vielen Fällen eine sehr kompakte schöne Darstellung von Ausdrücken und kommen dabei ganz ohne Summenzeichen zurecht. Der einzige Haken ist, dass Sie dazu wissen sollten, was eine Matrix ist und wie man diese mit einem Vektor multipliziert. Um dieses Wissen aufzufrischen, folgen nun ein paar Worte über Matrizen (Plural von Matrix) und das Matrix-Vektor-Produkt. Eine Matrix A ∈ Rm×n ist ein rechteckiges Schema reeller Zahlen mit m Zeilen und n Spalten, wobei m und n natürliche Zahlen, wie z. B. die Werte n = 42 und m = 73, sind. In einer Matrix tummeln sich also m · n Zahlen. Im Beispiel wären das immerhin 73 Zahlen für jede der 42 Zeilen, also insgesamt 73 · 42 = 3066 Elemente. Jedes Element ai j einer Matrix A lässt sich über seine Indizes orten, da sich ai j in der i-ten Zeile und j-ten Spalte von A aufhält. Wenn Sie beispielsweise die Matrix  A =

 123 456

in Zeile 2 und Spalte 3 auswerten, erhalten Sie a23 = 6. Sie dürfen eine Matrix A ∈ Rm×n mit einer Matrix B ∈ Rn× p multiplizieren, falls A so viele Spalten hat wie B Zeilen besitzt, und erhalten eine Matrix C ∈ Rm× p , deren Einträge ci j Sie gemäß ci j =

m  k=1

aik · bk j

2.3 Multivariate quadratische Funktionen

19

berechnen. Meditieren Sie ein wenig über der Formel und rechnen Sie hierzu ein paar Übungsaufgaben. Falls Sie Lust auf eine dynamisch visualisierte Veranschaulichung der Matrizenmultiplikation haben, empfehlen wir Ihnen die Webseite http:// matrixmultiplication.xyz/. Bevor wir wieder zum Thema quadratische Funktionen springen, erinnern Sie sich bitte kurz daran, dass die Transponierte A T einer Matrix A berechnet wird, indem Sie alle Zeilen und Spalten vertauschen. Aus der ersten Zeile von A wird also die erste Spalte von A T und so weiter. Dementsprechend hat etwa die Transponierte A T einer Matrix A ∈ R42×73 dann 73 Zeilen und 42 Spalten, d. h., es gilt A T ∈ R73×42 . Insbesondere ergibt das Transponieren des Spaltenvektors ⎛ ⎞ x1 ⎜ .. ⎟ x =⎝.⎠ xn den Zeilenvektor



x T = x1 . . . xn .

Um nun die Funktion f (x) =

n  n 

qi j xi x j

i=1 j=1

n 

di xi + c

i=1

als Matrix-Vektor-Produkt darzustellen, werden zunächst die Koeffizienten qi j der quadratischen Terme in einer Matrix Q gesammelt: ⎛ ⎞ q11 q12 . . . q1n ⎜q21 q22 . . . q2n ⎟ ⎜ ⎟ Q = ⎜ . . . . ⎟ ⎝ .. .. . . .. ⎠ qn1 qn2 . . . qnn

Ferner definieren Sie die Vektoren ⎛ ⎞ ⎛ ⎞ x1 d1 ⎜ .. ⎟ ⎜ .. ⎟ x = ⎝ . ⎠ und d = ⎝ . ⎠ . xn

dn

Nun folgt der große Moment. Eine Funktion f : Rn → R ist genau dann quadratisch, wenn Sie sich darstellen lässt als f (x) = xT Qx + dT x + c . Quadratischer Term Linearer Term

Schön, oder?

Konstanter Term

20

2

2.3.4

Mathematische Grundlagen und Konvexität

Beispiele und erste Beobachtungen

Quadratische Funktionen können bereits mit zwei Variablen komische Dinge tun, wie Sie an den Funktionen • • • •

f 1 (x) = f 2 (x) = f 3 (x) = f 4 (x) =

x12 + x22 , x12 , x1 · x2 und x12 − x22

sehen werden, die in Abb. 2.2 illustriert sind. Von den vier betrachteten Funktionen besitzen nur f 1 und f 2 ein Minimum, wobei f 2 sogar unendliche viele Minima besitzt, da die Variable x2 keinen Einfluss auf den Funktionswert von f hat und somit beliebig gewählt werden kann. Die quadratischen Funktionen f 3 und f 4 besitzen sogenannte Sattelpunkte und sind jeweils nach unten unbeschränkt.

Abb. 2.2 Verschiedene quadratische Funktionen in zwei Variablen

2.4 Höherdimensionale Ableitungen

21

Die „guten“ Funktionen f 1 und f 2 unter den vier Kandidaten sind auch genau die Funktionen, die konvex sind, auch wenn Sie vermutlich zum jetzigen Zeitpunkt noch nicht wissen, wie Konvexität für höherdimensionale Funktionen definiert ist. Analog zum eindimensionalen Fall wird Konvexität für eine hinreichend oft differenzierbare Funktionen f : Rn → R über ihr Krümmungsverhalten definiert, das sich der zweiten Ableitung entnehmen lässt. Deshalb werden Sie in Abschn. 2.4 zunächst erfahren, wie Ableitungen im Rn definiert sind, bevor Sie sich in Abschn. 2.5 der Konvexität höherdimensionaler Funktionen zuwenden.

2.4

Höherdimensionale Ableitungen

2.4.1

Der Gradient

Sie wissen aus dem Schulunterricht, wie man Ableitungen eindimensionaler Funktionen berechnet. Die Ableitung einer Funktion f : R → R an der Stelle x¯ ∈ R ist eine ¯ bezeichnet wird. Die Funktion f (x) = (x − 1)2 + 2 Zahl, die in der Regel als f  (x)  ¯ = −2 besitzt die Ableitung f (x) = 2(x −1), die an der Stelle x¯ = 0 den Wert f  (x) ergibt. Wenn Sie nun die Funktion f : R2 → R,

f (x) = x12 − x1 x2 + 2x22

zweimal ableiten möchten, funktioniert das folgendermaßen. Um die erste Ableitung, den sogenannten Gradienten, zu berechnen, leiten Sie die Funktion zunächst nach x1 ab und tun so, als sei x2 eine beliebige feste Zahl. Man sagt auch, Sie bilden die partielle Ableitung von f nach x1 an der Stelle x, was man mit dem Symbol ∂∂xf1 (x) notiert. Sie schreiten also zur Tat und erhalten ∂f (x) = 2x1 − x2 . ∂ x1 Wie erwähnt, stellen Sie sich vor, x2 sei die Zahl 42, und leiten einfach gemäß den bekannten Rechenregeln nach x1 ab. Nun bilden wir noch die partielle Ableitung von f nach x2 , also ∂f (x) = −x1 + 4x2 , ∂ x2 und fassen die partiellen Ableitungen im Vektor     ∂f (x) 2x1 − x2 ∇ f (x) = ∂∂xf1 = −x1 + 4x2 ∂ x (x) 2

zusammen, den wir den Gradienten von f an der Stelle x nennen. Der Gradient an der Stelle x¯ = (1, 1) ist   1 ∇ f (x) ¯ = . 3

22

2

Mathematische Grundlagen und Konvexität

Abb. 2.3 Links: Graph der Funktion f (x) = x12 − x1 x2 + 2x22 , rechts: Höhenlinien von f mit dem eingezeichneten Gradienten ∇ f (1, 1)

Das dreieckige Symbol wird übrigens „Nabla“ ausgesprochen. In Abb. 2.3 sehen Sie den Graphen sowie die Höhenlinien der obigen Funktion f . Stellen Sie sich einfach vor, Sie würden das Gebirge durchwandern, das durch den Graphen von f beschrieben ist. Alle Punkte derselben Höhe befinden sich nun auf einer sogenannten Höhenlinie. In dem Plot der Höhenlinien wurde außerdem der Gradient ∇ f (1, 1) als Vektor eingezeichnet. Sie sehen, dass er senkrecht auf der Höhenlinie zum Niveau 2 steht, was kein Zufall ist. Darüber hinaus haben Gradienten die praktische Eigenschaft, dass sie immer in die Richtung des steilsten Anstiegs zeigen. Numerische Verfahren der mathematischen Optimierung nutzen dies in sogenannten Gradientenabstiegsverfahren aus, bei denen sie ausgehend von einem Startpunkt in die negative Gradientenrichtung laufen und hoffen, irgendwann ein Minimum der Funktion zu erreichen. Tiefergehende Erklärungen zu gradientenbasierten Verfahren finden Sie in [19].

2.4.2

Die Hesse-Matrix

Sie haben festgestellt, dass der Gradient ∇ f einer Funktion f : Rn → R an einer Stelle x¯ ∈ Rn ein Vektor der Länge n ist. Was passiert nun, wenn Sie dieses Objekt noch einmal ableiten, um an die zweiten Ableitungen zu gelangen, die hoffentlich Auskunft über die Krümmung von f liefern? Um die Berechnung zweiter Ableitungen im Höherdimensionalen zu illustrieren, betrachten wir erneut die Funktion f : R2 → R,

f (x) = x12 − x1 x2 + 2x22

mit dem Gradienten

 ∇ f (x) =

 2x1 − x2 . −x1 + 4x2

2.5 Konvexität

23

Um die zweite Ableitung von f zu berechnen, leiten wir jede Komponente von ∇ f erneut partiell nach x1 und x2 ab und erhalten die sogenannte Hesse-Matrix  H f (x) =

∂2 f ∂2 f ∂ x1 ∂ x1 (x) ∂ x1 ∂ x2 (x) ∂2 f ∂2 f ∂ x2 ∂ x1 (x) ∂ x2 ∂ x2 (x)



 =

 2 −1 . −1 4

Die zweite Ableitung von f ist also eine Matrix mit n Zeilen und n Spalten. Das erschwert die naive Überprüfung der Konvexität analog zum Eindimensionalen. Funktionen f : R → R sind ja laut obiger Ausführung konvex, wenn für die zweite Ableitung f  (x) ≥ 0 gilt, was ja auch leicht zu überprüfen war, da f  (x) eine Zahl ist. Wie lässt sich dies auf Funktionen f : Rn → R übertragen, für die die zweite Ableitung H f (x) eine Matrix ist? Falls alle Einträge von H f (x) nichtnegativ sind, muss f leider noch lange nicht konvex sein, wie Sie in Abschn. 2.6 sehen werden. Also muss ein anderes Konzept her, das es uns erlaubt, anhand der Hesse-Matrix H f (x) zu bestimmen, ob f konvex ist. Es bleibt spannend.

2.5

Konvexität

Sie werden zunächst in Abschn. 2.5.1 sehen, wie Konvexität für Mengen definiert ist. Sobald Sie das verstanden haben, können Sie in Abschn. 2.5.2 Ihr Wissen über konvexe Mengen verwenden, um einen Schritt weiter zu gehen und konvexe Funktionen zu definieren. Leider lässt sich mithilfe der Definition von konvexen Funktionen schlecht überprüfen, ob eine gegebene Funktion wirklich konvex ist. Um diesen Missstand zu beheben, lernen Sie in Abschn. 2.5.3 ein Werkzeug kennen, das in Abschn. 2.6 dafür verwendet wird, die Konvexität von Funktionen anhand ihrer Hesse-Matrix zu überprüfen.

2.5.1

Konvexe Mengen

Anschauliche Erklärung Eine Menge ist konvex, wenn Sie zwei beliebige Punkte aus der Menge wählen können und die Verbindungsgerade dieser Punkte ebenfalls in der Menge liegt. In Abb. 2.4 sehen Sie eine konvexe sowie eine nichtkonvexe Menge. Wichtig für die konvexe Menge ist, dass die Verbindungslinie nicht nur für die beiden Punkte Teil der Menge ist, die in der Abbildung eingezeichnet sind, sondern für alle Punktepaare nicht aus der Menge herausragt. Für die nichtkonvexe Menge sind zwei Punkte eingetragen, deren Verbindungslinie zumindest teilweise aus Punkten besteht, die nicht in der betrachteten Menge liegen, was die Konvexität zerstört. Beachten Sie, dass es im Gegensatz zur Physik in der Mathematik keine konkaven Mengen gibt. Eine Menge, die nicht konvex ist, wird schlicht als nichtkonvexe Menge bezeichnet.

24

2

Mathematische Grundlagen und Konvexität

Abb. 2.4 Links eine konvexe und rechts eine nichtkonvexe Menge

Mathematische Definition Mathematisch formuliert, ist eine Menge M ⊆ Rn konvex, wenn für alle x, y ∈ M und λ ∈ [0, 1] λx + (1 − λ)y ∈ M gilt. Sie können sich überlegen, dass Sie für jedes λ im abgeschlossenen Intervall [0, 1] mit λx + (1 − λ)y einen Punkt auf der Verbindungsgerade zwischen x und y erhalten, sodass die mathematische Definition natürlich wieder der obigen anschaulichen Erklärung entspricht. Der Punkt λx + (1 − λ)y heißt Konvexkombination von x und y. Die Schnittmenge konvexer Mengen ist wieder eine konvexe Menge Wenn Sie zwei konvexe Mengen A und B haben, so können Sie diese schneiden, und die Schnittmenge A ∩ B := {x| x ∈ A, x ∈ B}, die alle Punkte enthält, die sowohl in A als auch in B liegen, ist ebenfalls eine konvexe Menge, wie in Abb. 2.5 illustriert und in Satz 2.5.1 formuliert und bewiesen wird. Satz 2.5.1 Seien A und B konvexe Mengen. Dann ist A ∩ B ebenfalls eine konvexe Menge. Beweis Seien x, y ∈ A ∩ B und λ ∈ [0, 1]. Da x und y in A liegen und A konvex ist, liegt auch λx + (1 − λ)y in A. Mit derselben Begründung liegt λx + (1 − λ)y auch in B. Da nun λx + (1 − λ)y in A und in B liegt, liegt es auch in A ∩ B, und somit ist A ∩ B konvex.  Beachten Sie, dass diese Aussage nicht nur für zwei konvexe Mengen gilt, sondern sich induktiv auf den Schnitt (abzählbar) vieler Mengen erweitern lässt. Dies ist insofern für Sie relevant, als sich die zulässigen Mengen von Optimierungsmodellen

2.5 Konvexität

25

Abb. 2.5 Zwei konvexe Mengen, deren Schnittmenge offensichtlich ebenfalls eine konvexe Menge darstellt

immer auch als Schnitt vieler definierender Gleichungen und Ungleichungen interpretieren lassen und die Konvexität dieser Mengen wiederum entscheidend für die Laufzeit Ihres Solvers ist.

2.5.2

Konvexe Funktionen

Anschauliche Erklärung Eine Funktion f : Rn → R ist konvex, falls die Menge oberhalb des Graphen eine konvexe Menge ist. Diese Menge wird übrigens der Epigraph von f genannt und mit epi f bezeichnet. Falls der Epigraph von f eine nichtkonvexe Menge ist, ist dementsprechend auch f eine nichtkonvexe Funktion. In Abb. 2.6 sehen Sie eine konvexe Funktion sowie eine nichtkonvexe Funktion.

Abb. 2.6 Links: konvexe Funktion f 1 , rechts: nichtkonvexe Funktion f 2

26

2

Mathematische Grundlagen und Konvexität

Im Gegensatz zu Mengen gibt es sehr wohl konkave Funktionen. Eine Funktion f ist genau dann konkav, falls die gespiegelte Funktion − f eine konvexe Funktion ist. Konkave Funktionen werden allerdings in diesem Buch nur eine untergeordnete Rolle spielen. Überlegen Sie sich doch an dieser Stelle, warum die Funktion rechts in Abb. 2.1 eine konkave Funktion im soeben definierten Sinne ist, und versuchen Sie dies sauber zu begründen. Bemerkung 2.5.1 Konvexe Funktionen sind für uns vor allem deshalb so attraktiv, weil wir uns in diesem Buch standardmäßig mit Minimierungsproblemen beschäftigen. Möchten Sie eher maximieren, so freuen Sie sich, wenn die zu maximierende Funktion konkav ist. Es gibt übrigens genau eine Klasse von Funktionen, die sowohl konvex als auch konkav sind, und das ist die Klasse der die linearen Funktionen, die Sie in Kap. 4 ausführlich kennenlernen werden. Mathematische Definition Der Epigraph einer Funktion f : Rn → R ist definiert als epi f = {(x, α) ∈ Rn × R| f (x) ≤ α}. Dies ermöglicht die erste Definition. Definition 2.5.1 Eine Funktion f : Rn → R ist genau dann konvex, wenn epi f eine konvexe Menge ist. Mehr über konvexe Funktionen und die Eigenschaften ihrer ersten Ableitungen und Tangenten lernen Sie in Abschn. 7.1.1. Eine weitere, komplett äquivalente Definition der Konvexität von Funktionen, wobei wir den Nachweis der Äquivalenz hier nicht erbringen, ist wie folgt. Definition 2.5.2 Eine Funktion f : Rn → R ist genau dann konvex, wenn f (λx + (1 − λy)) ≤ λ f (x) + (1 − λ) f (y) für alle x, y ∈ Rn und jedes λ ∈ [0, 1] gilt. Die anschauliche Interpretation der Definition 2.5.2 ist übrigens, dass der Graph von f unter jeder seiner Sekanten verläuft. Falls Sie das nicht direkt sehen, ist das nicht schlimm, aber es könnte sich trotzdem lohnen, hier kurz zu pausieren und die Definition für ein paar konkrete Funktionen, Punkte und Gewichte λ zu testen und am besten auch auf ein Blatt Papier zu malen.

2.5 Konvexität

2.5.3

27

Definitheit von Matrizen

Sie erinnern sich, dass wir dieses Kapitel mit der Frage begannen, welche quadratischen Funktionen f : Rn → R der Form f (x) = x T Qx + d T x + c sich im unrestringierten Fall, also ohne Hinzunahme weiterer Nebenbedingungen, minimieren lassen. Wir beginnen mit einer grundlegenden Beobachtung und motivieren anschließend die Definition sogenannter positiv semi-definiter Matrizen. Quadratische Funktionen lassen sich nicht minimieren, wenn die Funktionswerte für betragsmäßig große Werte von x gegen minus unendlich gehen. Dabei wird dieses sogenannte asymptotische Verhalten quadratischer Funktionen durch den quadratischen Term x T Qx dominiert. Falls dieser nicht null ist, wächst bzw. fällt der quadratische Term schneller als die linearen oder konstanten Teile es auszugleichen vermögen. Betrachten wir also diesen quadratischen Teil als potentielle Ursache allen Übels und aller Freude etwas genauer. Bereits die Existenz eines Punktes x¯ ∈ Rn mit x¯ T Q x¯ < 0 verheißt nichts Gutes für die Existenz von Minima der Funktion f (x) = x T Qx + d T x +c. Warum? Dieser Vektor x¯ ∈ Rn gibt eine Richtung vor, entlang derer sich der Funktionswert gegen minus unendlich treiben lässt. Dies können Sie nachvollziehen, ¯ und indem Sie zunächst dem quadratischen Teil den Namen q geben, q := x¯ T Q x, nun den Vektor x¯ mit einer Zahl t > 0 skalieren. Im Term ¯ + d T (t x) ¯ + c = t 2 q +td T x¯ + c f (t x) ¯ = (t x) ¯ T Q(t x)  0 für alle x ∈ Rn außer dem Nullvektor gilt, • negativ definit ist, wenn x T Qx < 0 für alle x ∈ Rn außer dem Nullvektor gilt, und • Q indefinit ist, wenn keine der obigen Bedingungen erfüllt ist. Ob eine Matrix Q ∈ Rn×n positiv semi-definit ist, lässt sich mithilfe der Definition nur schwer überprüfen, da Sie schlecht für alle Vektoren x ∈ Rn überprüfen können, ob x T Qx ≥ 0 gilt. So viel Zeit haben Sie nicht. Nun gibt es das folgende schlaue Resultat, das Sie ohne Beweis verwenden dürfen. Satz 2.5.3 Eine symmetrische Matrix Q ∈ Rn×n ist genau dann positiv semi-definit, wenn alle ihre Eigenwerte λ1 , . . . , λn nichtnegativ sind. Drei Fragen schwirren Ihnen nun vermutlich im Kopf umher: 1. Was ist eine symmetrische Matrix? 2. Was waren noch gleich Eigenwerte? 3. Was ist zu tun, wenn Q nicht symmetrisch ist? Hier folgen die zugehörigen Antworten: Ihrer 1. Für eine symmetrische Matrix Q gilt Q = Q T . Sie können Q alsoan  12 Diagonalen spiegeln, ohne dass sie sich verändert. Die Matrix Q = ist 21   12 symmetrisch und die Matrix V = nicht. 11

2.5 Konvexität

29

2. Was Eigenwerte sind, brauchen Sie hier nicht unbedingt zu wissen. Falls Sie es doch wissen möchten, lesen Sie hier weiter. Ein Vektor v ∈ Rn , der seine Richtung nicht ändert, wenn man ihn mit Q multipliziert, ist ein Eigenvektor von Q. Für diesen gibt es also eine Zahl λ mit Qv = λv. Dieser Streckfaktor λ ist der Eigenwert von Q zum Eigenvektor v. Es gibt immer n Eigenwerte von Q, wobei diese teilweise auch identisch sein können. Für allgemeine Matrizen Q können die Eigenwerte reelle oder komplexe Zahlen sein, und für eine komplexe Zahl ist leider gar nicht definiert, ob sie positiv oder negativ ist, sodass unser schönes Resultat oben nutzlos wäre. Falls Q jedoch symmetrisch ist, sind alle Eigenwerte reelle Zahlen, was uns zur nächsten Frage bringt. 3. Wenn Q nicht symmetrisch ist, haben Sie zum Glück kein Problem. Ersetzen Sie Q einfach durch Q˜ = 21 (Q + Q T ) und Sie werden sehen, dass Q˜ symmetrisch ˜ für alle x übereinstimmen. Die Forderung nach symist und x T Qx und x T Qx metrischen Matrizen ist also für quadratische Funktionen glücklicherweise keine echte Einschränkung. Sie können hier noch weiter in die Welt der Linearen Algebra abtauchen und zum Beispiel herausfinden, wie denn Eigenwerte berechnet werden können, falls Sie das noch nicht wissen. Es ist aber auch okay, hier eine Abkürzung zu wählen und sich auf den Standpunkt zu stellen, dass das Python für einen übernehmen kann. Um dies zu illustrieren, überprüfen wir mithilfe des folgenden Codes, ob die Matrix ⎛

⎞ 1 1 0 A = ⎝0 2 2⎠ 1 −1 5 positiv semi-definit ist. Sie importieren dazu Pythons berühmtes Paket für die Lineare Algebra namens numpy und geben ihm den abkürzenden Namen np. import numpy as np

Matrizen werden in numpy durch sogenannte Numpy Arrays definiert. Dies geschieht auch für Ihre Matrix A. A = np . array ( [ [2 , 1 , 0 ] , [0 , 2 , 2 ] , [1 , -1 , 5 ] ] )

Nun überprüfen Sie gemäß obiger Ausführungen zunächst, ob A symmetrisch ist. Sie möchten also wissen, ob A und A T identisch sind. Da bei der Arithmetik innerhalb eines Computers immer Rundungsfehler auftreten können, vergleichen wir A mit Ihrer Transponierten nicht exakt, sondern verwenden die np.allclose() Methode, die beim Vergleich kleine Abweichungen toleriert. Falls A nicht symmetrisch ist, wird nun mit der Matrix A˜ = 21 (A + A T ) weitergerechnet, was in Ihrem Beispiel auch der Fall ist.

30

2

Mathematische Grundlagen und Konvexität

if np . allclose (A , A . T ) : A_sym = A . copy () else : A_sym = 1 / 2 * ( A + A . T )

Nun geben Sie alle Eigenwerte von A aus print ( f " The eigenvalues of your matrix are { np . linalg . eigvals ( A_sym ) } " )

und überprüfen anschließend, ob die Matrix positiv semi-definit ist. if np . all ( np . linalg . eigvals ( A_sym ) > = 0 ) : print ( " Your matrix is positive semi definite . " ) else : print ( " Your matrix is NOT positive semi definite . " )

Sie erhalten die erfreuliche Nachricht: The eigenvalues of your matrix are [5.18614066 1.5 2.31385934] Your matrix is positive semi definite. Für sogenannte Diagonalmatrizen ist der Sachverhalt besonders einfach. Eine Matrix A ∈ Rn×n ist eine Diagonalmatrix, wenn alle Einträge außer den Diagonalelementen null sind. Die Einträge auf der Diagonalen a1,1 , a2,2 , . . . , an,n dürfen auch null sein, müssen es aber nicht. Die Matrizen ⎛ ⎞ ⎛ ⎞ 100 −1 0 0 A = ⎝0 2 0⎠ und B = ⎝ 0 2 0 ⎠ 000 0 0 10 sind Diagonalmatrizen. Überlegen Sie sich bitte selbst, warum die folgende Aussage wahr ist. Tipp: Denken Sie dabei an die Definition der positiven Semi-Definitheit, Sie wissen schon, diese Aussage, die für alle x ∈ Rn gelten soll mit dem x T Ax und so. Satz 2.5.4 Eine Diagonalmatrix A ∈ Rn×n ist genau dann positiv semi-definit, wenn alle Diagonalelemente a1,1 , . . . , an,n größer oder gleich null sind. Sind die obigen Matrizen A und B positiv semi-definit?

2.6

Eigenschaften konvexer Funktionen

In diesem Abschnitt können Sie nun endlich alle Puzzlestücke zusammenfügen, die Sie in den letzten Abschnitten gesammelt haben.

2.6 Eigenschaften konvexer Funktionen

2.6.1

31

Konvexe Funktionen und ihre Hesse-Matrizen

Hier zunächst ein wertvolles Stück Mathematik, das Ihnen ohne Beweis entgegengeschleudert wird. Satz 2.6.1 Eine zweimal stetig differenzierbare Funktion f : Rn → R ist genau dann konvex, wenn ihre Hesse-Matrix H f (x) für jedes x ∈ Rn positiv semi-definit ist, d. h., wenn H f (x) 0 für alle x ∈ Rn gilt. Sie können gern recherchieren, was es eigentlich bedeutet, eine zweimal stetig differenzierbare Funktion zu sein. Für dieses Buch genügt es zu wissen, dass quadratische Funktionen beliebig oft stetig differenzierbar sind, sodass Satz 2.6.1 für Sie sehr relevant ist. Da für eine quadratische Funktion f (x) = x T Qx+d T x+c die Hesse-Matrix H f (x) = 2Q gerade das Doppelte der Matrix Q ist, ist die Krümmung von f nicht abhängig von der Stelle x ∈ Rn , sondern nimmt überall dieselben Werte an. Das ist analog zu der Tatsache, dass die zweite Ableitung der eindimensionalen Funktion f (x) = ax 2 + bx + c überall konstant Wert f  (x) = 2a ist. Also vereinfacht sich die Aussage aus Satz 2.6.1 für quadratische Funktionen. Satz 2.6.2 Eine quadratische Funktion f : Rn → R mit f (x) = x T Qx + d T x + c ist genau dann konvex, wenn Q 0 gilt. Dabei wurde in Satz 2.6.2 ausgenutzt, dass der Faktor 2 in 2Q keinen Einfluss auf die positive Semi-Definitheit von Q hat und deshalb vernachlässigt werden kann. Nun betrachten Sie bitte die vier Funktionen, die wir zu Beginn von Abschn. 2.3.4 visualisiert haben, und überprüfen, ob Ihre mathematischen Erkenntnisse Ihr Bauchgefühl bestätigen. Zur Erinnerung, die Funktionen waren gegeben durch • • • •

f 1 (x) = f 2 (x) = f 3 (x) = f 4 (x) =

x12 + x22 , x12 , x1 · x2 und x12 − x22 .

Wir bringendie  Funktionen zunächst in die Matrix-Vektor-Form. x1 Mit x = ∈ R2 gilt x2  f 1 (x) = x T  f 3 (x) = x

T

 10 x, 01

 f 2 (x) = x T

 10 x, 00

   01 T 1 0 x und f 4 (x) = x x. 00 0 −1

32

2

Mathematische Grundlagen und Konvexität



10 01





10 00



Python wird Ihnen mitteilen, dass von den vier Matrizen nur und   10 positiv semi-definit sind. Dabei ist sogar positiv definit. Dementsprechend 01 sind f 1 und f 2 konvexe Funktionen und f 3 sowie f 4 nichtkonvex. Beachten Sie, dass Sie hier den kleinen Trick zur symmetrischer  Herstellung  01 Matrizen direkt ausprobieren können. Die Matrix ist nicht symmetrisch. 00 Jedoch können Sie diese durch die symmetrische Matrix 1 2



    1  01 00 0 + = 1 2 00 10 2 0

ersetzen und erhalten wieder  f 3 (x) = x T

0 1 2

1 2

0

 x = x1 · x2 .

Irgendwie magisch.

2.6.2

Summen konvexer Funktionen

Zu einer konvexen Funktion können Sie bedenkenlos weitere konvexe Funktionen addieren, ohne die Konvexität zu zerstören. Satz 2.6.3 Wenn f 1 : Rn → R und f 2 : Rn → R zwei konvexe Funktionen sind, dann ist die Summe ( f 1 + f 2 ) : Rn → R ebenfalls eine konvexe Funktion. Hier ist eine Begründung von Satz 2.6.3 für quadratische Funktionen, da diese hier eine wichtige Rolle spielen. Begründungen nennen Mathematikerinnen auch Beweise und beenden diese mit kleinen quadratischen Kästchen. Beweis Wenn f 1 = x T Q 1 x + d1T + c1 und f 2 = x T Q 2 x + d2T + c2 jeweils konvex sind, gilt Q 1 0 und Q 1 0. Die Funktion ( f 1 + f 2 )(x) = x T Q 1 x + d1T + c1 + x T Q 2 x + d2T + c2 = x T (Q 1 + Q 2 )x + (d1 + d2 )T + (c1 + c2 )

2.7 Grafische Zusammenfassung

33

ist also konvex, falls Q 1 + Q 2 0 gilt. Das ist jedoch der Fall, denn für beliebige x ∈ Rn erhalten Sie immer x T (Q 1 + Q 2 )x = x T Q 1 x + x T Q 2 x ≥ 0,       ≥0

≥0

und damit ist Q 1 + Q 2 positiv semi-definit und f 1 + f 2 konvex.

2.7

Grafische Zusammenfassung

Eine grafische Zusammenfassung dieses Kapitels finden Sie in Abb. 2.7.

Abb. 2.7 Grafische Zusammenfassung des Kap. 2



3

Unrestringierte quadratische Optimierungsmodelle

3.1

Motivation

Unrestringierte quadratische Optimierungsprobleme (UQP) sind, obwohl nicht explizit erwähnt, kontinuierliche Probleme, was bedeutet, dass alle auftretenden Entscheidungsvariablen kontinuierlich sind. Insbesondere treten keine diskreten Variablen wie etwa Binärvariablen auf. Unrestringiert bedeutet, dass die Optimierungsmodelle dieses Kapitels keine Restriktionen besitzen. Es bleibt also nur die Zielfunktion, die durch den Zusatz quadratisch eine quadratische Funktion zu sein hat. Dank Kap. 2 wissen Sie bereits, was quadratische Funktionen im Höherdimensionalen sind. Warum besprechen wir diese Modellklasse zuerst, und inwiefern ist sie für praktische Anwendungen relevant? Zu Schulzeiten haben Sie schon eindimensionale quadratische Polynome minimiert, indem Sie die zugehörige Ableitung gleich null gesetzt haben, um die resultierende Gleichung nach x aufzulösen. Dies sollte es Ihnen ermöglichen, das neue UQP-Wissen mit Ihrem Mathematikwissen aus Schulzeiten zu verknüpfen. Falls die quadratische Funktion konvex ist und einen Optimalpunkt besitzt, lässt sich dieser analog zum eindimensionalen „Auflösen nach x“ auch in mehrdimensionalen Räumen durch das Lösen eines linearen Gleichungssystems berechnen. Da hocheffiziente Solver für lineare Gleichungssysteme frei zugänglich sind, ermöglicht das die Lösung sehr großer praxisrelevanter Anwendungsprobleme, die unter anderem im Maschinellen Lernen zu finden sind.

Ergänzende Information Die elektronische Version dieses Kapitels enthält Zusatzmaterial, auf das über folgenden Link zugegriffen werden kann https://doi.org/10.1007/978-3-662-67381-2_3.

© Der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 N. Sudermann-Merx, Einführung in Optimierungsmodelle, https://doi.org/10.1007/978-3-662-67381-2_3

35

36

3.2

3

Einführung in Optimierungsmodelle

Lesehinweis

Es ist absolut legitim, die folgenden Abschnitte zu überspringen und sich direkt die Beispiele in Abschn. 3.6 zu Gemüte zu führen. Oft erweist es sich sogar als didaktisch wertvoll, zunächst spannende Anwendungen zu studieren und erst im nächsten Schritt zu versuchen, Erkenntnisse aus der Lektüre derselbigen zu verallgemeinern. Bei der Suche nach grundsätzlichen Eigenschaften der Problemklasse UQP werden Sie sich erneut mit Konvexität (vgl. Kap. 2) sowie erstmalig mit kritischen Punkten beschäftigen.

3.3

Modellklasse

Ein unrestringiertes quadratisches Optimierungsproblem UQP besteht aus einer quadratischen Zielfunktion und kontinuierlichen Entscheidungsvariablen. Es enthält keine Nebenbedingungen. In Matrix-Vektor-Schreibweise können Sie es mit einer Matrix Q ∈ Rn×n , einem Vektor d ∈ Rn sowie einer Zahl c ∈ R darstellen als UQP :

min x T Qx + d T x + c,

x∈Rn

und in Summenschreibweise gilt UQP :

minn

x∈R

n  n  i=1 j=1

qi j xi x j +

n 

di xi + c,

i=1

wobei die Daten qi j und di für i, j ∈ {1, . . . , n} die Einträge von Q bzw. d sind. Das Optimierungsmodell P kann nur eine Lösung besitzen, falls die Zielfunktion f : Rn → R, f (x) = x T Qx + d T x + c konvex ist. Ansonsten ist Q nach Satz 2.6.2 nicht positiv semi-definit, und aus Satz 2.5.2 folgt, dass P nach unten unbeschränkt und deshalb nicht lösbar ist. Umgekehrt ist die Konvexität von f nicht hinreichend für die Existenz einer Lösung, was in Abschn. 3.4 genauer erklärt wird. Merken Sie sich: Falls f nichtkonvex ist, ist das UQP ohnehin unlösbar. Falls f konvex ist, kann es eine Lösung besitzen, muss aber nicht. Erfreulicherweise müssen Sie die Lösbarkeit eines UQPs nicht im Voraus selbst sicherstellen, sondern können sich hier auf Solver zur Lösung von UQPs verlassen, die das für Sie herausfinden und Ihnen mitteilen (vgl. Abschn. 3.5.2). Bemerkung 3.3.1 Falls es sich bei UQP um ein Maximierungsproblem handelt, gilt entsprechend, dass das UQP nur lösbar sein kann, falls die Zielfunktion eine konkave Funktion ist! Bemerkung 3.3.2 In Bemerkung 3.4.2 werden Sie erfahren, warum Sie einem UQP bedenkenlos auch lineare Gleichungen hinzufügen dürfen, ohne das Leben für den Solver nennenswert komplizierter zu machen.

3.4 Mathematischer Hintergrund

3.4

37

Mathematischer Hintergrund

In Abschn. 3.4.1 lernen Sie, dass jede Nullstelle der Ableitung einer Funktion ein kritischer Punkt derselbigen ist. Ist die betreffende Funktion darüber hinaus noch konvex, haben Sie Grund zur Freude, weil dann der kritische Punkt auch ein Minimalpunkt der Funktion ist, wie Sie in Abschn. 3.4.2 erfahren werden.

3.4.1

Kritische Punkte

Anschauliche Erklärung Kritische Punkte sind entscheidend für den Verlauf der Steigung einer Funktion, da die Steigung dazu neigt, in einem kritischen Punkt ihr Vorzeichen zu wechseln. Welches sind die Punkte, in denen die Steigung der Funktionen • f 1 : R → R, f (x) = (x − 1)2 + 1, • f 2 : R → R, f (x) = −(x + 1)2 − 1 und • f 3 : R → R, f (x) = (x − 1)3 + 1 ihr Vorzeichen wechselt? Sie betrachten zunächst die Funktionsgraphen in Abb. 3.1 und analysieren anschließend den Sachverhalt. Bei f 1 und f 2 ist die Sache klar. Genau an den Nullstellen x = 1 bzw. x = −1 der jeweiligen Ableitungen springt die Steigung von einem negativen auf einen positiven Wert für f 1 bzw. von einem positiven auf einen negativen Wert für f 2 . Wir erhalten jeweils ein Minimum bzw. ein Maximum der Funktionen. Die Funktion f 3 spielt eine Sonderrolle. Die stets positive Steigung nimmt bei x = 1 den Wert Null an, täuscht also kurz in Richtung der negativen Zahlen an, um anschließend unbeschwert wieder größere Werte anzunehmen. Es findet also kein Vorzeichenwechsel der Steigung statt und wir erhalten einen Sattelpunkt. Jeder Punkt mit Steigung null ist ein sogenannter kritischer Punkt der Funktion, und kritische Punkte scheinen etwas mit Optimalpunkten einer Funktion zu tun zu haben.

Abb. 3.1 Die kritischen Punkte der Funktionen f 1 , f 2 und f 3

38

3

Einführung in Optimierungsmodelle

Mathematische Definition und Beispiele Falls der Gradient ∇ f (x) einer Funktion f : Rn → R eine Nullstelle besitzt, d. h., falls das Gleichungssystem ∇ f (x) = 0 eine Lösung x  ∈ Rn besitzt, ist x  ein kritischer Punkt von f . Beachten Sie hierbei, dass 0 ∈ Rn gilt, d. h., Sie sehen hier nicht die Zahl Null, sondern den großen Nullvektor ⎛ ⎞ 0 ⎜0 ⎟ ⎜ ⎟ 0 := ⎜ . ⎟ ∈ Rn ⎝ .. ⎠ 0 der Dimension n. Das Zeichen „:=“ bedeutet, dass die Variable auf der linken Seite definiert wird durch den Ausdruck auf der rechten Seite. Es handelt sich hier also um keine Gleichung, sondern um eine Bezeichnung des rechten Ausdrucks durch die linksstehende Variable. Da dies sehr platzraubend ist, werden wir auch zukünftig den Nullvektor mit 0 bezeichnen, sodass aus dem Kontext erschlossen werden muss, ob es sich hierbei um die Zahl oder den Nullvektor handelt. Das klingt aber komplizierter, als es im jeweiligen Moment sein wird. Beispiel 3.4.1 Der Gradient der Funktion f : R2 → R,

f (x) = x12 + 2x22 + x1 + 4

ist

∇ f (x) =

2x1 + 1 . 4x2

Sie lösen das Gleichungssystem ∇ f (x) = 0 und berechnen als Lösung von



2x1 + 1 0 = 4x2 0

den kritischen Punkt x  = − 21 , 0 der Funktion f . Beispiel 3.4.2 Die Funktion f : R2 → R,

f (x) = x12 + 2x2

mit

∇ f (x) =

2x1 2



3.4 Mathematischer Hintergrund

39

besitzt keinen kritischen Punkt, da das lineare Gleichungssystem

2x1 2

=



0 0

nicht lösbar ist.

3.4.2

Kritische Punkte konvexer Funktionen

Die folgende Tatsache liefert die Begründung dafür, warum konvexe Funktionen in der Welt der mathematischen Optimierung so gern gesehen sind. Satz 3.4.1 Die kritischen Punkte einer differenzierbaren konvexen Funktion f : Rn → R sind genau die Minimalpunkte von f . Differenzierbar bedeutet, dass die Funktion auch einen Gradienten besitzt, was beispielsweise durch Knicke im Funktionsgraphen verhindert werden kann. Zu Ihrer Beruhigung: Jede quadratische Funktion ist differenzierbar. Bemerkung 3.4.1 Analog zum Minimierungsfall sind die kritischen Punkte einer differenzierbaren konkaven Funktion f : Rn → R genau die Maximalpunkte von f . Da für eine quadratische Funktion f (x) = x T Qx + d T x + c mit einer symmetrischen Matrix Q (und Sie können Q gemäß Abschn. 2.5.3 immer so wählen, dass Q symmetrisch ist) der Gradient ∇ f (x) = 2Qx + d lautet, können alle kritische Punkte von f durch das Lösen des linearen Gleichungssystems 2Qx + d = 0

⇐⇒

2Qx = −d

berechnet werden, und Sie gelangen zu folgendem Satz. Satz 3.4.2 Die Minimalpunkte einer quadratische konvexen Funktion f : Rn → R, f (x) = x T Qx + d T x + c sind genau die Lösungen des linearen Gleichungssystems 2Qx = −d. Vorsicht ist bei der Interpretation von Satz 3.4.1 geboten! Hier steht nicht, dass jede konvexe Funktion einen Minimalpunkt hat. Wenn eine konvexe Funktion jedoch einen kritischen Punkt besitzt, was nicht immer der Fall ist, ist dieser auch ein Minimalpunkt von f .

40

3

Einführung in Optimierungsmodelle

Abb. 3.2 Links: Graph der Funktion f 1 : R2 → R mit f 1 (x) = x12 + 2x22 + x1 + 4, rechts: Graph der Funktion f 2 : R2 → R mit f 2 (x) = x12 + 2x2

Beispiel 3.4.3 Wir betrachten erneut die Funktionen f 1 , f 2 : R2 → R,

f 1 (x) = x12 + 2x22 + x1 + 4 und

f 2 (x) = x12 + 2x2

aus den Beispielen 3.4.1 und 3.4.2 mit den zugehörigen Gradienten



2x1 + 1 2x1 . und ∇ f 2 (x) = ∇ f 1 (x) = 2 4x2 Da die Hesse-Matrizen H f1 (x) =

20 04



und H f2 (x) =

20 00



beide positiv semi-definit sind (das hat Ihnen z. B. Python mitgeteilt), sind f 1 und f 2 konvex. Sie wissen also wegen Satz 3.4.1, dass jeder kritische Punkt von f 1 und f 2 auch deren Minimalpunkt ist. Nun erinnern Sie sich, dass x  = − 21 , 0 der einzige kritische Punkt von f 1 ist, der folglich auch ihr Minimalpunkt ist. Da f 2 als differenzierbare konvexe Funktion keinen kritischen Punkt besitzt, kann die Funktion leider auch nicht minimiert werden. Die Graphen von f 1 und f 2 entnehmen Sie Abb. 3.2. In Abb. 3.2 ist auch schön zu sehen, dass der Graph von f 2 einer Rutschbahn gleicht, auf der Sie gegen −∞ rutschen können.

Bemerkung 3.4.2 Aus Satz 3.4.2 wissen Sie, dass Sie die Lösung eines UQPs berechnen können, indem Sie das lineare Gleichungssystem 2Qx = −d lösen. Ob dieses Gleichungssystem ein paar Gleichungen mehr oder weniger enthält, macht üblicherweise für die Lösungszeit keinen großen Unterschied, weshalb ein Problem der Form min x T Qx + d T x + c s.t. Dx = e

x∈Rn

3.5 Praktische Hinweise

41

mit linearen Gleichungen in den Restriktionen durch das Lösen des Gleichungssystems 2Qx = −d, Dx = e minimiert wird und somit sehr große strukturelle Ähnlichkeiten zu einem UQP aufweist. Die Matrix D und der Vektor e sind dabei jeweils von passender Dimension, d. h., wenn Ihr Problem q Gleichungen enthält, gilt D ∈ Rq×n und e ∈ Rq .

3.5

Praktische Hinweise

3.5.1

Modellierungstricks

Unrestringierte quadratische Optimierungsmodelle geben sich manchmal nicht direkt zu erkennen. Beispiele für verkleidete UQPs sind etwa P1 :

min

x∈R2

x12 + (x2 − 1)2 + 2

und P2 :

min e2x1 +(x2 −1) 2

x∈R2

2 −3x

1

,

da sie dieselben Optimalpunkte besitzen wie P1 :

min x12 + (x2 − 1)2 + 2

x∈R2

und P2 :

min 2x12 + (x2 − 1)2 − 3x1 .

x∈R2

Warum sind die umformulierten Probleme äquivalent zu den ursprünglichen Varianten? Um von P1 auf P1 zu kommen, haben Sie die Zielfunktion quadriert. Nun ist es so, dass das Quadrieren nichtnegativer Zahlen die Ordnung der Zahlen nicht verändert. Das Quadrat einer kleinen Zahl ist kleiner als das Quadrat einer größeren Zahl. Definition 3.5.1 Für M ⊆ R und x, y ∈ M heißt eine Funktion φ : M → R mit φ(x) < φ(y) für x < y heißt streng monoton steigende Funktion auf M. Bemerkung 3.5.1 Im Fall M = R spricht man in Definition 3.5.1 auch einfach nur von einer streng monoton steigenden Funktion. In der Literatur ist es auch üblich, statt von streng monoton steigenden Funktionen auch von streng monoton steigenden Transformationen zu reden. Mathematisch formuliert, handelt es sich bei der Funktion φ(x) = x 2 für alle x ≥ 0 also um eine streng monoton steigende Funktion, was auch Abb. 3.3 illustriert. Diese

42

3

Einführung in Optimierungsmodelle

Abb. 3.3 Die Funktion f (x) = x 2 ist eine streng monoton steigende Funktion für x ≥ 0 (s. links), jedoch nicht für x ≥ −1 (s. rechts)

schöne Eigenschaft sorgt im obigen Beispiel dafür, dass die Ordnung der quadrierten Werte erhalten bleibt und somit der ursprüngliche Optimalpunkt auch nach dem Quadrieren der Zielfunktion noch der Punkt mit dem kleinsten Zielfunktionswert bleibt. Nehmen Sie sich bitte einen Moment Zeit, um die folgenden Fragen für obige Beispiele zu bearbeiten. 1. Wie lautet die Funktion φ, die Sie auf das Problem P2 angewandt haben, um es in P2 zu verwandeln? 2. Stimmen die Optimalwerte der ursprünglichen Probleme mit denen der umformulierten Varianten überein? Hier sind die Antworten. 1. Der natürliche Logarithmus wurde verwendet, um P2 in ein UQP umzuwandeln. Es gilt ln(e2x1 +(x2 −1) 2

2 −3x

1

) = 2x12 + (x2 − 1)2 − 3x1 ,

und da φ(x) = ln(x) für positive x eine streng monoton steigende Funktion ist, hat das alles so seine Richtigkeit. 2. Nein, die Optimalpunkte bleiben zwar durch die Transformation unverändert, aber für die Optimalwerte gilt dies in der Regel nicht. Beispielsweise ist leicht ersichtlich, dass der Optimalpunkt von P1 durch x  = (0, 1) gegeben ist und dementsprechend auch P1 löst. Setzen Sie x  jedoch in die jeweiligen Zielfunktionen ein, √ so erhalten Sie für P1 den Optimalwert v = 2 und für P1 den Zielfunktionswert 2. Sie müssen also in der Regel nach erfolgreicher Umformulierung und Lösen des resultierenden Problems daran denken, eine Rücktransformation durchzuführen, d. h. den Optimalpunkt in die ursprüngliche Zielfunktion einzusetzen.

3.5 Praktische Hinweise

43

Die aus dem Beispiel gewonnenen Erkenntnisse werden in folgendem Satz zusammengefasst, wobei wir die Notation f (M) := { f (x)| x ∈ M} für die Menge aller Zielfunktionswerte zulässiger Punkte einführen. Satz 3.5.1 Die Optimalpunkte von min f (x) s.t. x ∈ M x

und min φ( f (x)) s.t. x ∈ M x

stimmen überein, falls φ eine streng monoton steigende Funktion auf f (M) ist. Die beiden häufigsten Anwendungsfälle für Satz 3.5.1 sind in folgendem Trick zusammengefasst, wobei Sie natürlich auch die Null als möglichen Zielfunktionswert beim Quadrieren zulassen und hierfür den Trick von positiven auf nichtnegative Werte erweitern können. Beim Logarithmieren laufen Sie hier in Definitionsprobleme. 

Trick 2 Falls die Zielfunktion Ihres Optimierungsmodells positive Werte annimmt, können Sie sie quadrieren oder logarithmieren, ohne die Lage der Optimalpunkte zu verändern.

Beispiel 3.5.1 Die Optimalpunkte der Optimierungsprobleme P:

min x s.t. x ≥ −1

P :

min x 2 s.t. x ≥ −1

x∈R

und x∈R

stimmen nicht überein. Warum? Da es sich bei der Funktion φ : R → R, φ(x) = x + c für eine beliebige Konstante c ∈ R ebenfalls um eine streng monoton steigende Funktion handelt, ergibt sich daraus der folgende Trick. 

Trick 3 Additive Konstanten wie +42 oder –73 können in Zielfunktionen weggelassen werden. Der Optimalpunkt bleibt derselbe.

44

3.5.2

3

Einführung in Optimierungsmodelle

Implementierung und Lösung in Python

Wenn Sie das UQP P:

min x T Qx + d T x + c

x∈Rn

in Python implementieren und lösen möchten, haben Sie zwei Möglichkeiten. 1. Sie stecken P, so wie es ist, in einen Solver Ihres Vertrauens, der in der Lage ist, quadratische Optimierungsprobleme zu lösen. Dieser wird dann ggf. auch feststellen, dass Q nicht positiv semi-definit ist, und zurückgeben, dass es sich bei P um ein unbeschränktes Problem handelt. Das ist die Komfortvariante. Mögliche Solver für quadratische Optimierungsprobleme sind IPOPT, CVXOPT oder Gurobi, die auch Python-APIs bereitstellen. 2. Sie überprüfen in einem ersten Schritt, ob Q positiv semi-definit und symmetrisch ist. Dies kann beispielsweise mit numpy geschehen, wie Sie es in Abschn. 2.5.3 gesehen haben. Ist Q nicht symmetrisch, ersetzen Sie Q durch Q˜ = 21 (Q + Q T ) und fahren fort. Falls Q nicht positiv semi-definit ist, ist P nicht lösbar. Ist Q nicht positiv semi-definit, so können Sie gemäß Satz 3.4.2 alle Minimalpunkte von f als Lösungen des linearen Gleichungssystems 2Qx = −d berechnen. Falls das Gleichungssystem unlösbar ist, besitzt P keinen Minimalpunkt. Für die Lösung des linearen Gleichungssystems können Sie wieder numpy verwenden. Die Lösung des linearen Gleichungssystems ist im Vergleich zur Komfortvariante über die Solver quadratischer Optimierungsprobleme mit etwas mehr Arbeit verbunden. Für sehr große Optimierungsprobleme skaliert der zweite Ansatz jedoch in der Regel besser, da Verfahren zur Lösung linearer Gleichungssysteme zu den am besten erforschten Algorithmen gehören.

3.6

Beispiele und Anwendungen

3.6.1

Umsatzmaximierung im Einproduktfall

Das folgende Problem ist ein klassisches einfaches, aber instruktives Modell, das in jeder einführenden Mikroökonomie-Vorlesung präsentiert wird. Problembeschreibung Sie sind Produzentin eines Produkts, von dem Sie x Mengeneinheiten zum Preis p verkaufen möchten. Ihr Ziel ist es, den Umsatz p · x zu maximieren. Nun wissen Sie, dass die Nachfrage D( p) nach Ihrem Produkt mit steigendem Preis sinken wird. Eine Eigenschaft, die Sie auch aus Ihrem Alltag kennen und die Sie daher nicht weiter überrascht. Sie kaufen Ihr Brot schließlich auch lieber für 3 e statt für 10 e und würden ab einer gewissen Preisgrenze vermutlich komplett auf Croissants umsteigen. Die Nachfrage ist für p ≥ 0 und positive Zahlen M und k definiert als D( p) = max(M − k · p, 0).

3.6 Beispiele und Anwendungen

45

Das Modell Das Optimierungsmodell ist gegeben durch max p · x s.t. x = M − k · p, p,x

da Sie natürlich die komplette Nachfrage bedienen möchten und daher x = M −k · p setzen. Diese Gleichung können Sie nun durch Substitution (Ersetzen) von x wieder in die Zielfunktion schmuggeln und erhalten das UQP P:

max p · (M − k · p). p

Da es sich hier um ein Maximierungsproblem handelt, muss gemäß Bemerkung 3.3.1 die Zielfunktion f ( p) = p · (M − k · p) = −kp 2 + M p konkav sein. Wir überprüfen die beiden Ableitungen k 0

von f und stellen erleichtert fest, dass f wegen f  ( p) < 0 konkav und daher potentiell lösbar ist. In Abb. 3.4 sehen Sie eine Visualisierung der zu maximierende Zielgröße p · x.

Abb. 3.4 Der zu maximierende Umsatz entspricht dem Flächeninhalt des Rechtecks, das durch das Dreieck und die Koordinatenachsen begrenzt wird.

46

3

Einführung in Optimierungsmodelle

Hier wird auch ersichtlich, warum wir den Fall D( p) = 0 in den Nebenbedingungen vernachlässigt haben. Für D( p) = 0, also einen zu hohen Preis p, verschwindet der erwartete Profit unabhängig von der Wahl der Menge x. Dieser Fall ist offensichtlich suboptimal. Die Lösung Für dieses kleine Beispiel können wir die Lösung von Hand berechnen. Gemäß Bemerkung 3.4.1 berechnen wir die kritischen Punkte der konkaven Funktion f , um ihre Maximalpunkte zu erhalten. Es gilt f  ( p) = 0 ⇐⇒ −2kp + M = 0 ⇐⇒ p =

M , 2k

was bedeutet, dass der umsatzmaximierende optimale Preis p  gegeben ist durch M . Für diesen Preis p  erhalten Sie den optimalen Umsatz p  = 2k M v = f ( p ) = p · (M − k · p ) = 2k 







M M −k· 2k

=

M2 M2 M2 − = . 2k 4k 4k

Fertig.

3.6.2

Abstand, Punkt und Hyperebene

Hier ist ein kleines geometrisches Problem, dessen zugrundeliegende Struktur typisch für Anwendungsfälle von UQPs ist. Falls Sie über den Begriff „Hyperebene“ gestolpert sind, stellen Sie sich bitte einfach eine Gerade vor. Eine Hyperebene stellt die Verallgemeinerung einer Geraden im Höherdimensionalen dar. Formal ist eine Hyperebene H im Rn definiert als die Lösungsmenge einer linearen Gleichung. Es gilt also H = {x ∈ Rn | a T x = b} = {x ∈ Rn | a1 x1 + · · · + an xn = b}

für einen Vektor a ∈ Rn und eine Zahl b ∈ R. Problembeschreibung Sie erhalten die Hyperebene H = {x ∈ R2 | x1 − x2 = 1}

sowie den Punkt x¯ = (1, 1) verbunden mit folgenden Fragen: 1. Wie weit ist der Punkt x¯ von H entfernt? ¯ 2. Welcher Punkt x  der Ebene H besitzt den kürzesten Abstand zu x?

3.6 Beispiele und Anwendungen

47

Fröhlich pfeifend machen Sie sich an die Arbeit. Das Modell Obwohl das vorgestellte Problem elementargeometrisch im R2 zu lösen ist, möchten wir es dimensionsunabhängig formulieren, sodass es auch problemslos im R1234 gelöst werden kann. Dazu müssen wir uns zunächst mit dem Begriff des Abstands d(x, y) zweier Punkte x und y im Rn beschäftigen. Der Abstand (auch Metrik genannt) d(x, y) zweier Punkte x = (x1 , x2 ) ∈ R2 und y = (y1 , y2 ) ∈ R2 ist typischerweise als Länge der Verbindungslinie durch

d(x, y) := (x1 − y1 )2 + (x2 − y2 )2 definiert und wird als euklidscher Abstand bezeichnet. Im Rn messen wir Abstände gemäß   n  d(x, y) :=  (xi − yi )2 . i=1

Es gibt jede Menge anderer Möglichkeiten, sinnvoll Abstände zu messen. Beispielsweise hilft Ihnen die 1 -Norm d1 (x, y) :=

n 

|xi − yi |,

i=1

Routen durch rechteckige Straßennetze zu planen, was ihr den Namen ManhattanNorm eingebracht hat. Als weitere Stichwörter für Ihre Internetsuche werfen wir noch „Maximumsnorm“ bzw. allgemein den Begriff der „ p -Norm“ in den Raum. Um den Punkt x ∈ H zu finden, der den Abstand zu x¯ minimiert, stellen wir das Optimierungsproblem min d(x, x) ¯ s.t. x ∈ H x

auf, das sich umformulieren lässt zu   n n   min  (xi − x¯i )2 s.t. ai xi = b. x

i=1

i=1

Die Gleichung in der Nebenbedingung ist gemäß Bemerkung 3.4.2 als Bestandteil eines UQP akzeptabel, jedoch handelt es sich wegen der Wurzel in der Zielfunktion nicht um ein UQP. Satz 3.5.1 erlaubt es allerdings, die Zielfunktion zu quadrieren, ohne die Lage der Optimalpunkte zu verändern, da alle Terme unter der Wurzel nichtnegativ sind, sodass wir das ursprüngliche Problem in das UQP n n   2 (xi − x¯i ) s.t. ai xi = b min x

i=1

i=1

48

3

Einführung in Optimierungsmodelle

verwandeln konnten. Die Lösung Das obige Problem wird in der Literatur als Projektion des Punktes x¯ auf die Hyperebene H bezeichnet und besitzt eine geschlossene Lösungsformel, d. h. eine Formel, die Ihnen für jede Hyperebene H und jeden Punkt x¯ direkt die Projektion von x¯ auf H berechnet. Wir möchten Ihnen dennoch das zugehörige Optimierungsmodell präsentieren, da bereits die Projektion eines Punktes x¯ auf weniger simple Objekte wie Polyeder (s. Abschn. 4.3.2) ein echtes Optimierungsproblem darstellt, für das es keine Lösungsformel gibt. Zunächst jedoch die händische Lösung für das kleine Beispiel. Mit den obigen Daten lautet das zu lösende Problem min (x1 − 1)2 + (x2 − 1)2 s.t. x1 − x2 = 1.

x∈R2

Wenn Sie die Gleichung nach x1 auflösen und in die Zielfunktion einsetzen, erhalten Sie das das unrestringierte eindimensionale Optimierungsproblem min (x2 + 1 − 1)2 + (x2 − 1)2 ,

x2 ∈R

das sich vereinfachen lässt zu min 2x22 − 2x2 + 1.

x2 ∈R

Eine Untersuchung der Ableitungen f  (x2 ) = 4x2 − 2 und f  (x2 ) = 4 belohnt uns mit der Erkenntnis, dass die Funktion f konvex ist und ihr kritischer Punkt sich als Lösung der Gleichung 4x2 −2 = 0 bei x2 = 21 befindet. Der zugehörige optimale x1 -Wert ist x1 = 1 + x2 = 23 und der Abstand von H zu x¯ ist gegeben durch  

2

2 3 1 1 v = = −1 + −1 . 2 2 2 Seien Sie ehrlich, hätten Sie bei der Rücktransformation die Wurzel vergessen? Das ist eine beliebte Fehlerquelle bei der Transformation von Optimierungsmodellen, deren man sich bewusst sein sollte. In Abb. 3.5 sehen Sie die Hyperebene, die im R2 eine Gerade ist, sowie den zu projizierenden Punkt x, ¯ der auf den Punkt x  projiziert wurde. Hier noch der Vollständigkeit halber der zugehörige Python-Code, falls Sie eine modifizierte Version davon implementieren möchten, für die es keine Lösungsformel geben sollte.

3.6 Beispiele und Anwendungen

49

Abb. 3.5 Die Projektion des Punktes x¯ auf die Gerade ergibt den Punkt x  .

from gurobipy import GRB , Model from math import sqrt # Coefficients hyperplane a = [1 , - 1 ] # RHS h y p e r p l a n e b = 1 # Point to be p roje cted x_bar = [1 , 1 ] # Number of d imensions n = len ( a ) # Model d e c l a r a t i o n m = Model ( " Projection line " ) # Decision variables x = m . addVars ( range ( n ) , lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS ) # Objective function m . setObjective ( sum (( x [ i ] - x_bar [ i ] ) ** 2 for i in range ( n ) ) ) # Constraint m . addConstr ( sum ( a [ i ] * x [ i ] for i in range ( n ) ) = = b ) # Solve st a t e m e n t m . optimize () # Print results print ( f " Distance from xbar to projection : { sqrt ( m . ObjVal ) } " ) print ( f " Coordinates projection : { [ x [ i ]. X for i in x ] } " )

Sie werden in den folgenden Abschnitten über lineare Gleichungssysteme oder Regressionsprobleme aus der Statistik feststellen, dass die dort auftauchenden Optimierungsmodelle ganz ähnlicher Natur sind.

50

3.6.3

3

Einführung in Optimierungsmodelle

Über die Äquivalenz linearer Gleichungssysteme und UQPs

Problembeschreibung Sie sind auf einer einsamen Insel gestrandet und möchten das lineare Gleichungssystem x1 + x2 + x3 = 2, x1 + x3 = 4, 2x1 − x2 = 4 lösen. Leider haben Sie vergessen, einen Lösungsalgorithmus für lineare Gleichungen einzupacken, und finden stattdessen nur einen UQP-Solver im Handgepäck. Besteht Grund zur Hoffnung? Können Sie das Problem trotzdem lösen? Das Modell Sie wissen aus Satz 3.4.2, dass die Minimalpunkte quadratischer konvexer Funktionen genau die Lösungen von linearen Gleichungssystemen sind. Diese Aussage lässt sich auch umkehren! Die Lösung eines linearen Gleichungssystems lässt sich als Optimalpunkt eines UQP darstellen. Das Ganze funktioniert folgendermaßen: Sie fassen die Koeffizienten eines linearen Gleichungssystems mit m Zeilen und n Spalten in einer Matrix A ∈ Rm×n zusammen und suchen einen Lösungsvektor x ∈ Rn mit n Unbekannten, der das Gleichungssystem Ax = b löst, wobei b ∈ Rm der Vektor ist, der die rechten Seiten des linearen Gleichungssystems enthält. Das weitere Vorgehen ist durch die Beobachtung motiviert, dass 2x = 5 genau dann gilt, wenn 2x − 5 = 0 ist, was wiederum genau dann der Fall ist, wenn (2x − 5)2 = 0 ist. Oh! Sie haben eine quadratische Funktion herbeigezaubert. Im Höherdimensionalen verwenden wir die sogenannte 2 -Norm eines Vektors x ∈ Rn , die das Symbol x 2 erhält und definiert ist durch   n  x 2 :=  xi2 . i=1

Sie meditieren etwas über der Formel und beobachten, dass x 22 =

n 

xi2 = x T x ≥ 0

(3.1)

i=1

gilt. Die 2 -Norm wird auch als euklidsche Norm bezeichnet. Da nur für den Nullvektor x = 0 ∈ Rn gilt x 2 = 0 = x 22 , ist x ∈ Rn genau dann eine Lösung von Ax = b, wenn Ax − b 22 = 0

3.6 Beispiele und Anwendungen

51

gilt. Also löst x das Gleichungssystem Ax = b, falls es ein Optimalpunkt des Optimierungsproblems P:

min Ax − b 22

x∈Rn

mit Optimalwert v = 0 ist. Ist P ein UQP? Unrestringiert und kontinuierlich ist es offensichtlich, da x eine kontinuierliche Entscheidungsvariable ist und P keine Nebenbedingungen besitzt. Ein genauerer Blick auf die Zielfunktion f (x) = Ax − b 22 in Kombination mit Gl. (3.1) offenbart, dass Sie f umformulieren können zu f (x) = Ax − b 22 = (Ax − b)T (Ax − b).

(3.2)

Gemäß den Rechenregeln für Matrix-Vektor-Produkte, die Sie zur Not jetzt einfach nachschlagen, gilt also f (x) = xT AT A x + (−2) · bT A x + bT b Q

dT

c

und Sie erkennen, dass f eine quadratische Funktion mit Q = A T A, d = (−2)· A T b und c = b T b ist. Es bleibt noch zu klären, ob f konvex ist. Wie Sie wissen, ist hierfür entscheidend, ob A T A positiv semi-definit ist. Sie brauchen hier keine Eigenwerte zu berechnen, sondern können über die ursprüngliche Definition von positiver Semi-Definitheit argumentieren und zeigen, dass x T Qx ≥ 0 für alle x ∈ Rn gilt. Das ist zum Glück einfach zu sehen! Für einen beliebigen Vektor x ∈ Rn gilt nämlich x T Qx = x T A T Ax = (Ax)T Ax = Ax 2 ≥ 0. Somit ist Q = A T A positiv semi-definit und damit f (x) = Ax − b 22 eine konvexe Funktion, was P zu einem UQP macht. Zusammenfassend können Sie also statt dem linearen Gleichungssystem Ax = b auch das UQP P:

min (Ax − b)T (Ax − b)

x∈Rn

lösen, und falls P den Optimalwert v = 0 besitzt, stimmen die Lösungen beider Probleme überein.

52

3

Einführung in Optimierungsmodelle

Bemerkung 3.6.1 Unrestringierte quadratische Optimierungsprobleme lassen sich also als Lösung linearer Gleichungssysteme formulieren, die sich wiederum als Optimalpunkte von UQPs berechnen lassen. Was auf dem erstem Blick verwirrend sein mag, ergänzt sich hervorragend. Warum? Es gibt verschiedene numerische Verfahren zur Lösung linearer Gleichungssysteme. Einige verzichten auf die Interpretation als Optimierungsproblem und lösen es direkt wie das aus der Schule bekannte Gauß’sche Eliminationsverfahren. Andere lösen das Gleichungssystem durch Optimierungsmethoden wie dem CG-Verfahren (conjugate gradients) und nutzen dabei aus, dass die Lösung des linearen Gleichungssystems auch ein Optimalpunkt des Optimierungsproblems P ist. Es sind zwei Seiten derselben Medaille. Suchen Sie sich je nach Anwendungsfall die jeweils schönere Seite aus und profitieren Sie von den zugehörigen Lösungsmethoden. Bemerkung 3.6.2 Falls P einen Optimalwert v > 0 besitzt, wissen Sie, dass Ax = b nicht lösbar ist. Trotzdem kann die berechnete Lösung des UQPs je nach Anwendungsfall relevant sein, da sie den sogenannten 2 -Fehler zwischen Ax und b minimiert. Der wohl prominenteste Anwendungsfall dafür ist die lineare Regression per Minimierung der Fehlerquadrate, die Sie in Abschn. 3.6.6 kennenlernen werden. Die Lösung Die Optimalpunkte von P ergeben sich als Nullstellen des Gradienten ∇ f (x) = 2 · A T Ax + (−2) · A T b, und die Gleichung 2 · A T Ax + (−2) · A T b = 0 ist äquivalent zu A T Ax = A T b.

(3.3)

Bemerkung 3.6.3 Falls m ≥ n gilt, ist die Matrix A T A ∈ Rn×n eine sogenannte Gram’sche Matrix, die im Bereich Data Science wichtig ist. Sie können in einer Mathematikquelle Ihrer Wahl erfahren, dass eine Gram’sche Matrix A T A genau dann invertierbar ist, wenn alle Spalten von A linear unabhängig sind. In diesem Fall existiert (A T A)−1 und x = (A T A)−1 A T b ist der eindeutige Optimalpunkt von P und damit die einzige Lösung des linearen Gleichungssystems. Beachten Sie, dass numerische Verfahren zur Ermittlung von x nie explizit die Inverse (A T A)−1 berechnen, sondern stattdessen das lineare Gleichungssystem (3.3) lösen. Das macht einen großen Unterschied, da die Komplexität eines Algorithmus zur Invertierung deutlich schlechter ist als die Komplexität eines LGS-Solvers.

3.6 Beispiele und Anwendungen

53

Hier ist der Python-Code, der beliebige lineare Gleichungssysteme als UQP formuliert und löst. from gurobipy import GRB , Model import numpy as np # A # b # m n

C o e f f i c i e n t s linear e q u a t i o n s system = np . array ( [ [1 , 1 , 1 ] , [1 , 0 , 1 ] , [2 , -1 , 0 ] ] ) RHS = np . array ( [2 , 4 , 4 ] ) Di m e n s i o n = A . shape [ 0 ] = A . shape [ 1 ]

# Model d e c l a r a t i o n model = Model ( " Linear equations system " ) # Decision variables x = model . addVars ( range ( n ) , lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS ) # Ob j e c t i v e f u n c t i o n model . setObjective ( sum ( ( sum ( A [i , j ] * x [ j ] for j in x ) - b [ i ] ) * ( sum ( A [i , j ] * x [ j ] for j in x ) - b [ i ] ) for i in range ( m ) ) ) # Solve s t a t e m e n t model . optimize () # Print results print ( f " Solution : { [ x [ i ]. X for i in x ] } " )

Beachten Sie, dass gurobipy auch sogenannte Matrixvariablen unterstützt, mit deren Hilfe sich die Zielfunktion auch ohne die Verwendung von Summenzeichen als Matrix-Vektor-Produkt hätte formulieren lassen. Hier wurde die elementare Version mit Summen gewählt, um auch eine Übertragbarkeit auf andere, weniger fortgeschrittene Modellierungsframeworks zu vereinfachen.

3.6.4

Mittlerer quadratischer Abstand zu Zahlen

Das folgende Beispiel lässt sich leicht von Hand lösen, weist jedoch eine interessante mathematische Struktur auf, die Sie in komplexeren Anwendungen wiederfinden werden. Problembeschreibung Bestimmen Sie die Zahl x, die den mittleren quadratischen Abstand, auch mean squared error (MSE), zu den Zahlen 1, 34, 5, 6, 3, 7, 8, 5, 6, 89, 4, 56, 234, 5, 6, 3457, 8, 45, 2, 35, 3 minimiert.

54

3

Einführung in Optimierungsmodelle

Das Modell Sie formulieren Ihr Modell allgemein für N Zahlen a1 , . . . , a N ∈ R, da Sie es nicht nur für die obigen 21 Zahlen, sondern allgemein modellieren möchten. Die einzige Entscheidungsvariable ist die Zahl x ∈ R, die optimal gewählt werden soll. Da das Problem unrestringiert ist, enthält es keine Nebenbedingungen, die x zu erfüllen hat. Die Zielfunktion f : R → R lautet f (x) =

N 1  (ai − x)2 , N i=1

die pro Zahl ai den quadratischen Abstand (ai − x)2 zu x angibt und alle Abstände aufsummiert. Die Zielfunktion f ist ein quadratisches Polynom, und Sie überprüfen zunächst, ob f konvex ist. Wegen f  (x) = −

N 2  (ai − x) und f  (x) = 2 > 0 · N i=1

ist f eine konvexe Funktion. Sie schreiten also zur Tat und berechnen den kritischen Punkt x  von f : f  (x) = 0 ⇐⇒ −

N 2  (ai − x) = 0 · N i=1

⇐⇒

N 

(ai − x) = 0

i=1

⇐⇒

N 

ai − N x = 0

i=1

⇐⇒ x =

N 1  ai N i=1

Dereinzige kritische Punkt von f und damit der Optimalpunkt ist damit x  = N 1 i=1 ai . Hätten Sie damit gerechnet? Das arithmetische Mittel von N Zahlen N ergibt also den Punkt, den den MSE im eindimensionalen Fall minimiert. Die Lösung Für obige Werte erhalten Sie x  = 191.38, was daran liegt, dass der Ausreißer 3457 das arithmetische Mittel sehr in die Höhe zieht. Ein robusteres Maß für das Zentrum einer Datenwolke ist der Median, der in diesem Fall bei 7 liegt und damit die Werte deutlich besser zu repräsentieren scheint. Wie immer sind Sie nur eine Internetsuche von neuem Wissen entfernt, falls Ihnen beispielsweise entfallen sein sollte, wie der Median definiert ist.

3.6 Beispiele und Anwendungen

3.6.5

55

Univariate lineare Regression und die Methode der kleinsten Quadrate

Problembeschreibung In [28] finden Sie Datenpaare, die das Körpergewicht sowie das Gewicht des Gehirns für 65 Tierarten enthalten. Sie vermuten, dass das Gewicht des Gehirns vermutlich mit steigendem Körpergewicht zunimmt und möchten den Zusammenhang quantifizieren. Nachdem Sie sechs Ausreißer aus den Daten entfernt haben, darunter etwa der Blauwal, der im Vergleich zu seinem enormen Körpergewicht ein recht kleines Gehirn hat, visualisieren Sie die verbleibenden Daten wie in Abb. 3.6 in Originalform und anschließend logarithmiert. Die Grafik legt nahe, dass ein linearer Zusammenhang zwischen den logarithmierten Daten vorliegt, und Sie möchten eine lineare Funktion finden, die es ermöglicht anhand des Körpergewichts eine Vorhersage über das Gewicht des Gehirns zu treffen. Für die Parameterschätzung der linearen Funktion möchten Sie als Fehlermaß die mittlere quadratische Abweichung minimieren, die im Englischen als Abkürzung für mean squared error auch MSE genannt wird. Das Modell In diesem Beispiel ist die Zielgröße das Gewicht des Gehirns, das nur vom Körpergewicht abhängt, was wir als Einflussgröße bezeichnen. Satt von Zielgrößen und Einflussgrößen würde man in der Machine Learning Community eher von Labels und Features sprechen. Gesucht ist also eine lineare Funktion f β (x) = β0 + β1 x, die für ein gegebenes logarithmiertes Körpergewicht x das zugehörige logarithmierte Gewicht des Gehirns f β (x) vorhersagt. Diese Funktion f β (x) soll durch eine optimale Wahl des Achsenabschnitts β0 und der Steigung β1 bestimmt werden, die wir

Abb.3.6 Körpergewicht und das Gewicht des Gehirns für 59 Tierarten (links: Originaldaten, rechts: logarithmiert), Daten aus [28]

56

3

im Vektor β=

Einführung in Optimierungsmodelle



β0 β1

zusammenfassen. Um β optimal zu bestimmen, betrachten Sie die n Paare (xi , yi ), i ∈ {1, . . . , n} aus logarithmiertem Körper- und Gehirngewicht. Der MSE besteht nun ähnlich wie in Abschn. 3.6.4 aus dem mittleren summierten quadrierten Abstand zwischen den Vorhersagewerten f β (xi ) und den zugehörigen Labels yi . Die zu minimierende Verlustfunktion L : R2 → R lautet L(β) =

n n 1 1 ( f β (xi ) − yi )2 = (β0 + β1 xi − yi )2 n n i=1

i=1

und wird üblicherweise eher mit dem englischen Wort loss function bezeichnet. Die Minimierung von L wird auch die Methode der kleinsten Quadrate genannt und beschert Ihnen das unrestringierten quadratischen Optimierungsproblem P:

min

β∈R2

n 1 (β0 + β1 xi − yi )2 . n i=1

Ist L : R2 → R eine konvexe Funktion in β ∈ R2 ? Da die weiteren Untersuchungen in Summenschreibweise etwas lästig werden, führen wir die Designmatrix ⎞ 1 x1 ⎟ ⎜ X = ⎝ ... ⎠ , 1 xn ⎛

den Koeffizientenvektor β =



β0 β1

und den Vektor der Vorhersagewerte ⎛ ⎞ y1 ⎜ .. ⎟ y = ⎝.⎠ yn ein. Jetzt gilt nämlich ⎞ β0 + β1 x1 − y1 ⎟ ⎜ .. Xβ − y = ⎝ ⎠ . ⎛

β0 + β1 xn − yn

3.6 Beispiele und Anwendungen

57

und somit n 

(β0 + β1 xi − yi )2 = (X β − y)T (X β − y).

i=1

Das erlaubt Ihnen, P in einer wunderschönen Matrix-Vektor-Schreibweise zu formulieren: 1 P: min (X β − y)T (X β − y) 2 β∈R n Wenn Sie den Vorfaktor n1 ignorieren, da dieser zwar gut ist für die numerische Stabilität des Lösungsalgorithmus, aber für die Konvexität von L keine Rolle spielt, sehen Sie, dass es sich hierbei genau um das Problem (3.2) handelt! Im zugehörigen Abschnitt ging es zwar um die Äquivalenz von linearen Gleichungssystemen zu UQPs, aber die mathematische Grundlage scheint identisch zu sein. Spannend! Insbesondere wurde dort schon die Konvexität der Zielfunktion von P gezeigt, sodass Sie sich diese Ausführungen hier sparen können. Bemerkung 3.6.4 Wenn Sie die partielle Ableitung setzen, erhalten Sie

∂L ∂β0 (β)

bilden und gleich null

n n 1 2 (β0 + β1 xi − yi ) = 0 ⇐⇒ β0 = (yi − β1 xi ). n n i=1

i=1

Für den Spezialfall, in dem alle xi= 0 sind, landen Sie wieder im Beispiel aus n yi . Abschn. 3.6.4 und erhalten β0 = n1 i=1 Die Lösung Selbstverständlich können Sie die lineare Regression mit der Methode der kleinsten Quadrate mit verschiedenen Python-Paketen aus dem Bereich Machine Learning, wie beispielsweise sklearn, durchführen. Hier sehen Sie, wie Sie P explizit mithilfe des Solvers Gurobi lösen können. Ein Solver für Optimierungsprobleme wird dieses spezielle Optimierungsproblem langsamer lösen als zugeschnittene RegressionsAlgorithmen, hat jedoch den Vorteil, dass das Modell beliebig um weitere kontinuierliche und ganzzahlige Entscheidungsvariablen sowie lineare und quadratische Nebenbedingungen ergänzt werden kann, was manchmal recht praktisch sein kann. Es folgt der auszuführende Code. Zunächst importieren Sie das Paket gurobipy, das Gurobi enthält, sowie das Lineare-Algebra-Paket numpy. import numpy as np from gurobipy import GRB , Model , xsum

Jetzt definieren Sie die Rohdaten und entfernen die Ausreißer.

58

3

Einführung in Optimierungsmodelle

# Raw data data_raw = [ ( 1 . 35 , 8 . 1 ) , ( 465 , 423 ) , ( 36 . 33 , 119 . 5 ) , ( 27 . 66 , 115 ) , ( 1 . 04 , 5 . 5 ) , ( 11700 , 50 ) , ( 2547 , 4603 ) , ( 187 .1 , 419 ) , ( 521 , 655 ) , ( 10 , 115 ) , ( 3 .3 , 25 . 6 ) , ( 529 , 680 ) , ( 207 , 406 ) , ( 62 , 1320 ) , ( 6654 , 5712 ) , ( 9400 , 70 ) , ( 6 .8 , 179 ) , ( 35 , 56 ) , ( 0 . 12 , 1 ) , ( 0 . 023 , 0 . 4 ) , ( 2 .5 , 12 . 1 ) , ( 55 .5 , 175 ) , ( 100 , 157 ) , ( 52 . 16 , 440 ) , ( 0 . 28 , 1 . 9 ) , ( 87000 , 154 . 5 ) , ( 0 . 122 , 3 ) , ( 192 , 180 ) ,( 3 . 385 , 44 . 5 ) , ( 0 . 48 , 15 . 5 ) , ( 14 . 83 , 98 . 2 ) , ( 4 . 19 , 58 ) , ( 0 . 425 , 6 . 4 ) , ( 0 . 101 , 4 ) , ( 0 . 92 , 5 . 7 ) , (1 , 6 . 6 ) , ( 0 . 005 , 0 . 14 ) , ( 0 . 06 , 1 ) , ( 3 .5 , 10 . 8 ) , (2 , 12 . 3 ) , ( 1 .7 , 6 . 3 ) , ( 0 . 023 , 0 . 3 ) , ( 0 . 785 , 3 . 5 ) , ( 0 .2 , 5 ) , ( 1 . 41 , 17 . 5 ) , ( 85 , 325 ) , ( 0 . 75 , 12 . 3 ) , ( 3 .5 , 3 . 9 ) , ( 4 . 05 , 17 ) , ( 0 . 01 , 0 . 25 ) , ( 1 .4 , 12 . 5 ) , ( 250 , 490 ) , ( 10 . 55 , 179 . 5 ) , ( 0 . 55 , 2 . 4 ) , ( 60 , 81 ) , ( 3 .6 , 21 ) , ( 4 . 288 , 39 . 2 ) , ( 0 . 075 , 1 . 2 ) , ( 0 . 048 , 0 . 33 ) , (3 , 25 ) , ( 160 , 169 ) , ( 0 .9 , 2 . 6 ) , ( 1 . 62 , 11 . 4 ) , ( 0 . 104 , 2 . 5 ) , ( 4 . 235 , 50 . 4 ) , ] # Remove outliers data = [ d for d in data_raw if d [ 0 ] < 2000 and d [ 1 ] < 1000 ]

Die für die Optimierung benötigten Daten bringen Sie in entsprechenden Listen unter. # x N # y

Data points = [ np . log ( d [ 0 ] ) for d in data ] = len ( x ) Labels = [ np . log ( d [ 1 ] ) for d in data ]

Nun können Sie Ihr Modell deklarieren # Model d e c l a r a t i o n m = Model ( " Linear Regression 1D " )

und anschließend die Entscheidungsvariablen # De c i s i o n v a r i a b l e s intercept = m . addVar ( lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS ) slope = m . addVar ( lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS )

sowie die Zielfunktion # Ob j e c t i v e f u n c t i o n m . setObjective ( 1 / N * xsum (( intercept + slope * x [ i ] - y [ i ] ) ** 2 for i in range ( N ) ) )

definieren. Es fehlen noch das Solve-Statement # Solve s t a t e m e n t m . optimize ()

sowie die Ausgabe der Optimierungsergebnisse. # Print results print ( f " Optimal intercept : { intercept . X } " ) print ( f " Optimal slope : { slope . X } " )

3.6 Beispiele und Anwendungen

59

Abb. 3.7 Ergebnis der linearen Regression für die Datenpaare aus [28]

Geschafft. Glücklich lesen Sie die Ergebnisse ab Optimal intercept : 2. 1139167846965825 Optimal slope : 0. 7352790938387297

und visualisieren anschließend die Gerade wie in Abb. 3.7.

3.6.6

Multivariate lineare Regression und die Methode der kleinsten Quadrate

In diesem Abschnitt möchten wir die Ergebnisse der univariaten Regression des Abschn. 3.6.5 auf Datensätze mit beliebig vielen Features erweitern. Problembeschreibung Sie möchten das Geheimnis eines guten Rotweins lüften, indem Sie die Abhängigkeit der Weinqualität von verschiedenen Einflussgrößen modellieren. Mit großer Freude stoßen Sie während Ihrer Suche auf den Datensatz [7], in dem die Weinqualität, gemessen auf einer Skala von 1–10, in Abhängigkeit der elf Faktoren • • • • • • • • • • •

nicht-flüchtiger Säuregehalt, flüchtiger Säuregehalt, Zitronensäure, Restzucker, Chloride, freies Schwefeldioxid, gesamtes Schwefeldioxid, Dichte, pH-Wert, Sulfate und Alkoholgehalt

60

3

Einführung in Optimierungsmodelle

für 1599 Weinsorten angegeben wird. Sie machen sich also an die Arbeit. Das Modell Gesucht sind nun optimale Gewichte β0 , β1 , . . . , β p der linearen Funktion f β (x) = β0 +

p 

βi xi ,

i=1

die die Weinqualität als Funktion der p Features x1 . . . , x p , hier gilt p = 11, vorhersagt. Sie stellen die quadratische Verlustfunktion p n  1 L(β) = (β0 + β j xi j − yi )2 n i=1

j=1

auf, wobei xi, j für die Beobachtung der Einflussgröße x j im i-ten Datensatz steht, und definieren die Designmatrix ⎞ ⎛ 1 x1,1 . . . x1, p ⎟ ⎜ X = ⎝ ... ⎠. 1 xn,1 . . . xn, p

Da der Index der Variablen x11 sowohl die Zahl elf als auch das Paar (1, 1) darstellen kann, wird manchmal ein xi, j statt xi j geschrieben, um etwaige Verwirrungen auszuschließen. Bemerkung 3.6.5 Die Mehrfachverwendung von x für die Features x1 . . . , x p und die Datenpunkte xi j ist leider in der Literatur üblich. Anhand der Anzahl der Indizes sollte jedoch die Unterscheidung immer klar sein. Analog zum univariaten Fall in Abschn. 3.6.5 können Sie nun mit dem Koeffizientenvektor ⎛ ⎞ β0 ⎜ .. ⎟ β = ⎝ . ⎠ βp

und dem Vektor der Vorhersagewerte ⎛ ⎞ y1 ⎜ .. ⎟ y = ⎝.⎠ yn

3.6 Beispiele und Anwendungen

61

die loss function L : R p+1 → R in Matrix-Vektor-Schreibweise gemäß L(β) =

1 (X β − y)T (X β − y) n

formulieren. Das resultierende Optimierungsproblem P:

min

β∈R p+1

1 (X β − y)T (X β − y) n

ist analog zur Argumentation in Abschn. 3.6.5 ein UQP. Die Lösung Sie verwenden Gurobi für die Lösung von P und das Python-Paket pandas, das in der Data Science Community sehr beliebt ist, für das Einlesen des Datensatzes. import pandas as pd from gurobipy import GRB , Model , xsum

Nach dem Einlesen der Daten # Read data data_raw = pd . read_csv ( " winequality - red . csv " , delimiter = " ; " )

betreiben Sie etwas Daten-Vorverarbeitung (data preprocessing), indem Sie Duplikate löschen und die verbleibenden Daten skalieren, sodass die Features in vergleichbaren Größenordnungen angegeben werden. # Preprocessing # Drop d u p l i c a t e s df = data_raw . drop_duplicates () . reset_index ( drop = True ) # Scale values data = ( df - df . mean () ) / df . std ()

Anschließend definieren Sie die Trainingsdaten # Data points X = data [ [ d for d in data . columns if d ! = " quality " ] ] N = len ( X ) features = list ( X . columns ) # Labels y = data [ " quality " ]

und deklarieren das Optimierungsmodell. # Model d e c l a r a t i o n m = Model ( " Linear Regression nD " )

62

3

Einführung in Optimierungsmodelle

Bei der Definition der Entscheidungsvariablen ist zu beachten, dass beta nicht eine Entscheidungsvariable darstellt, sondern für jedes Element der Indexmenge features eine Entscheidungsvariable erzeugt wird. In diesem Beispiel besteht beta also aus einer Ansammlung von elf Variablen. # Decision variables intercept = m . addVar ( lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS ) beta = m . addVars ( features , lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS )

Nachdem Sie die Zielfunktion definiert # Ob j e c t i v e f u n c t i o n m . setObjective ( 1/N * xsum ( ( intercept + sum ( beta [ j ] * X . loc [i , j ] for j in features ) - y [ i ] ) ** 2 for i in range ( N ) ) )

und die Optimierung durchgeführt haben, # Solve s t a t e m e n t m . optimize ()

können Sie die Ergebnisse betrachten. for name in beta : print ( f " { name } : { beta [ name ]. X :. 3f } " )

Die Gewichte der Einflussfaktoren lauten: f i x e d a c i d i t y : 0 . 027 v o l a t i l e a c i d i t y : - 0 . 249 c i t r i c a c i d : - 0 . 039 r e s i d u a l s u g a r : 0 . 012 c h l o r i d e s : - 0 . 116 f r e e s u l f u r d i o x i d e : 0 . 042 t o t a l s u l f u r d i o x i d e : - 0 . 110 d e n s i t y : - 0 . 020 pH : - 0 . 086 s u l p h a t e s : 0 . 190 a l c o h o l : 0 . 380

Daraus schließen Sie, dass der Sulfat- sowie der Alkoholgehalt einen positiven Einfluss auf die Weinqualität zu haben scheinen. Ob das wohl stimmt? Zumindest haben Sie jetzt eine interessante Hypothese für das nächste Weinfest.

3.6 Beispiele und Anwendungen

3.6.7

63

Ridge-Regression

Problembeschreibung Sie sind immer noch auf der Suche nach dem Erfolgsrezept für guten Rotwein (s. Abschn. 3.6.6), haben aber mittlerweile den Verdacht, dass nicht alle aufgezählten elf Faktoren wirklich einen Einfluss auf die Qualität des Rotweins haben. Können Sie die Menge der Einflussfaktoren auf die relevanten Größen einschränken? Das Modell Das beschrieben Problem wird im Maschinellen Lernen unter Model Selection Problem geführt und es gibt verschiedene Herangehensweisen dazu, von denen Sie auch einigen in diesem Buch begegnen werden. Eine Möglichkeit ist die sogenannte Ridge-Regression, bei der Sie die Verlustfunktion so modifizieren, dass nicht nur der erwartete quadratische Fehler, sondern auch die quadratischen Beträge der Koeffizienten selbst bestraft werden. Die neue loss function lautet L(β) =

p p n   1 (β0 + β j xi j − yi )2 + λ βi2 n i=1

j=1

i=1

p und wurde um den Strafterm i=1 βi2 ergänzt, der betragsmäßig große Werte von β bestraft. Der Hyperparameter λ > 0 (tuning parameter) ist exogen vorgegeben und bestimmt das Gewicht des Strafterms in der Verlustfunktion. Eine gute Wahl von λ ist natürlich wichtig für die Qualität der Machine-Learning-Modells und wird unter dem Stichwort Hyperparameter-Tuning zum Beispiel in [15] besprochen. Sie wählen hier λ = 0.1. Die Funktion L : R p+1 R ist nach wie vor konvex, da der Strafterm eine strikt konvexe Funktion in β ist und die Summe zweier konvexer Funktionen wegen Satz 2.6.3 wieder eine konvexe Funktion ist. Die Lösung Der Code für das zu lösende Optimierungsproblem lautet

64

3

Einführung in Optimierungsmodelle

import pandas as pd from gurobipy import GRB , Model # Read data data_raw = pd . read_csv ( " winequality - red . csv " , delimiter = " ; " ) # Preprocessing # Drop d u p l i c a t e s df = data_raw . drop_duplicates () . reset_index ( drop = True ) # Scale values data = ( df - df . mean () ) / df . std () # Data points X = data [ [ d for d in data . columns if d ! = " quality " ] ] N = len ( X ) features = list ( X . columns ) # Labels y = data [ " quality " ] # Tu n ing p a r a m e t e r l = 0.1 # Model d e c l a r a t i o n m = Model ( " Linear Regression nD " ) # Decision variables intercept = m . addVar ( lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS ) beta = m . addVars ( features , lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS ) # Ob j e c t i v e f u n c t i o n m . setObjective ( 1/N * sum ( ( intercept + sum ( beta [ j ] * X . loc [i , j ] for j in features ) - y [ i ] ) ** 2 + l * sum ( beta [ i ] ** 2 for i in features ) for i in range ( N ) ) ) # Solve s t a t e m e n t m . optimize () for name in beta : print ( f " { name } : { beta [ name ]. X :. 3f } " )

und gibt folgenden Optimalpunkt zurück: f i x e d a c i d i t y : 0 . 055 v o l a t i l e a c i d i t y : - 0 . 222 c i t r i c a c i d : - 0 . 000 r e s i d u a l s u g a r : 0 . 022 c h l o r i d e s : - 0 . 107 f r e e s u l f u r d i o x i d e : 0 . 031 t o t a l s u l f u r d i o x i d e : - 0 . 101 d e n s i t y : - 0 . 068 pH : - 0 . 050 s u l p h a t e s : 0 . 178 a l c o h o l : 0 . 323

3.6 Beispiele und Anwendungen

65

Das Ergebnis legt nahe, dass Zitronensäure womöglich keinen Einfluss auf die Weinqualität hat. Die Ridge-Regression hat die große Schwäche, dass der Ansatz unter allen Features, die einen ähnlichen Einfluss auf den quadratischen Vorhersagefehler haben, dazu neigt, die betragsmäßig großen Features zu verkleinern, da diese quadratisch einen größeren Einfluss in der Fehlerfunktion haben. Dies können jedoch je nach Anwendung genau die Faktoren sein, die am relevantesten für die Vorhersagequalität des Modells sind. Sinnvoller ist es also, im Fehlerterm nicht die quadrierten Koeffizienten, sondern deren Absolutwerte zu bestrafen, da dies dazu führt, dass immer derjenige Koeffizient gegen null gedrückt wird, der durch sein Verschwinden einen möglichst kleinen negativen Einfluss auf den Vorhersagefehler hat. Dieser Ansatz führt auf das Lasso-Problem, das Sie in diesem Buch in Abschn. 6.5.2 auch noch kennenlernen werden, und dessen noch schönere MAE-Variante in Abschn. 5.5.3 zu finden ist.

4

Lineare Optimierungsmodelle

4.1

Motivation

Wenn Sie einem UQP begegnen, haben Sie Grund zur Freude, da Sie aus Kap. 3 wissen, dass dieses äquivalent zu einem linearen Gleichungssystem ist und damit sehr effizient gelöst werden kann. Ähnlich schön ist die Welt für sogenannte lineare Optimierungsprobleme (LP). Ein LP besteht aus einer linearen Zielfunktion und Ungleichungen oder Gleichungen, die ebenfalls durch lineare Funktionen beschrieben sind. Obwohl es nicht explizit im Titel erwähnt wird, besteht ein LP nur aus kontinuierlichen Entscheidungsvariablen. Lineare Optimierungsmodelle besitzen praktische Eigenschaften. Es existieren viele Anwendungsprobleme, die sich als LP modellieren lassen, und die zugehörigen Algorithmen zur Lösung von LPs sind unglaublich schnell. Typischerweise wird ein lineares Optimierungsmodell schneller gelöst, als es dauert, die zugehörigen Matrizen und Vektoren zu erzeugen und in den Arbeitsspeicher Ihres Computers zu laden. Auf handelsüblichen PCs können LPs mit Millionen von Entscheidungsvariablen und Constraints oft innerhalb von Minuten gelöst werden.

4.2

Modellklasse

Ein lineares Optimierungsmodell (LP) mit n Entscheidungsvariablen besteht aus einer linearen Zielfunktion und Ungleichungen bzw. Gleichungen, die ebenfalls durch lineare Funktionen beschrieben sind.

Ergänzende Information Die elektronische Version dieses Kapitels enthält Zusatzmaterial, auf das über folgenden Link zugegriffen werden kann https://doi.org/10.1007/978-3-662-67381-2_4.

© Der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 N. Sudermann-Merx, Einführung in Optimierungsmodelle, https://doi.org/10.1007/978-3-662-67381-2_4

67

68

4

Lineare Optimierungsmodelle

In Summenschreibweise lässt sich das LP also darstellen als LP :

maxn

x∈R

n 

ck x k

s.t. L k ≤ xk ≤ Uk , k ∈ {1, . . . , n}

k=1 n  k=1 n 

aik xk ≤ bi , i ∈ I d jk xk = e j ,

j ∈ J.

k=1

Was steht hier genau? Das Optimierungsproblem P besitzt eine Zielfunktion f : Rn → R, f (x) = c1 x1 + ... + cn xn , die maximiert werden soll, wobei c1 , . . . , cn reelle gegebene Zahlen sind. Aus Abschn. 1.3.4 wissen Sie, dass Sie statt f zu maximieren, natürlich auch − f minimieren können. Für LPs hat es sich etabliert, standardmäßig von einem Maximierungsproblem auszugehen. Im Abschn. 4.4.1 werden wir allerdings wieder von Minimierungsproblemen sprechen, da die vorgestellten Modellierungstricks oft auch im nichtlinearen Fall gültig sind, für die wiederum ein Optimierungsproblem per default zu minimieren ist. Entschuldigen Sie die Verwirrung. Diese Vorgehensweise hat sich leider im Laufe der Jahre so in den Communities etabliert. Jeder Entscheidungsvariable xi besitzt eine untere Schranke L i ∈ R ∪{−∞} und eine obere Schranke Ui ∈ R ∪{+∞}, wobei L i ∈ R ∪{−∞} bedeutet, dass L i entweder eine reelle Zahl oder den Wert −∞ annehmen kann, wobei letzterer Fall bedeutet, dass xi keine untere Schranke besitzt. Falls P Ungleichungsrestriktionen besitzt, so werden die zugehörigen Indizes in der Menge I gesammelt. Für jedes i ∈ I entsteht also eine Ungleichung, indem der Index i die Koeffizienten aik und die rechte Seite bi mitbringt, die gemeinsam für jedes i eine Restriktion ai1 x1 + ai2 x2 + . . . + ain xn ≤ bi bilden. Falls P keine Ungleichungsrestriktionen besitzt, gilt I = ∅, was bedeutet, dass I dann die leere Menge ist. Im Fall I = ∅ werden diese Restriktionen für diesen Abschnitt mit I = {1, . . . , p} durchnummeriert, wobei in echten Anwendungsfällen wie immer sprechende Indizes verwendet werden dürfen (und sollen). Analog zu den Ungleichungen kann P natürlich auch Gleichungsrestriktionen besitzen, deren Indizes dann in der Indexmenge J verweilen dürfen. Jede Gleichung von P wird entsprechend einem j ∈ J zugeordnet und erweckt mit Koeffizienten dik und rechten Seiten ei die Gleichung d j1 x1 + d j2 x2 + . . . + d jn xn = e j zum Leben. Falls P Nebenbedingungen in Gleichungsform enthält, gilt J = {1, . . . , q}. Beispiel 4.2.1 Für n = 2, c1 = 1, c2 = −2, L 1 = −∞, L 2 = 0, U1 = U2 = 1, p = 1, a11 = a12 = 1, b1 = 0.5 und J = ∅ erhalten Sie das Optimierungsproblem P:

max x1 − 2x2 s.t. x1 ≤ 1, 0 ≤ x2 ≤ 1, x1 + x2 ≤ 0.5,

x∈R2

das weder eine untere Schranke an x1 noch Gleichungsrestriktionen besitzt.

4.3 Mathematischer Hintergrund

69

Wie gewohnt ist die Welt in Matrix-Vektor-Schreibweise deutlich übersichtlicher. Wenn Sie die obigen Parameter einsammeln und in die Vektoren ⎛ ⎞ c1 ⎜ ⎟ c = ⎝ ... ⎠ , cn



⎞ ⎛ ⎞ ⎛ ⎞ ⎛ ⎞ L1 U1 b1 e1 ⎜ ⎟ ⎜ ⎟ ⎜ ⎟ ⎜ ⎟ L = ⎝ ... ⎠ , U = ⎝ ... ⎠ , b = ⎝ ... ⎠ , e = ⎝ ... ⎠ Ln Un bp eq

bzw. die Matrizen ⎞ a11 . . . a1n ⎟ ⎜ A = ⎝ ... ⎠, a p1 . . . a pn ⎛



⎞ d11 . . . d1n ⎜ ⎟ D = ⎝ ... ⎠ dq1 . . . dqn

stecken, können Sie jedes LP als LP :

max c T x

x∈Rn

s.t.

L ≤ x ≤ U , Ax ≤ b, Dx = e

darstellen. Schön! Bemerkung 4.2.1 Die Matrix-Vektor-Schreibweise ist zwar übersichtlicher und besser geeignet für mathematische Analysen, jedoch lässt sich das Problem in einer Modellierungssprache Ihrer Wahl, wie z. B. einem Python-Paket, besser pro Zeile formulieren, da Sie ansonsten leicht Ihr Gehirn verknoten könnten und die Fehlersuche in einem Modell in Matrix-Vektor-Schreibweise deutlich aufwändiger ist. Beispiel 4.2.2 Für das Problem aus Beispiel 4.2.1 erhalten Sie mit c=





1 −∞ 1 , L= , U= , A = 1 1 und b = 0.5 −2 1 1

die zugehörige Matrix-Vektor-Darstellung von P. Bemerkung 4.2.2 Wenn Sie möchten, können Sie die Zielfunktion natürlich noch um eine additive Konstante erweitern, sodass Ihre Zielfunktion etwa statt x1 + x2 jetzt x1 + x2 + 4 lautet. Da dies laut Satz 3.5.1 jedoch keine Auswirkung auf den Optimalpunkt hat, wurde sie in obigen Ausführungen weggelassen.

4.3

Mathematischer Hintergrund

Hier erhalten Freundinnen der Mathematik noch einige Leckerbissen serviert, die man beim ersten Lesen aber auch überspringen kann.

70

4.3.1

4

Lineare Optimierungsmodelle

Lineare Funktionen

Jede lineare Funktion f : Rn → R lässt sich darstellen als f (x) = a1 x1 + . . . + an xn =

n 

ai xi = a T x,

i=1

wobei a1 , . . . , an ∈ R reelle Zahlen sind, die natürlich auch den Wert Null annehmen dürfen und im Vektor ⎛ ⎞ a1 ⎜ .. ⎟ a = ⎝.⎠ an untergebracht sind. Eine Funktion f , die sich von einer linearen Funktion um eine additive Konstante k ∈ R unterscheidet, für die also f (x) = a1 x1 + . . . + an xn + k =

n 

ai xi + k = a T x + k

i=1

gilt, heißt affin-linear. So darf beispielsweise gemäß Bemerkung 4.2.2 die Zielfunktion eines LPs eine affin-lineare Funktion sein, wobei die additive Konstante für die Optimierung bedeutungslos ist. Falls f keine lineare (oder affin-lineare) Funktion ist, wird sie als nichtlineare Funktion bezeichnet. In Abb. 4.1 sehen Sie jeweils ein Beispiel für eine lineare und eine nichtlineare Funktion. Eine Funktion f : Rn → R ist genau dann linear, wenn sie additiv und homogen ist. Additivität bedeutet, dass f (x + y) = f (x) + f (y) für beliebige x, y ∈ Rn gilt. Für die Homogenität muss für jede beliebige Zahl λ ∈ R und jeden Punkt x ∈ Rn

Abb. 4.1 Links: nichtlineare Funktion f 1 (x1 , x2 ) = 2x1 x2 , rechts: lineare Funktion f (x1 , x2 ) = −3x1 + 21 x2

4.3 Mathematischer Hintergrund

71

die Gleichheit f (λx) = λ f (x) erfüllt sein. Aus der Homogenität folgt für λ = 0, dass stets f (0) = 0 gilt, wobei die erste Null den Nullvektor 0 ∈ Rn und die zweite Null die Zahl 0 ∈ R bezeichnet.

4.3.2

Polyeder und Polytope

Ein Polyeder ist eine Teilmenge des Rn , die sich als Schnittmenge endlich vieler abgeschlossener Halbräume darstellen lässt. Äquivalent dazu gibt es zu jedem Polyeder M eine Matrix A ∈ Rm×n und einen Vektor b ∈ Rn , sodass sich M darstellen lässt als M = {x ∈ Rn | Ax ≤ b}. Ein Polyeder ist also eine Teilmenge des Rn , die durch Ungleichungen beschrieben ist. Falls M ein Polyeder ist und darüber hinaus auch beschränkt ist, d. h., alle x ∈ M besitzen obere und untere Schranken, so dürfen Sie M ein Polytop nennen. Jedes Polytop ist natürlich ein Polyeder. Die Umkehrung gilt jedoch nicht, wie Sie in Beispiel 4.3.1 sehen werden. Beispiel 4.3.1 Die Menge M1 = {x ∈ Rn | x1 ≥ 1, x2 ≤ 2 + x1 , x2 ≥

1 1 x1 + } 2 2

ist in Abb. 4.2 eingezeichnet. M1 ist ein Polyeder, aber kein Polytop, da beispielsweise der Punkt (t, t) für alle t ∈ R in M1 liegt und die Menge somit unbeschränkt ist. Wenn Sie die Ungleichung x2 ≤ 8 − x1 hinzunehmen, erhalten Sie die Menge M2 = {x ∈ Rn | x1 ≥ 1, x2 ≤ 2 + x1 , x2 ≥

1 1 x1 + , x2 ≤ 8 − x1 }, 2 2

die ebenfalls in Abb. 4.2 zu sehen ist und ein Polytop darstellt, da für alle x ∈ M2 gilt 1 ≤ x1 ≤ 5 und 1 ≤ x2 ≤ 5. Falls Sie zehn Minuten Zeit und einen Bleistift zur Hand haben, können Sie hier versuchen, die unteren und oberen Schranken an x ∈ M2 aus den beschreibenden Ungleichungen herzuleiten. Was haben Polyeder mit Optimierungsmodellen zu tun? Die zulässige Menge eines linearen Optimierungsproblems ist ein Polyeder, auch wenn es auf den ersten Blick vielleicht nicht so aussieht. Zur Erinnerung, die zulässige Menge eines LPs besteht aus Ungleichungen, Gleichungen sowie unteren und oberen Schranken, wohingegen ein Polyeder nur durch Ungleichungen beschrieben sein darf. Nun sind zweifelsohne untere und obere Schranken spezielle Ungleichungen, sodass diese problemlos auch ein Polyeder beschreiben dürfen, wie etwa die Ungleichung x1 ≥ 1

72

4

Lineare Optimierungsmodelle

Abb. 4.2 Links: unbeschränktes Polyeder M1 , rechts: Polytop M2

aus Beispiel 4.3.1, die eine untere Schranke an x1 darstellt. Darüber hinaus lässt sich jede Gleichung n 

di xi = e

i=1

äquivalent durch die beiden Ungleichungen n  i=1

di xi ≤ e und

n 

di xi ≥ e

i=1

ausdrücken. Das sollten Sie zwar nie tun, wenn Sie ein Optimierungsmodell darstellen, da es einerseits die Lesbarkeit des Modells verschlechtert und andererseits zu numerischen Problemen führen kann. Wenn es jedoch darum geht, formal zu zeigen, dass die zulässige Menge eines LPs ein Polyeder darstellt, heiligt der Zweck die Mittel. Die zulässige Menge eines LPs ist also immer ein Polyeder. Bemerkung 4.3.1 Zum Zeitpunkt der Entstehung dieses Buches versteht man laut Wikipedia-Eintrag unter Polyedern nur dreidimensionale Mengen, wohingegen polyedrische Mengen im Rn für n > 3 als Polytope bezeichnet werden. Dieses Buch hält sich an die Definition von Polyedern, wie sie beispielsweise im Klassiker [31] eingeführt wird und auch innerhalb der mathematischen Community gebräuchlich ist. In Abschn. 2.5.1 haben Sie gelernt, was konvexe Mengen sind. Polyeder sind immer konvex. Satz 4.3.1 Jedes Polyeder M = {x ∈ Rn | Ax ≤ b} ist eine konvexe Menge. Beweis Obwohl wir in diesem Buch recht sparsam mit formalen mathematischen Aussagen umgehen, möchten wir Ihnen den schönen und sehr kurzen Beweis nicht

4.3 Mathematischer Hintergrund

73

vorenthalten, dass jedes Polyeder eine konvexe Menge ist. Wir unterscheiden dazu zwei Fälle. Falls das Polyeder M leer ist, ist es trivialerweise auch konvex. Beachten Sie, dass „trivial“ hier nicht für „einfach“, sondern für „besonders uninteressant“ steht. Falls Sie das genau nachvollziehen wollen, werden Sie nicht um einen kurzen Abstecher in die Logik herumkommen, den wir hier allerdings auslassen. Falls M nicht-leer ist, nehmen wir uns zwei beliebige Punkte x und y aus M heraus und zeigen, dass jeder beliebige Punkt z auf der Verbindungslinie zwischen x und y ebenfalls in M liegt. Da z zwischen x und y liegt, gibt es eine Zahl λ ∈ [0, 1], sodass sich z darstellen lässt als z = λx + (1 − λ)y.

(4.1)

Wir zeigen nun, dass Az ≤ b gilt, d. h. x ∈ M. Wegen Gl. (4.1) und da wir des Ausmultiplizierens mächtig sind, gilt Az = A(λx + (1 − λ)y) = λAx + (1 − λ)Ay. Nun erinnern Sie sich, dass x und y aus der Menge M sind, was bedeutet, dass Ax ≤ b und Ay ≤ b gilt. Aha! Das nutzen Sie aus und erhalten λ  Ax +(1 − λ) Ay ≤ λb + (1 − λ)b = b

 ≤b

≤b

und somit wie gewünscht Az ≤ b. Das beliebige Polyeder M ist also konvex, und Sie sind glücklich.

4.3.3



Dualitätstheorie für LPs

Die Dualitätstheorie für LPs ist ein mächtiges Werkzeug, das unter anderem für Lösungsalgorithmen und die Beantwortung von Sensitivitätsanalysen (s. Abschn. 7.5.2) eingesetzt werden kann. Achtung, jetzt wird es etwas mathematischer, aber trotzdem oder eben deshalb sehr elegant. Jedes lineare Optimierungsproblem P:

max c T x

x∈Rn

s.t.

Ax ≤ b, x ≥ 0

besitzt einen „Partner“, das duale Optimierungsproblem D:

min b T λ s.t.

λ∈Rm

A T λ ≥ c, λ ≥ 0.

In diesem Zusammenhang bezeichnet man P oft auch als primales Optimierungsproblem.

74

4

Lineare Optimierungsmodelle

Bemerkung 4.3.2 Beachten Sie, dass sich jedes LP in die Form des Problems P bringen lässt, da Sie Gleichungen immer als Paare von Ungleichungen darstellen können und eine unbeschränkte Variable y ∈ Rn auch als Differenz zweier nichtnegativer Variablen ausdrücken können. Wie üblich, sollten Sie dies nicht direkt tun! Dies ist nur ein formales Argument, um Ihnen zu zeigen, dass die hier präsentierte Theorie allgemeingültig ist und sich nicht nur auf ausgewählte LPs bezieht. Sei (x, λ) ein Paar primal-dual zulässiger Punkte, d. h., x ist ein zulässiger Punkt von P und λ ist zulässig für D. Dann liegt der Zielfunktionswert c T x des primalen Problems immer unter dem Zielfunktionswert b T λ des dualen Problems! Das duale Problem liefert also obere Schranken für den primalen Counterpart. Warum das so ist, erfahren Sie im folgenden Satz und dem zugehörigen Beweis. Es lohnt sich, den Gedankengang nachzuvollziehen! Satz 4.3.2 Sei (x, λ) ein Paar primal-dual zulässiger Punkte. Dann gilt c T x ≤ b T λ, d. h., der Zielfunktionswert jedes primal zulässigen Punktes kann den Zielfunktionswert eines dual zulässigen Punktes nie übersteigen. Beweis Wir starten mit dem Ausdruck c T x und stellen zunächst fest, dass c ≤ A T λ gilt, da der Punkt λ zulässig für D ist. Damit gelangen wir zur ersten Abschätzung c T x ≤ (A T λ)T x = λT Ax, wobei im letzten Schritt die Rechenregel (AB)T = B T A T angewandt wurde. Da x wiederum zulässig für P ist, gilt Ax ≤ b, und wir erhalten λT Ax ≤ λT b = b T λ, was korrekt ist, da für jedes Skalarprodukt immer x T y = y T x gilt. Insgesamt erhalten wir also c T x ≤ (A T λ)T x = λT Ax ≤ λT b = b T λ. Damit haben wir die gewünschte Aussage akkurat begründet, d. h. bewiesen.



Der Zielfunktionswert jedes dual zulässigen Punktes beschränkt also den Zielfunktionswert jedes primal zulässigen Punktes nach oben. Das ist die sogenannte schwache Dualität. Können die Zielfunktionswerte dieser Paare auch übereinstimmen? Die starke Dualität beantwortet diese Frage und sagt, dass die Zielfunktionswerte eines primal-dual zulässigen Punktepaares (x, λ) genau dann übereinstimmen, wenn x ein Optimalpunkt von P und λ ein Optimalpunkt von D ist. Wir geben die Aussage hier ohne Beweis wieder.

4.3 Mathematischer Hintergrund

75

Satz 4.3.3 Der Punkt x  ist genau dann ein Optimalpunkt des primalen Optimierungsproblems P:

max c T x s.t. Ax ≤ b, x ≥ 0,

x∈Rn

wenn es einen Optimalpunkt λ des dualen Optimierungsproblems D:

min b T λ s.t. A T λ ≥ c, λ ≥ 0

λ∈Rm

gibt mit c T x  = b T λ , d. h., die Optimalitätslücke b T λ − c T x  verschwindet genau dann, wenn x  und λ Optimalpunkte von P bzw. D sind.

4.3.4

Lösungsalgorithmen

Erste Beobachtungen und graphisches Lösen Hier ist ein kleines Beispiel für ein lineares Optimierungsmodell, an dem sich einige charakteristische Eigenschaften beobachten lassen, die auch für LPs mit Millionen von Entscheidungsvariablen und Nebenbedingungen gelten. P:

max 2x1 + x2 s.t. 1 ≤ x1 ≤ 4, 1 ≤ x2 ≤ 5, x2 ≤ 7 − x1 , x2 ≤ 14 − 3x1

x∈R2

Die zulässige Menge von P ist in Abb. 4.3 dargestellt. Sie wird von den Halbräumen berandet, die durch obige Ungleichungen definiert werden, und ist ein Polytop. (Warum?) Außerdem ist im linken Teil der Abbildung die Höhenlinie der Zielfunktion zum Niveau 6 eingezeichnet, was bedeutet, dass alle Punkte auf der dargestellten Linie den Zielfunktionswert 6 haben. Von den Punkten auf der Höhenlinie interessieren uns natürlich nur die zulässigen Punkte. Nun können Sie die Höhenlinie der Zielfunktion parallel in Pfeilrichtung verschieben und damit den Zielfunktionswert verbessern. Sie stoppen, sobald Sie die zulässige Menge mit der Höhenlinie gerade noch so berühren. Dieser letzte Berührungspunkt zwischen Höhenlinie und zulässiger Menge ist ein Optimalpunkt von P. In diesem Beispiel liegt er bei x = (3.5, 3.5) und der zugehörigen Optimalwert ist v = 10.5, was auch im rechten Teil der Abbildung eingezeichnet ist. Sie beobachten, dass der Optimalpunkt von P in einer Ecke der zulässigen Menge liegt. Dies ist nicht dem Beispiel oder der niedrigen Dimensionalität geschuldet, sondern gilt laut dem sogenannte Eckensatz der linearen Optimierung immer. Den Beweis sowie etwas Kontext finden Sie etwa in [3]. Satz 4.3.4 Jedes lösbare lineare Optimierungsproblem besitzt einen Optimalpunkt, der in einer Ecke der zulässigen Menge liegt.

76

4

Lineare Optimierungsmodelle

Abb. 4.3 Links: Die zulässige Menge von P sowie die Höhenlinie der Zielfunktion zum Niveau 6. Entlang der Pfeilrichtung verbessert sich der Zielfunktiontswert. Rechts: Die verschobene Höhenlinie der Zielfunktion, die den Optimalpunkt dort berührt, wo der Optimalwert von 10.5 realisiert wird.

Diese Tatsache wird von dem sogenannten Simplex-Verfahren ausgenutzt, das systematisch Ecken der zulässigen Menge eines LPs abklappert, wohingegen InnerePunkte-Verfahren im Inneren der zulässigen Menge starten und sich von dort aus auf eine Wanderung in Richtung des Randes der zulässigen Menge begeben. Bemerkung 4.3.3 Wie Sie vermutlich schon bemerkt haben, funktioniert die Idee „Ableitung gleich null setzen“ nicht für lineare Optimierungsprobleme. Die Ableitung einer linearen Funktion ist immer konstant und typischerweise nie null. Schade! Zum Glück gibt es hier andere Ideen für Lösungsverfahren, die Sie in den folgenden Abschnitten kennenlernen werden. Bemerkung 4.3.4 Es wird an dieser Stelle nicht formal definiert, wie eine Ecke eines Polyeders in einem n-dimensionalen Raum auszusehen hat, weil das hier nicht von größerer Bedeutung ist. Falls Sie trotzdem ein Gefühl dafür bekommen möchten, lesen Sie hier weiter. So, wie sich in einer Ecke im R2 zwei Geraden unterschiedlicher Steigung treffen, müssen in einer Ecke im R1075 auch 1075 Ungleichungen mit Gleichheit erfüllt sein, die in einem gewissen Sinne unabhängig sind. Genauer erklärt wird der Sachverhalt zum Beispiel in [31]. Simplex-Verfahren Das Simplex-Verfahren löst lineare Optimierungsprobleme, hält sich gern in Ecken der zulässigen Menge auf, ist viel besser als es seine Worst-Case-Komplexität vermuten lässt und steht Ihnen zum Glück in Python-Paketen zur freien Verfügung. Dies alles, aber auch nicht mehr, werden Sie in diesem Abschnitt lernen. Zu den technisches Details des Simplex-Verfahrens wurden schon unzählige Lehrbücher wie etwa [3] geschrieben. Das Simplex-Verfahren wurde 1947 von George Dantzig im Rahmen einer Planungsaufgabe für das US-Militär entwickelt. Es sei daran erinnert, dass es zu dieser

4.3 Mathematischer Hintergrund

77

Abb. 4.4 Das Klee-Minty-Polytop. (Quelle: Von Sophie Huiberts – Eigenes Werk, CC BY 4.0, https://commons.wikimedia.org/w/index.php?curid=81364401)

Zeit noch keine Computer gab. Dennoch wurde das Simplex-Verfahren vereinzelt schon zur Lösung echter Probleme verwendet (s. [4]). Die durchzuführenden Berechnungen wurden dann eben von Hand ausgeführt, was im überlieferten Beispiel auch 120 Personen-Tage in Anspruch nahm. George Dantzig war ein Genie mit dem Sie sich an dieser Stelle gern einige Minuten beschäftigen dürfen, falls Sie das Thema interessiert. Die Grundidee des Simplex-Verfahrens besteht darin, auf eine schlaue Weise in den Ecken der zulässigen Menge nach Optimalpunkten Ausschau zu halten. Das klingt simpel, aber leider können Polyeder in hochdimensionalen Räumen sehr viele Ecken haben. So besitzt beispielsweise das Klee-Minty-Polytop in Abb. 4.4 in einem n-dimensionalen Raum leider 2n Ecken. Das klingt harmlos, und die acht Ecken im R3 können durchaus in kurzer Zeit besucht werden. Wenn Sie jedoch ein LP mit 500 Entscheidungsvariablen besitzen, befinden Sie sich im R500 , in dem das Klee-Minty-Polytop 2500 ≈ 3 · 10150 Ecken besitzt. Zum Vergleich, man geht davon aus, dass es im gesamten Universum ungefähr 1080 Atome gibt. Klee und Minty zeigten in ihrem Aufmerksamkeit erregenden Artikel [18] mit dem Titel „How good is the simplex algorithm?“ im Jahr 1972, dass eine von ihnen betrachtete Version des Simplex-Algorithmus jede Ecke des Klee-Minty-Polytops besucht und somit im schlimmsten Fall eine exponentielle Laufzeit besitzt. Das war höchst unerfreulich. Trotzdem ist der SimplexAlgorithmus auch heute noch einer der erfolgreichsten Lösungsalgorithmen für LPs. Er ist in der Lage, praxisrelevante Probleme mit bis zu Millionen von Entscheidungsvariablen und Nebenbedingungen zu lösen. Wie passt das zusammen? Zum Einen sind echte Anwendungsprobleme nicht mit der bösartigen Absicht entworfen, einem Algorithmus das Leben möglichst schwer zu machen. Solche Extrembeispiele sind interessant, um das Worst-Case-Verhalten eines Algorithmus zu untersuchen, haben

78

4

Lineare Optimierungsmodelle

Abb. 4.5 Die Iterierten eines Innere-Punkte-Verfahrens

aber in der Regel nichts mit echten Anwendungsfällen zu tun. Große praxisrelevante Probleminstanzen weisen darüber hinaus typische Strukturen aus. So treten etwa die Nicht-Null-Einträge in der Koeffizientenmatrix oft in Blöcken auf, die von professionell implementierten Simplex-Varianten erkannt und ausgenutzt werden. Wie Ihre Chancen stehen, mithilfe des Simplex-Algorithmus große LPs zu lösen, wird glücklicherweise nicht von einer theoretischen Worst-Case-Betrachtung, sondern von der Struktur der konkreten Fragestellung bestimmt. Und hier steht der Simplex-Algorithmus sehr gut da. Innere-Punkte-Verfahren Im Jahre 1979 zeigte L. Khachiyan in [17], dass lineare Optimierungsprobleme durch den Einsatz sogenannter Innere-Punkte-Verfahren in polynomieller Zeit gelöst werden können. Trotz der theoretischen Überlegenheit dieser Verfahren gegenüber dem Simplex-Algorithmus waren sie deutlich komplizierter in der Handhabung, sodass es noch Jahrzehnte dauerte, bis Innere-Punkte-Verfahren gegenüber Simplex-Verfahren in professionellen Implementierungen wettbewerbsfähig wurden. In Abb. 4.5 ist zu sehen, dass Innere-Punkte-Verfahren, wie der Name schon sagt, im Inneren der zulässigen Menge starten und iterativ versuchen, den Optimalpunkt approximativ zu erreichen. Bei der Lösung eines LPs mit modernen kommerziellen Implementierungen finden heutzutage Wettläufe zwischen Simplex-Implementierungen und Innere-PunkteVerfahren auf verschiedenen Kernen statt, da keine klare Überlegenheit eines Verfahrens festzustellen ist. Der Lösungslauf bricht ab und gibt die optimale Lösung zurück, sobald eines der beteiligten Verfahren das LP gelöst hat.

4.4 Praktische Hinweise

79

4.4

Praktische Hinweise

4.4.1

Modellierungstricks

Sie werden hier einige Optimierungsprobleme kennenlernen, die zunächst nichtlinear daherkommen, jedoch mit einigen Tricks als LPs umformuliert werden können. Max-Ausdrücke Wir beginnen mit folgender Beobachtung. Die Ungleichung max(2, 4) ≤ x ist linear mit der Besonderheit, dass die linke Seite etwas seltsam aussieht, da sie künstlich kompliziert formuliert wurde. Da 4 die größere der beiden Zahlen 2 und 4 ist, gilt natürlich max(2, 4) = 4, und Sie hätten auch einfach 4 ≤ x schreiben können. Da hier der Grundstein für ein größeres Synapsenfeuerwerk gelegt werden soll, bitten wir Sie allerdings stattdessen die obige Ungleichung in die beiden Ungleichungen 2 ≤ x, 4 ≤ x aufzuteilen. Das mutet zwar noch seltsamer an, ist aber zweifelsfrei mathematisch korrekt: Die Zahl x ist genau dann größer oder gleich dem Maximum von 2 und 4, wenn x ≥ 2 und x ≥ 4 gilt, wobei die Ungleichung 2 ≤ x überflüssig (schlauer formuliert: redundant) ist. Jetzt kommt die Verallgemeinerung dieser Erkenntnis auf interessantere und realistischere Situationen. Analog zum obigen Beispiel können Sie die nichtlineare Ungleichung max(x1 , −2x2 + 73) ≤ 42 linear umformulieren zu x1 ≤ 42, −2x2 + 73 ≤ 42. Sie haben jetzt zwar die Anzahl Ihrer Ungleichungen verdoppelt, dafür aber eine lineare Formulierung erhalten, die Sie problemlos einem LP-Solver Ihrer Wahl anvertrauen können. In Abb. 4.6 sehen Sie die Menge, die durch die Ungleichung max(−2x + 1, 2x) ≤ 2 beschrieben ist. Der allgemeine Fall ist wie üblich in folgendem Satz formuliert. Satz 4.4.1 Für beliebige Funktionen f 1 , . . . , f N : Rn → R ist die Ungleichung max( f 1 (x), . . . , f N (x)) ≤ b äquivalent zu N Ungleichungen f 1 (x) ≤ b, . . . , f N (x) ≤ b, wobei N eine beliebige natürlich Zahl ist.

80

4

Lineare Optimierungsmodelle

Abb. 4.6 Eine Darstellung der Menge {x ∈ R | max(−2x + 1, 2x) ≤ 2}



Trick 4 Die Nebenbedingung max(x, y) ≤ z wird von LP-Solvern in der Regel nicht unterstützt und kann daher durch x ≤ z und y ≤ z ersetzt werden.

Epigraphformulierung Die Grundidee der linearen Formulierung von Max-Ausdrücken werden Sie auch in diesem Abschnitt wiederfinden. Falls Sie nicht mehr wissen, was ein Epigraph ist, besuchen Sie bitte kurz Abschn. 2.5.2. – Willkommen zurück. Das Optimierungsproblem P:

min max(−2x + 1, 2x) x∈R

ist kein LP. (Warum nicht?) Da dieser Abschnitt den Titel „Epigraphformulierung“ trägt, möchte der Autor vermutlich, dass Sie den Epigraphen der Zielfunktion f (x) = max(−2x + 1, 2x) betrachten und hat diesen in Abb. 4.7 geplottet. Der Epigraph von f sieht aus wie ein Polyeder. Sie hoffen also zurecht, dass Sie P als LP umformulieren können und führen, einer Eingebung folgend, eine weitere kontinuierliche Variable α ein, die die Aufgabe hat, von oben auf die Zielfunktion zu drücken. Das neue Problem lautet nun Pepi :

min α s.t. max(−2x + 1, 2x) ≤ α.

(x,α)∈R2

Ha! Nun erinnern Sie sich an den Abschnitt zur Max-Formulierung und formen Pepi ein weiteres Mal um: Pepi :

min α s.t. −2x + 1 ≤ α, 2x ≤ α

(x,α)∈R2

4.4 Praktische Hinweise

81

Abb. 4.7 Epigraph der Funktion f (x) = max(−2x + 1, 2x)

Wunderbar. Sie haben eine lineare Formulierung von P als LP erhalten. Das funktioniert nicht nur in diesem konkreten Beispiel, sondern auch allgemein, wie Sie dem folgenden Satz entnehmen. Satz 4.4.2 Die Optimalpunkte des Optimierungsproblems min max( f 1 (x), . . . , f N (x))

x∈Rn

mit den N Funktionen f 1 , . . . , f N : Rn → R sind genau die x-Komponenten der Optimalpunkte von min

(x,α)∈Rn × R

α s.t.

f 1 (x) ≤ α, . . . , f N (x), ≤ α

und auch die Optimalwerte stimmen überein. Sie werden also für den Preis einer zusätzlichen Entscheidungsvariablen α sowie N weiterer Restriktionen das max in der Zielfunktion los. Beträge Beträge tauchen in vielen Lebenslagen auf und haben die unangenehme Eigenschaft, dass sie nicht differenzierbar sind, also „Knicke“ haben. Bevor Sie weiterlesen, zeichnen Sie hier bitte den Graphen der Betragsfunktion f : R → R, f (x) = |x| und vergleichen seine Struktur mit der Funktion aus Abb. 4.7. Sieht ähnlich aus, oder? Das ist kein Zufall und liegt daran, dass für die Betragsfunktion |x| = max(x, −x) gilt. Ein Betrag ist also eine verstecke Max-Funktion! Da Sie sich ja bereits in den letzten beiden Abschnitten mit Max-Funktionen beschäftigt haben, sind Sie gut auf

82

4

Lineare Optimierungsmodelle

Abb. 4.8 Links: Menge {x ∈ R | x ≤ 2}, rechts: Menge {x ∈ R | x ≥ 2}

Beträge vorbereitet und wissen, dass |x| ≤ 2 ⇐⇒ max(x, −2) ≤ 2 ⇐⇒ x ≤ 2, −x ≤ 2 gilt. Hier kommt allerdings direkt auch eine schlechte Nachricht, die im Abschnitt über Max-Ausdrücke übergangen wurde, um die Stimmung zum Einstieg nicht zu sehr zu verderben. Können Sie |x| ≥ 2 ebenfalls durch zwei lineare Ungleichungen ersetzen, die gleichzeitig gelten sollen? In Abb. 4.8 sehen Sie das Problem. Während {x ∈ R | x ≤ 2} ein schönes konvexes Polyeder ist, enthält {x ∈ R | x ≥ 2} ein Loch, ist also nicht konvex. Das liegt daran, dass |x| ≥ 2 bedeutet, dass entweder x ≤ −2 oder x ≥ 2 gelten muss. Diese Entweder-Oder-Aussage reißt ein Loch in die zulässige Menge. Da laut Satz 4.3.1 jedes Polyeder konvex ist, ist diese Menge nicht polyedrisch und kann somit nicht die zulässige Menge eines LPs sein. Ungleichungen der Form „Betrag größer oder gleich positiver Zahl“ sind also leider nicht als Restriktion eines LPs darstellbar. In Kap. 5 sehen Sie, dass Sie Entweder-Oder-Aussagen mithilfe von binären Entscheidungsvariablen in gemischt-ganzzahligen Optimierungsmodellen darstellen können. 

Trick 5 Die Bedingung |x| ≤ a ist äquivalent zu x ≤ a und −x ≤ a .

Beträge tauchen nicht nur in Ungleichungen auf, sondern auch gern in Zielfunktionen. Während sich min |x + 2| x∈R

bequem gemäß min |x + 2| ⇐⇒ x∈R

⇐⇒

min α s.t. |x + 2| ≤ α

(x,α)∈R2

min α s.t. x + 2 ≤ α, −(x + 2) ≤ α

(x,α)∈R2

4.4 Praktische Hinweise

83

zu einem LP umformulieren lässt, müssen Sie für min

(x1 ,x2 )∈R2

|x1 + 2| + |2x2 |

schon für jeden Betrag eine eigene Variable einführen und erhalten min

(x1 ,x2 ,α1 ,α2 )∈R4

α1 + α2 s.t. |x1 + 2| ≤ α1 , |2x2 | ≤ α2 ,

das sie im nächsten Schritt als das LP min

(x1 ,x2 ,α1 ,α2 )∈R4

α1 + α2 s.t. x1 + 2 ≤ α1 , −(x1 + 2) ≤ α1 2x2 ≤ α2 , −2x2 ≤ α2

notieren. Satz 4.4.3 Das Optimierungsproblem P:

minn

x∈R

N 

λi | f i (x)|

i=1

ist äquivalent zu P :

min

N 

(x,α)∈Rn × R N i=1

λi αi

s.t.

f i (x) ≤ αi , − f i (x) ≤ αi , i ∈ {1, . . . , N }

für Funktionen f 1 , . . . , f N : Rn → R und nichtnegative Zahlen λ1 , . . . λ N . 

Trick 6 Beträge, die in der Zielfunktion eines Minimierungsproblems mit positivem Vorzeichen auftreten, können in die Nebenbedingung geschoben und dort aufgelöst werden.

Was mit Beträgen in Maximierungsproblemen zu tun ist, was äquivalent zur Existenz negativer Zahlen λi in Satz 4.4.3 ist, lernen Sie ebenfalls in Kap. 5.

4.4.2

Implementierung und Lösung in Python

Lineare Optimierungsmodelle können in Python beispielsweise unter Verwendung der Modellierungspakete pulp und python-mip formuliert werden. Das etwas ältere Paket pulp bietet unter anderem APIs zu den kostenlosen Solvern GLPK und CBC sowie den kommerziellen Solvern CPLEX und Gurobi, wohingegen das modernere Paket python-mip zum Stand der Entstehung dieses Buches nur Schnittstellen zu CBC und Gurobi anbietet.

84

4

4.5

Beispiele und Anwendungen

4.5.1

Mittlerer absoluter Abstand zu Zahlen

Lineare Optimierungsmodelle

Problembeschreibung Sie erinnern sich  Nvielleicht, dass in Abschn. 3.6.4 gezeigt wurde, dass das arithmetiai den mittleren quadratische Abstand zu den Zahlen a1 , . . . , a N sche Mittel N1 i=1 minimiert. Ein Nachteil des arithmetischen Mittels als statistisches Maß ist dessen starke Anfälligkeit  N für Ausreißer in den Werten, was unmittelbar aus der Tatsache ai den mittleren quadratischen Abstand (MSE) minimiert. Welfolgt, dass N1 i=1 che Kennzahl erhalten wir, wenn wir stattdessen nach der Zahl x  suchen, die den mittleren absoluten Abstand, auch mean absolute error (MAE), zu den Zahlen 1, 34, 5, 6, 3, 7, 8, 5, 6, 89, 4, 56, 234, 5, 6, 3457, 8, 45, 2, 35, 3 minimiert? Das Modell Das zu lösende Optimierungsmodell lautet P:

min x∈R

N 1  |ai − x|. N i=1

Mithilfe der Modellierungstricks aus Abschn. 4.4.1 können wir es zu einem LP umformulieren. Dazu führen wir für jeden Summanden eine neue Entscheidungsvariable z i ein, die im Bestreben zu minimieren von oben auf den jeweiligen Betrag drückt: min

(x,z)∈R × R N

N 1  zi N

s.t. |ai − x| ≤ z i , i ∈ {1, . . . , N }

i=1

In Anwendung des nächsten Tricks ersetzen wir jede Betragsungleichung durch zwei neue Restriktionen und erhalten das LP PL P :

min

(x,z)∈R × R N

N 1  zi N

s.t. ai −x ≤ z i , −(ai −x) ≤ z i , i ∈ {1, . . . , N }.

i=1

Das hätten wir natürlich auch direkt über eine Anwendung von Satz 4.4.3 erreichen können, aber etwas Wiederholung schadet nicht und Sie realisieren, dass Sie sich das Auswendiglernen des Satzes sparen dürfen. Bemerkung 4.5.1 Beachten Sie, dass PL P im Vergleich zu P zwar ein LP ist, aber Sie dafür N zusätzliche Entscheidungsvariablen und 2N Nebenbedingungen einführen mussten, was für Probleme mit Hunderttausenden oder Millionen von Datenpunkten ein Problem darstellen könnte. Daher ist es für sehr große Instanzen oft eine

4.5 Beispiele und Anwendungen

85

gute Idee, Algorithmen zu verwenden, die auf die Lösung unrestringierter nichtdifferenzierbarer konvexer Optimierungsprobleme, wie P eines ist, zugeschnitten sind, und auf aufwändige Umformulierungen zu verzichten. Die erfolgreichsten Verfahren hierfür sind aktuell proximal gradient methods (s. [20]). Die Lösung Sie implementieren das LP und verwenden dabei mip sowie den open source Solver CBC. from mip import CBC , Model , minimize , xsum numbers = [ 1 , 34 , 5 , 6 , 3 , 7 , 8 , 5 , 6 , 89 , 4 , 56 , 234 , 5 , 6 , 3457 , 8 , 45 , 2 , 35 , 3 ] m = Model ( solver_name = CBC ) x = m . add_var ( lb = - float ( " inf " ) ) z = { n : m . add_var () for n in numbers } for n in numbers : m += n - x 0. Wie Sie sich erinnern, sind y und z jedoch Binärvariablen, denen Sie in diesem Fall nicht erlauben, den Wert Null anzunehmen. Es bleibt also nur y = z = 1, was auch in der dritten Ungleichung 1 ≤ a und somit a = 1 erzwingt. Alles ist also genau so, wie wir es von der Gleichung yz = a erwarten.

100

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Bemerkung 5.4.1 Beachten Sie, dass a in dem Fall als kontinuierliche Variable aus dem Intervall [0, 1] gewählt werden kann, da die obigen Nebenbedingungen so scharf formuliert sind, dass Zwischenwerte wie a = 0.5 nie auftreten können. Das ist gut, da kontinuierliche Variablen in linearen Optimierungsproblemen für den Lösungsalgorithmus einfacher zu handhaben sind als binäre Entscheidungsvariablen. Das Produkt einer Binärvariablen mit einer kontinuierlichen Variablen Können wir die Gleichung xy = a

(5.1)

auch umformulieren, wenn x nicht binär ist, sondern kontinuierlich aus einem Intervall [L, U ] ⊂ R gewählt werden kann? Glücklicherweise lautet die Antwort ja. Seien also y ∈ {0, 1} eine Binärvariable, a ∈ R kontinuierlich und x ∈ [L, U ] für zwei reelle Zahlen L, U mit L ≤ U ebenfalls eine kontinuierliche Variable. Statt x y = a können Sie auch Ly ≤ a ≤ U y und x − (1 − y)U ≤ a ≤ x − (1 − y)L schreiben und verändern damit nicht die Lösungsmenge der Gleichung. Warum? Für y = 0 folgt direkt 0 ≤ a ≤ 0 und x − U ≤ a ≤ x − L, was a = 0 impliziert und somit auch L ≤ x ≤ U . Für y = 0 ist also a = 0, und x kann beliebig aus dem Intervall [L, U ] gewählt werden. Das stimmt mit dem Verhalten von x, y und a überein, das aus x y = a vorgegeben wird. Was ist mit dem Fall y = 1? Gemäß (5.1) sollten dann x und a übereinstimmen. Aus den Ungleichungen erhalten wir für y = 1 die Restriktionen L ≤ a ≤ U sowie x ≤ a ≤ x und somit a = x. Prima! Die Lösungsmenge von (5.1) wurde also durch die lineare Umformulierung erhalten. Allerdings haben wir nun drei lineare Ungleichungen anstelle einer nichtlinearen Gleichung in unserem Optimierungsmodell. 

Trick 8 Das Produkt zweier Variablen x y können Sie linear umformulieren, wenn mindestens eine der Variablen binär ist.Sollten x und y jeweils kontinuierlich sein, so handelt es sich leider um eine „echte“ Nichtlinearität, mit der Sie leben müssen.

5.4.2

Implementierung und Lösung in Python

Für die Implementierung und Lösung von MILPs stehen Ihnen im Wesentlichen alle Pakete und Modellierungssprachen zur Verfügung, die auch schon für LPs genannt wurden, da LP-Solver oft in Wirklichkeit MILP-Solver sind, die ein LP nur als

5.5 Beispiele und Anwendungen

101

besonders einfachen Spezialfall eines MILPs betrachten. Im Gegensatz zu LPs gibt es bei MILPs jedoch einen enormen Unterschied zwischen kostenlosen Solvern, wie GLPK und CBC, und kommerziellen Solvern, von denen die bekanntesten CPLEX, Gurobi und Xpress sind. Kommerzielle Solver sind teilweise um mehrere Größenordnungen schneller als freie Solver, was insbesondere für große Modelle zu berücksichtigen ist. In Abschn. 5.5.2 können Sie am Beispiel der ganzzahligen Sudoku-Formulierung den Geschwindigkeitsunterschied zwischen Gurobi und CBC hautnah erleben. Kommerzielle Solver enthalten im Vergleich zu ihren kostenlosen Alternativen das weitere Komfort-Feature, dass sie manche nichtlinearen Terme wie Produkte von Binärvariablen oder Betragsfunktionen direkt angeben können und die lineare Umformulierung nicht händisch durchführen müssen.

5.5

Beispiele und Anwendungen

5.5.1

Zwölf Wächterinnen

Das folgende kleine Problem entstammt [13] und eignet sich gut, um mit den verschiedenen Elementen eines MILPs vertraut zu werden. Problembeschreibung Die Burg von Lord Hamilton wird von allen vier Seiten bedroht. Deshalb bittet er zwölf seiner besten Wächterinnen, auf der Aussichtsplattform seines höchsten Turms Tag und Nacht die Umgebung im Blick zu behalten. Die Wächterinnen können auf den zwölf Positionen platziert werden, die in Abb. 5.3 angegeben sind. Jede Seite der Plattform enthält vier Positionen. Alle Wächterinnen auf Seitenplattformen können nur in jeweils eine Richtung sehen, wohingegen auf den Eckplattformen 1, 4, 9 und 12 jeweils zwei Richtungen beobachtbar sind. Platzieren Sie die Wächterinnen so auf den Positionen, dass jeweils fünf Wächterinnen jede Seite observieren. 1. Wie können die Wächterinnen auf den Plattformen verteilt werden? 2. Was ist die geringste Anzahl von Wächterinnen, um Lord Hamiltons Turm gemäß seiner Vorstellungen zu bewachen? 3. Ist das Problem mit zwölf Personen lösbar, wenn höchstens zwei Wächterinnen pro Position eingeteilt werden dürfen? 4. Lord Hamilton hat plötzlich Sicherheitsbedenken und möchte nun, dass Sie die zwölf Wachhabenden so einteilen, dass jetzt jede Seite von sechs Personen bewacht wird. Aus Gründen, die Sie nicht nachvollziehen können, soll aber gleichzeitig die Anzahl der Personen pro Position minimal sein. Modelle und Lösungen Sie bearbeiten die Fragen in der oben angegebenen Reihenfolge.

102

5

1

Gemischt-ganzzahlige lineare Optimierungsmodelle

2

3

4

5

6

7

8

9

10

11

12

Abb. 5.3 Aussichtsplattformen der zwölf Wächterinnen

1. Sie führen ganzzahlige nichtnegative Entscheidungsvariablen xi ∈ Z, i ∈ {1, . . . , 12} mit xi ≥ 0 ein, die angeben, wie viele Wächterinnen der Plattform i zugewiesen werden. Da es insgesamt zwölf Wächterinnen gibt, gilt die Nebenbedingung 12 

xi = 12.

i=1

Darüber hinaus sollen fünf Augenpaare jede Seite observieren, wobei die Eckpositionen immer zwei Seiten im Blick haben. Sie fordern also x1 + x2 + x3 + x4 ≥ 5 und x1 + x5 + x7 + x9 ≥ 5 sowie x9 + x10 + x11 + x12 ≥ 5 und x4 + x6 + x8 + x12 ≥ 5. Auf eine Zielfunktion wird zunächst verzichtet. Die Python-Implementierung ist straight forward.

5.5 Beispiele und Anwendungen

103

Hier ist die zugehörige Ausgabe. Platform Platform Platform Platform Platform Platform Platform Platform Platform Platform Platform Platform

1: 2 guards 2: 0 guards 3: 0 guards 4: 3 guards 5: 0 guards 6: 0 guards 7: 0 guards 8: 2 guards 9: 3 guards 10 : 0 g u a r d s 11 : 2 g u a r d s 12 : 0 g u a r d s

2. Sie führen eine neue reelle Entscheidungsvariable z ein, mit der Sie die 12 im obigen Modell ersetzen, d. h., es gilt jetzt 12 

xi = z,

i=1

und Sie führen eine zu minimierende Zielfunktion ein, die aus der Variablen z besteht. Der angepasst Python-Code

104

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

ergibt die folgende, etwas extreme, Lösung: M i n i m a l n u m b e r of g u a r d s : 10 Platform 1: 0 guards Platform 2: 0 guards Platform 3: 0 guards Platform 4: 5 guards Platform 5: 0 guards Platform 6: 0 guards Platform 7: 0 guards Platform 8: 0 guards Platform 9: 5 guards P l a t f o r m 10 : 0 g u a r d s P l a t f o r m 11 : 0 g u a r d s P l a t f o r m 12 : 0 g u a r d s

Es werden also mindestens zehn Wächterinnen benötigt, die auf den Eckplattformen vier und neun aufgestellt werden. 3. Für die Beantwortung der Frage, ob eine Aufteilung der zwölf Wächterinnen existiert, bei der Lord Hamilton in Ruhe und Sicherheit sein Mittagsnickerchen durchführen kann und gleichzeitig nicht mehr als zwei Personen derselben Plattform zugewiesen werden, fügen Sie einfach eine obere Schranke von zwei an die

5.5 Beispiele und Anwendungen

105

Variablen des Modells der ersten Frage hinzu. Puh, das war ein langer Satz. Der Code ist hoffentlich verständlicher.

Es existiert eine Lösung! Diese lautet folgendermaßen. Platform Platform Platform Platform Platform Platform Platform Platform Platform Platform Platform Platform

1: 2 guards 2: 1 guards 3: 0 guards 4: 2 guards 5: 1 guards 6: 0 guards 7: 0 guards 8: 1 guards 9: 2 guards 10 : 1 g u a r d s 11 : 0 g u a r d s 12 : 2 g u a r d s

4. Um das erhöhte Sicherheitsbedürfnis von Lord Hamilton zu erfüllen, erscheint es Ihnen ratsam, eine reelle Entscheidungsvariable z einzuführen, die minimiert wird, und über die Nebenbedingungen xi ≤ z, i ∈ {1, . . . , 12} unter Ausübung sanften Drucks jedes xi freundlich aber bestimmt ermutigt, sich so klein wie möglich zu machen.

106

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Sie inspizieren die Lösung M i n i m a l n u m b e r of g u a r d s per p l a t f o r m : 3 Platform 1: 3 guards Platform 2: 0 guards Platform 3: 0 guards Platform 4: 3 guards Platform 5: 0 guards Platform 6: 0 guards Platform 7: 0 guards Platform 8: 0 guards Platform 9: 3 guards P l a t f o r m 10 : 0 g u a r d s P l a t f o r m 11 : 0 g u a r d s P l a t f o r m 12 : 3 g u a r d s

und stellen fest, dass diese erhöhten Sicherheitsvorkehrungen dazu führen, dass nun jeweils drei Wächterinnen auf den Eckplattformen platziert werden.

5.5 Beispiele und Anwendungen Abb. 5.4 Das angeblich schwerste Sudoku der Welt

107

8 3

6

7 5

9 4

2 7 5

7

1 1 8

5

9 5.5.2

3 6 1

8

4

Das schwerste Sudoku der Welt

Der finnische Mathematiker Arto Inkala behauptete im Jahr 2012, das schwerste Sudoku der Welt entwickelt zu haben. Sie sehen es in Abb. 5.4. Sudoku ist ein Knobelspiel US-amerikanischen Ursprungs (nicht japanischen Ursprungs, wie man vielleicht aufgrund des Namens vermuten könnte), bei dem es darum geht, die freien Kästchen mit Zahlen zwischen eins und neun zu füllen und dabei die folgenden Regeln zu beachten. • Jede Zahl muss pro Zeile genau ein Mal vorkommen. • Jede Zahl muss pro Spalte genau ein Mal vorkommen und – Überraschung – • auch pro Box muss jede Zahl genau ein Mal vorkommen. Unter einer Box verstehen wir dabei ein farblich markiertes 3 × 3-Feld. Wie lauten die Lösungen des obigen Sudokus? Ein intuitives aber schlechtes Modell Intuitiv würden Sie vermutlich für jedes Feld eine ganzzahlige Entscheidungsvariable zwischen eins und neun einführen. Das war auch meine erste Idee, und wir werden dieses Tal der Tränen aus didaktischen Gründen gemeinsam durchschreiten, um uns anschließend umso mehr über die elegante Lösung freuen zu können. Bereit? Mit mulmigem Gefühl führen Sie also die Mengen R = {1, . . . , 9} und C = {1, . . . , 9}

108

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

der Zeilen und Spalten des Sudokus ein und definieren anschließend die 81 ganzzahligen Entscheidungsvariablen xr c ∈ {1, . . . , 9}, r ∈ R, c ∈ C, die angeben, welche der Zahlen von eins bis neun in das Feld der Reihe r und Spalte c einzutragen sind. So würde etwa x2,4 = 5 bedeuten, dass in der zweiten Zeile und vierten Spalte die Zahl fünf eingetragen wird. Bevor Sie die Nebenbedingungen formulieren, definieren Sie noch die Menge der Mengen aller neun 3 × 3-Boxen B =

  {(3i + k, 3 j + l)| k, l ∈ {1, 2, 3}| i, j ∈ {0, 1, 2}} .

Falls Sie das nicht auf Anhieb selbst hätten hinschreiben können, ist das nicht schlimm. Solche Konstruktionen finden sich in der Regel am besten in einer ruhigen Viertelstunde am PC bei dem Versuch, die Menge B als verschachtelte Datenstruktur zu implementieren. Das sollten Sie an dieser Stelle auch versuchen. Wie sieht eine Liste von Listen in Python aus, die B abbildet? Bei den Nebenbedingungen werden zunächst mit x1,1 = 8, x2,3 = 3, . . . , x9,7 = 4 alle Variablen fixiert, die bereits in das Sudoku eingetragen wurden. Nun möchten Sie modellieren, dass sich die Variablen pro Zeile, Spalte und Box unterscheiden, und das Elend beginnt. Die Variablen xr c und xr  c unterscheiden sich genau dann, wenn |xr c − xr  c | ≥ 1 gilt. Das können Sie zwar in manchen kommerziellen Solvern direkt so modellieren, aber wir werden hier eine lineare Formulierung händisch angeben, um auch freie Solver zur Lösung heranziehen zu können. Um die Modellierung halbwegs übersichtlich zu gestalten, führen wir eine kontinuierliche Hilfsvariable ar cr  c ∈ R ein, die den Wert der Differenz aufnimmt und formulieren entsprechend ar cr  c = xr c − xr  c sowie |ar cr  c | ≥ 1, wobei die Index-Tupel (r , c, r  , c ) natürlich passend gewählt sein müssen, aber dazu

später mehr. Sie wissen natürlich, dass |ar cr  c | ≥ 1 äquivalent ist zu ar cr  c ≤ −1 oder ar cr  c ≥ 1,

5.5 Beispiele und Anwendungen

109

und mit der Modellierung des logischen Oders haben wir uns bereits in Abschn. 5.4.1 beschäftigt und können das erarbeitete Wissen hier gewinnbringend einsetzen. Sie erinnern sich, dass Sie für die Formulierung ein sogenanntes großes M benötigen und überlegen sich zunächst, welche Werte ar cr  c als Differenz der Variablen xr c und xr  c annehmen kann. Hier hilft es, die jeweiligen Extremsituationen zu untersuchen. Die „x-Variablen“ nehmen jeweils Werte zwischen 1 und 9 an. Die Differenz zweier solcher Variablen kann entsprechend niemals kleiner als −8 oder größer als 8 sein. Es gilt also L ≤ ar cr  c ≤ U

(5.2)

mit L = −8 und U = 8. Um die Fallunterscheidungen ar cr  c ≤ −1 oder ar cr  c ≥ 1 modellieren zu können, führen wir für jedes Paar von Zellen (r , c) und (r  , c ) eine Binärvariable yr cr  c ein, für die gelten soll yr cr  c = 1, falls ar cr  c ≤ −1 und yr cr  c = 0, falls ar cr  c ≥ 1. Mithilfe der Unter- und Oberschranken L und U können Sie jetzt eine Big-MFormulierung des gewünschten Sachverhalt modellieren. Werfen Sie doch hier bitte einen Blick in Abschn. 5.4.1 und versuchen es selbst, bevor Sie weiterlesen. Die Restriktionen ar cr  c ≤ −1 + (1 − yr cr  c ) · 9

(5.3)

ar cr  c ≥ 1 − yr cr  c · 9

(5.4)

und

erfüllen den gewünschten Zweck. Wir verifizieren die Formulierung der obigen Ungleichungen per Fallunterscheidung nach yr cr  c . Für yr cr  c = 1 erhalten wir aus (5.3) die Ungleichung ar cr  c ≤ −1, was den gewünschten Effekt erzeugt. Darüber hinaus impliziert yr cr  c = 1 in (5.4) die Nebenbedingung ar cr  c ≥ −8, was laut (5.2) ohnehin immer erfüllt ist, das heißt, die Restriktion (5.4) ist redundant und erzeugt insbesondere auch keine Widersprüche zur gewünschten Ungleichung ar cr  c ≤ −1. Für yr cr  c = 0 ergibt sich aus (5.3) die redundante Restriktion ar cr  c ≤ 8, und übrig bleibt aus (5.4) die aktive Nebenbedingung ar cr  c ≥ 1. Passt also. Dies erlaubt es uns nun, das Modell gemäß den Spielregeln für Sudokus formal sauber zu formulieren.

110

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

• Pro Zeile r soll ar cr c ≤ −1 + (1 − yr cr c ) · 9, ar cr c ≥ 1 − yr cr c · 9 gelten, wobei c und c paarweise verschiedenen Spalten aus C sind. • Analog fordern Sie pro Spalte c ar cr  c ≤ −1 + (1 − yr cr  c ) · 9, ar cr  c ≥ 1 − yr cr  c · 9, wobei r und r  paarweise verschiedenen Zeilen aus R sind. • Schließlich soll pro Box b ∈ B ar cr  c ≤ −1 + (1 − yr cr  c ) · 9, ar cr  c ≥ 1 − yr cr  c · 9 gelten, wobei (r , c) und (r  , c ) jeweils zwei verschiedene Felder aus derselben Box b sind. Eine Zielfunktion gibt es nicht. Beim Python-Code haben wir auf die Einführung der Hilfsvariablen ar cr  c verzichtet und stoppen die Zeiten für die Lösung des Modells mit dem freien Solver CBC und der kommerziellen Alternative Gurobi, um sie anschließend vergleichen zu können.

5.5 Beispiele und Anwendungen

111

112

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Die Lösung +-------+-------+-------+ | 8 1 2 | 7 5 3 | 6 4 9 | | 9 4 3 | 6 8 2 | 1 7 5 | | 6 7 5 | 4 9 1 | 2 8 3 | +-------+-------+-------+ | 1 5 4 | 2 3 7 | 8 9 6 | | 3 6 9 | 8 4 5 | 7 2 1 | | 2 8 7 | 1 6 9 | 5 3 4 | +-------+-------+-------+ | 5 2 1 | 9 7 4 | 3 6 8 | | 4 3 8 | 5 2 6 | 9 1 7 | | 7 9 6 | 3 1 8 | 4 5 2 | +-------+-------+-------+

wird von Gurobi innerhalb von drei Sekunden errechnet, wohingegen die Rechnung von CBC innerhalb einer Stunde keine Lösung berechnen konnte und deshalb abgebrochen wurde. Ein weniger offensichtliches, aber sehr elegantes Modell Die Modellierung und Implementierung macht deutlich mehr Spaß, wenn Sie vorher etwas über das Problem nachdenken. Ihnen ist vielleicht aufgefallen, dass in das Sudoku zwar neun verschiedene Zahlen eingetragen werden müssen, diese Zahlen aber genauso gut auch neun verschiedene Symbole, wie Apfel, Flugzeug, Fußball, …, hätten sein können. Es geht also nicht darum, neun verschiedene ganze Zahlen einzutragen, sondern lediglich darum, aus neun unterschiedlichen Objekten die passenden Einträge pro Feld zu wählen. Hierzu können Sie einen Ansatz wählen, der im Bereich Data Science unter dem Begriff One-Hot-Encoding bekannt ist. Sie führen für jede Kombination aus Zeile r , Spalte c und Wert v ∈ V := {1, . . . , 9} keine beliebige ganzzahlige, sondern eine binäre Entscheidungsvariable yr cv ∈ {0, 1}, r ∈ R, c ∈ C, v ∈ V mit folgender Interpretation ein. Falls yr cv = 1 gilt, steht in Zeile r und Spalte c der Wert v, und für yr cv = 0 steht im Feld mit den Koordinaten (r , c) eben nicht der Wert v. Analog zum obigen Beispiel steht nun y2,4,5 = 1 dafür, dass in der zweiten Zeile

5.5 Beispiele und Anwendungen

113

und vierten Spalte der Wert fünf eingetragen wird. Diese Denkweise ist vielleicht nicht intuitiv, ermöglicht aber eine wunderschöne Modellierung, die ohne die Big-M auskommt. • Dass jeder Wert pro Spalte nur ein Mal vorkommen darf, formulieren Sie über  yr cv = 1 r ∈R

für alle Spalten c ∈ C und Werte v ∈ V . Da eine Summe von Binärvariablen genau dann eins ist, wenn genau eine der Binärvariablen eins und alle verbleibenden null sind, erfüllt die Formulierung den gewünschten Zweck. • Analog fordern Sie pro Zeile  yr cv = 1 c∈C

für alle Zeilen r ∈ R und Werte v ∈ V • sowie  yr cv = 1 (r ,c)∈b

für jede Box b ∈ B und jeden Wert v ∈ V . • Zum Schluss bleibt noch die leicht zu übersehende Bedingung, dass in jedes Kästchen genau eine Zahl einzutragen ist, die Sie per  yr cv = 1 v∈V

für alle r ∈ R und c ∈ C formulieren. Die Python-Implementierung lautet

114

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

5.5 Beispiele und Anwendungen

115

und ergibt dieselbe Lösung, wie in der ganzzahligen Formulierung. Allerdings gibt es sehr gute Nachrichten, was die Lösungszeiten angeht. Gurobi löst die binäre Formulierung nun in 0.058 s, und CBC beendet den Optimierungslauf erfolgreich nach 0.123 s. Die schönere Modellformulierung verringert also Gurobis Rechenzeiten um den Faktor 51. Bei CBC ist die Situation sogar noch dramatischer, da das Sudoku für die ganzzahlige Variante innerhalb einer Stunde nicht lösbar war. Weitere Lösungen des Sudokus und no-good cuts Ein gut gestelltes Sudoku sollte eindeutig lösbar sein. Um zu überprüfen, ob das Sudoku aus Abb. 5.4 keine weitere Lösung besitzt, können Sie folgenden Trick anwenden. Sie fügen dem Optimierungsmodell eine weitere Restriktion hinzu, welche die bisherige Lösung (und zwar nur diese!) ausschließt, und überprüfen, ob das Sudoku weiterhin lösbar ist. Falls ja, muss es eine weitere Lösung besitzen. Eine Restriktion, die genau einen Punkt ausschließt, wird auch no-good cut oder no-good constraint genannt. Wie funktioniert das genau? Stellen Sie sich vor, Ihr rein binäres Optimierungsmodell besitzt drei Binärvariablen y1 , y2 und y3 . Sie möchten aus privaten Gründen in Ihrem Modell die Lösung y1 = 0, y2 = 0 und y3 = 1 ausschließen. Dies gelingt, indem Sie verlangen, dass y1 + y2 + (1 − y3 ) ≥ 1 gelten soll. Warum? Zunächst ist klar, dass der Punkt (0, 0, 1) durch die obige Restriktion ausgeschlossen ist, da 0 + 0 + (1 − 1) = 0 < 1 gilt. Das ist jedoch auch der einzige Punkt y ∈ B3 , der ausgeschlossen wurde, da für alle anderen möglichen Belegungen von y1 , y2 und y3 entweder y1 oder y2 den Wert Eins oder aber y3 den Wert Null annehmen wird. In jedem Fall entsteht auf der linken Seite der Ungleichung ein Ausdruck größer oder gleich eins, weshalb dieser Punkt nicht durch obige Bedingung weggeschnitten wurde. Stellen Sie sich nun ein Optimierungsmodell mit beliebig vielen Binärvariablen y1 , . . . , yn vor. Um eine bestimmte Belegung dieser Binärvariablen yˆ1 , . . . , yˆn ∈ {0, 1} mithilfe eines no-good cuts wegzuschneiden, stecken Sie den Index i der Binärvariablen yi in die Menge I0 , falls yˆi = 0 gilt, und andernfalls in I1 . Es gilt also I0 := {i ∈ {1, . . . , n}| yˆi = 0} und I1 := {i ∈ {1, . . . , n}| yˆi = 1}.

116

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Der no-good cut lautet dann  i∈I0

yi +



(1 − yi ) ≥ 1

i∈I1

und stellt die direkte Verallgemeinerung des schönen kleinen obigen dreidimensionalen Falls dar. Für die binäre Version des Sudokus gibt es einen weiteren netten no-good cut. Von den 729 Binärvariablen yr cv nehmen in einer Lösung genau 81 Variablen den Wert Eins an. Warum? – Die anderen sind null. Sie können also basierend auf einer Lösung y  des Optimierungsproblems die Indizes der Binärvariablen sammeln, die aktiv waren, definieren damit die Menge I = {(r , c, v)| yrcv = 1} und fügen dem Sudoku den simplen Cut 

yr cv ≤ 80

(r ,c,v)∈I

hinzu. Dieser Schnitt entfernt genau die vorherige Lösung, in dem erzwungen wird, dass sich mindestens eine der Variablenbelegungen der vorherigen Lösung ändert. Der zugehörige Code lautet wie folgt.

5.5 Beispiele und Anwendungen

117

Eine Ausführung ergibt OptimizationStatus.INFEASIBLE, was bedeutet, dass das Optimierungsproblem nach der Hinzunahme des no-good cut keinen zulässigen Punkt mehr besitzt. Das Sudoku besitzt also tatsächlich nur eine einzige Lösung!

5.5.3

Lineare Regression und Sparse Least Absolute Deviations

Problembeschreibung Sie denken immer noch ab und zu über das Geheimnis eines guten Rotweins aus Abschn. 3.6.6 nach und stellen sich folgende Frage: Wenn Sie sich aus den elf potentiellen Einflussfaktoren für die wichtigsten fünf entscheiden müssten, welche würden Sie wählen? Diese Frage lässt sich in einem Teilgebiet der Statistik unter dem Schlagwort sparse regression verorten. Sparse übersetzt sich zu dünn besetzt und bezieht sich in einem mathematischen Kontext immer darauf, dass viele Nullen existieren. Eine dünn besetzte Matrix ist also zum Beispiel eine Matrix, die deutlich mehr NullEinträge als Nicht-Null-Einträge enthält. Bei der sparse regression suchen Sie nach Vorhersagefunktionen, bei denen viele Koeffizienten null sind. In diesem Beispiel

118

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

suchen Sie die fünf wichtigsten Einflussgrößen, das heißt, die verbleibenden sechs Koeffizienten werden den Wert Null annehmen. Das Modell Sie möchten nach wie vor den MAE minimieren, d. h., Ihre loss function lautet L(β) =

p n  1 |β0 + β j xi j − yi |. n i=1

j=1

Wie modellieren Sie nun, dass nur fünf Koeffizienten ungleich null sein dürfen? Sie führen für jedes βi eine Binärvariable bi , i ∈ {1, . . . , p}, ein und nehmen an, dass für alle Koeffizienten nach Normierung stets βi ∈ [−1, 1] gilt, wobei es Ihnen natürlich frei steht, andere Schranken an Ihre β-Variablen zu setzen. Nun koppeln Sie βi und bi durch die Ungleichungen −bi ≤ βi ≤ bi , i ∈ {1, . . . , p}. Diese führen dazu, dass bi = 0 immer auch βi = 0 erzwingt und sich βi für bi = 1 ihren Lieblingswert im Intervall [−1, 1] aussuchen darf. Da nur fünf der bi -Variablen ungleich null sein sollen, fügen Sie dem Modell noch die Restriktion p 

bi = 5

i=1

hinzu. Diese sorgt dafür, dass genau fünf der Binärvariablen den Wert Eins annehmen werden. Analog zu Abschn. 4.5.2 formulieren Sie nun das Problem linear um und erhalten das MILP P:

min

(β,z,y)∈R p+1 × Rn × R p

n 1 zi n

s.t. β0 +

i=1

p 

βi xi j − yi ≤ z i , i ∈ {1, . . . , n}

i=1

− (β0 +

p 

βi xi j − yi ) ≤ z i , i ∈ {1, . . . , n}

i=1

− bi ≤ βi ≤ bi , i ∈ {1, . . . , p} p 

bi = 5.

i=1

Jetzt geht es an die Implementierung! Die Lösung Hier ist die Implementierung des obigen MILPs in Python.

5.5 Beispiele und Anwendungen

119

120

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Die optimale Lösung lautet f i x e d a c i d i t y : 0 . 000 v o l a t i l e a c i d i t y : - 0 . 182 c i t r i c a c i d : 0 . 000 r e s i d u a l s u g a r : 0 . 000 c h l o r i d e s : - 0 . 111 f r e e s u l f u r d i o x i d e : 0 . 000 t o t a l s u l f u r d i o x i d e : - 0 . 093 d e n s i t y : 0 . 000 pH : 0 . 000 s u l p h a t e s : 0 . 215 a l c o h o l : 0 . 428

Vergleichen Sie die Ergebnisse mit den Ergebnissen der Abschn. 3.6.6 und 4.5.2. Interessanterweise sind die fünf wichtigsten Einflussfaktoren nicht einfach die Ergebnisse der LAD mit den betragsmäßig größten Werten, auch wenn die Ergebnisse sich ähneln.

5.5.4

Unit Commitment Problem I: Pumpspeicherkraftwerk

Problembeschreibung Unter der Kraftwerkseinsatzplanung, besser bekannt unter dem englischen Namen Unit Commitment Problem (UC), versteht man die optimale Planung der Fahrweisen, auch „Fahrpläne“ genannt, eines Kraftwerkparks, der in der Regel aus hydrothermischen Kraftwerken, d. h. Wasserkraftwerken und konventionellen Kraftwerken wie Gas- oder Kohlekraftwerken besteht. Was bedeutet in diesem Zusammenhang optimal? Grundsätzlich unterscheidet man hier zwischen zwei Sichtweisen. Steht die Deckung einer prognostizierten Nachfrage im Vordergrund, so sind Sie auf der Suche nach Fahrplänen, die einerseits die Nachfrage zu jedem Zeitpunkt erfüllen und andererseits kostenminimal sind. Möchten Sie in erster Linie den erzeugten Strom möglichst gewinnbringend handeln, so planen Sie einen gewinnmaximalen Einsatz der Kraftwerke in Bezug auf die prognostizierten Marktpreise. Sie beginnen zunächst mit der Betrachtung eines einzelnen Pumpspeicherkraftwerks, das Sie optimal gegen erwartete Marktpreise einsetzen möchten. In Abb. 5.5 sehen Sie ein Beispiel für ein solches Kraftwerk am Standort Goldisthal. Wie funktioniert ein Pumpspeicherkraftwerk (PSKW)? Wie der Name schon sagt, kann ein PSKW durch Einsatz von Pumpen Energie speichern, indem Wasser in ein oberhalb gelegenes Areal gepumpt wird. Sobald Sie das Wasser wieder nach unten fließen lassen, werden dadurch Turbinen aktiviert, die ihrerseits Strom produzieren. So weit so einfach. Üblicherweise wird Strom „verpumpt“, wenn dieser günstig ist, um ihn zu teureren Marktpreisen wieder dem System zuzuführen. Da die Speicherbecken kleinerer Kraftwerke jedoch nach einigen Stunden Pumpbetrieb vollgelaufen sind, müssen Sie bei der Berechnung einer optimalen Strategie auch die Kapazität der Becken in Betracht ziehen.

5.5 Beispiele und Anwendungen

121

Abb. 5.5 Ober- und Unterbecken des Pumpspeicherkraftwerks Goldisthal im Thüringer Schiefergebirge. (Quelle: Von HaSe – Eigenes Werk, CC BY-SA 4.0, https://commons.wikimedia.org/w/ index.php?curid=115182457)

Ihnen wird das fiktive Kraftwerk „Pumpi“ anvertraut, das mit einer Pumpe und einer Turbine ausgestattet ist. Die zugehörigen technische Daten entnehmen Sie Tab. 5.1. Hier sind in etwas vereinfachter Form die Spezifikationen von „Pumpi“: 1. Um ein zu volatiles Fahrverhalten zu verhindern, kann die Pump- und Turbinierleistung jeweils nur stündlich verändert werden. 2. Pumpe und Turbine lassen sich nicht gleichzeitig einsetzen. 3. Die Pumpe lässt sich nur diskret einsetzen, d. h., sie pumpt entweder mit der maximalen Leistung von 70 MW oder gar nicht. 4. Die Turbine lässt sich stufenlos im Intervall von 0 MW bis 90 MW einstellen. 5. Zu Beginn des Planungszeitraums enthält der Speichersee einen Energieinhalt von 300 MWh. Dieser soll am Ende wieder erreicht werden. Tab. 5.1 Technische Daten des fiktiven Pumpspeicherkraftwerks „Pumpi“ Kennzahl

Wert

Max. Pumpleistung Max. Turbinierleistung Wirkungsgrad Max. Energieinhalt Speichersee

70 MW 90 MW 75 % 630 MWh

122

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Abb. 5.6 Stündliche Elspot Preise im Raum DEU-LU in Euro. nordpoolgroup.com/historical-market-data/)

(Quelle: https://www.

6. Während des Betriebs soll der Energieinhalt des Speichersees die Marke von 100 MWh nicht unterschreiten, da ansonsten die Touristenboote auf dem Trockenen sitzen. 7. Zur Vereinfachung wird der Wirkungsgrad komplett der Pumpe zugewiesen, d. h., nach fünf Stunden Pumpen à 90 MW befinden sich zusätzliche 5 h · 90 MW · 0.75 = 337.5 MWh im See, die anschließend verlustfrei turbiniert werden können. In Abb. 5.6 sehen Sie die stündlichen Preise an der Strombörse in den 8760 h des Jahres 2021 für die Region Deutschland-Luxemburg. Wie hätte sich „Pumpi“ im Jahr 2021 gewinnmaximal einsetzen lassen? 2

2 Natürlich überschätzen Sie mit dieser Vorgehensweise den tatsächlichen Ertrag, da man bekannter-

weise hinterher immer schlauer ist (perfect foresight). Trotzdem möchten Sie diesen theoretischen maximalen Ertrag berechnen, da er beispielsweise interessant für die finanzielle Bewertung Ihres Kraftwerks ist und eine Obergrenze an mögliche zu erwirtschaftende Gewinne darstellt. Für den vorausblickenden realistischen Einsatz eines PSKW unter Unsicherheit sei hier auf das Gebiet der stochastischen Optimierung verwiesen, das in diesem Buch nicht behandelt wird.

5.5 Beispiele und Anwendungen

123

Das Modell Sie kümmern sich zunächst um die Daten und bezeichnen • • • • • • • •

die letzte Stunde des Planungszeitraums mit Tmax . Hier gilt Tmax = 8760. Alle zu planenden Stunden sind Teil der Menge T = {1, . . . , Tmax } und der Strompreis zur Stunde t ∈ T erhält den Namen pt . Nun bezeichnen Sie die Pumpleistung mit L, die maximale Turbinierleistung mit M, den minimalen und maximalen Speicherinhalt des Sees mit lmin und lmax sowie den initialen und finalen Speicherinhalt mit l¯ und letztlich den Wirkungsgrad der Pumpe mit .

Anschließend führen Sie die folgenden Entscheidungsvariablen ein. 1. Die kontinuierliche Entscheidungsvariable xt ≥ 0 gibt an, welche Turbinierleistung [MW] in Stunde t ∈ T erbracht wird. 2. Wird in Stunde t ∈ T gepumpt, so nimmt die Binärvariable bt ∈ {0, 1} den Wert Eins an. Ansonsten gilt bt = 0. 3. Schließlich gibt die kontinuierliche Variable lt ≥ 0 das Energielevel des Speichersees am Ende von Stunde t an. Um den initialen Inhalt des Sees modellieren zu können, wird lt für alle t aus T0 := {0} ∪ T = {0, . . . , Tmax } modelliert. Bei den Restriktionen gilt zunächst xt ≤ M, lt ≥ lmin und lt ≤ lmax f¨ur alle t ∈ T , da zu jeder Stunde die maximale Turbinierleistung nicht überschritten werden darf, und es dem Speichersee untersagt wird, zu voll oder zu leer zu sein. Darüber hinaus sorgen die Bedingungen l0 = l Tmax = l¯ dafür, dass der See zu Beginn und Ende des Planungszeitraums Wasser im Gegenwert von 300 MWh enthält. Der Energieinhalt des Sees am Ende der Stunde t ergibt sich aus dem Energieinhalt am Ende der letzten Stunde t − 1 abzüglich der turbinierten Leistung in Stunde t zuzüglich der verpumpten Leistung nach Abzug des Wirkungsfaktors in selbiger Stunde. Als Formel ist das vermutlich sogar leichter zu verstehen: lt = lt−1 − xt + L ·  · bt , t ∈ T

124

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Dass Turbine und Pumpe nicht gleichzeitig arbeiten können, modellieren Sie mithilfe von xt ≤ (1 − bt ) · M, t ∈ T . Per Fallunterscheidung nach bt können Sie wieder die Korrektheit der Restriktion verifizieren. Für bt = 0 ergibt sich die Bedingung xt ≤ M, die bereits oben separat aufgeführt wurde und dementsprechend auch weggelassen werden kann. Im Fall bt = 1 erhalten Sie xt ≤ 0 und wegen xt ≥ 0 somit direkt xt = 0. Es bleibt noch die zu maximierende Zielfunktion 

(xt − L · bt ) · pt ,

t∈T

die modelliert, dass die turbinierte Leistung zum jeweiligen stündlich geltenden Marktpreis verkauft werden kann, wohingegen für die Pumpleistung auch der jeweilige Preis zu zahlen ist. Hier ist der Übersicht halber nochmal das vollständige Optimierungsmodell: max



(xt − L · bt ) · pt

t∈T

s.t. lt ≥ lmin , lt ≤ lmax , l0 lt xt xt bt

= l Tmax = l¯ = lt−1 − xt + L ·  · bt , ≤ (1 − bt ) · M, ≥ 0, ∈ {0, 1},

t∈T t∈T t t t t

∈ ∈ ∈ ∈

T T T T

Die Lösung Bei der Implementierung in Python ist zu beachten, dass kontinuierliche Entscheidungsvariablen in allen dem Autor bekannten Paketen per default eine untere Schranke von null haben, d. h. als nichtnegative Variablen modelliert werden. Hier ist das implementierte Modell unter Verwendung von mip für die Modellierung und pandas für das Einlesen der Daten.

5.5 Beispiele und Anwendungen

125

126

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Die optimale Lösung des Problems mit immerhin 8760 Binärvariablen wird von Gurobi in kaum messbarer Zeit und von CBC innerhalb von fünf Sekunden berechnet. Validierung der Ergebnisse Wie können Sie die Ergebnisse validieren? Sie möchten sicherstellen, dass Sie keine groben Modellierungsfehler begangen haben oder vielleicht die Daten offensichtlich fehlerhaft waren. Darüber hinaus möchten Sie auch gegenüber den Anwenderinnen ein Vertrauen für Ihr Modell schaffen und überlegen sich folgende Plausibilitätschecks. Sie möchten überprüfen, ob das Energielevel des Stausees die vorgegebenen Unter- und Obergrenze von 100 MW bzw. 630 MW einhält. Das testen Sie zunächst mithilfe des assert-Statements in Python

und plotten anschließend in Abb. 5.7 noch den Verlauf des Energieniveaus über der Zeit. Was erwarten Sie ansonsten von den Ergebnissen der Optimierung? Eine Weisheit der Energiewirtschaft lautet „Pumpstunden sind günstiger als Turbinierstunden.“ Damit ist gemeint, dass Sie den See in Stunden vollpumpen, in denen der Strompreis niedrig ist, um anschließend für bessere Preise durch die Turbinen wieder Strom in das Netz einzuspeisen. Entsprechen die Ergebnisse der Optimierungsrechnung dieser Logik? Sie berechnen zunächst im Code den durchschnittlichen Strompreis einer Stunde, in der die Pumpe aktiv war, und überprüfen, ob der Preis während einer mittleren Turbinierstunde höher war.

Abb. 5.7 Links: Energieinhalt des Stausees im Jahresverlauf 2021, rechts: Energieinhalt des Stausees für die ersten hundert Stunden

5.5 Beispiele und Anwendungen

127

Siehe da. Eine durchschnittliche Pumpstunde ist mit 67.67 EUR fast halb so teuer wie eine Turbinierstunde, die im Mittel 132.41 EUR kostet. In Abb. 5.8 sehen Sie die Verteilung der „Pump- und Turbinierpreise“, d. h. der Strompreise der Stunden, in denen gepumpt bzw. turbiniert wurde.

5.5.5

Unit Commitment Problem II: Thermisches Kraftwerk

Problembeschreibung Nach der Betrachtung von Pumpspeicherkraftwerken wenden Sie sich nun sogenannten thermischen Kraftwerken zu. In Abb. 5.9 sehen Sie beispielhaft das Steinkohlekraftwerk GKM in Mannheim. Was ist ein thermisches Kraftwerk? Vereinfacht gesprochen, wandeln thermische Kraftwerke Wärme in elektrische Energie um. Dies erfolgt beispielsweise durch die Verbrennung von Kohle oder Gas, womit wiederum Dampf erzeugt wird, der über weitere Schritte (Dampfturbine und Generator) zur Stromerzeugung genutzt wird. Die technischen Restriktionen eines thermischen Kraftwerks sind deutlich komplizierter als bei Pumpspeicherkraftwerken, wie Sie gleich am Beispiel des Kraft-

Abb. 5.8 Histogramme der Preise, zu denen gepumpt bzw. turbiniert wurde

128

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Abb. 5.9 Steinkohlekraftwerk GKM in Mannheim. (Quelle: Wikimedia Commons, lizenziert gemäß CC BY-SA 4.0)

werks „Thermi“ feststellen werden, das Ihnen zur optimalen Bewirtschaftung überlassen wurde. Im Gegensatz zum letzten Abschnitt verstehen wir hier unter einem optimalen Einsatz nicht die gewinnmaximale Vermarktung gegen Marktpreise, sondern den kostenminimalen Einsatz zur Bedarfsdeckung. Wir beginnen mit dem Studium der Eigenschaften von „Thermi“, die bei der Planung eines Einsatzes berücksichtigt werden müssen.3 Diese gelten qualitativ für alle thermischen Kraftwerke und unterscheiden sich lediglich graduell. 1. Ein Kraftwerk kann nicht beliebig viel (und in der Regel auch nicht beliebig wenig) Leistung erbringen. Die Grenzwerte für „Thermi’s“ minimale und maximale Leistung während der Inbetriebnahme liegen bei 100 MW bzw. 500 MW. 2. Die Leistungserzeugung erfolgt nicht mit beliebig hoher Volatilität. Vielmehr ist die sogenannte „Rampe“, die die absolute Änderung der Leistungserzeugung zwischen zwei aufeinanderfolgenden Zeiteinheiten beschreibt, nach oben begrenzt. Für „Thermi“ liegt die Beschränkung der absoluten Leistungsänderung zweier aufeinanderfolgenden Stunden bei 120 MW/h. 3. Es gibt minimale und maximale Dauern für die Inbetriebnahme. Insbesondere die minimale Betriebszeit ist relevant, da diese dafür sorgt, dass sie beispielsweise ein Kohlekraftwerk nicht für 15 min ausschalten können, um es anschließend direkt wieder zu verwenden. Die maximale Dauer wird oft ohnehin durch Wartungsarbeiten oder ähnliches berücksichtigt und muss für kurzfristige Planungen nicht explizit formuliert werden. Die minimale Betriebsdauer von „Thermi“ beträgt 7 h. 4. Die Kosten für den Betrieb eines Kraftwerks lassen sich vereinfacht formuliert in Produktionskosten (in EUR/MWh) und Kosten für das Starten eines Kraftwerks aufteilen, die wir ab jetzt mit Start-up costs bezeichnen. Für „Thermis“ Produktionskosten können Sie von 40 EUR/MWh ausgehen und die Start-up costs liegen bei 50 000 EUR.

3 Um

die Darstellung übersichtlich zu gestalten, wurde die Auswahl der Spezifikationen auf das Wesentliche reduziert. Für einen ausführlichen Überblick aller Aspekte verweisen wir auf [27].

5.5 Beispiele und Anwendungen

129

Tab. 5.2 Technische Spezifikationen des fiktiven thermischen Kraftwerks „Thermi“ Technische Spezifikationen

„Thermi“

Maximale Leistung Minimale Leistung Maximale absolute Leistungsänderung Minimale Betriebsdauer Produktionskosten Start-up costs

500 MW 100 MW 120 MW/h 7h 40 EUR/h 50 000 EUR

Tab. 5.2 fasst diese Werte zusammen. Sie fühlen sich nun ausreichend über den Anwendungsfall informiert und sind bereit für Ihre Aufgabe. Bestimmen Sie einen kostenminimalen Fahrplan für „Thermi“, um den Strombedarf der nächsten 24 h, dargestellt in Abb. 5.10, zu decken. Das Modell Sie machen sich an die Formulierung eines zugehörigen Optimierungsmodells. Zunächst kümmern Sie sich um die Daten und geben allen auftretenden Größen von Relevanz wohlklingende mathematische Namen. • Die letzte Stunde des Planungshorizonts erhält den Namen Tmax , • wohingegen wir alle Stunden des Planungszeitraums in der Menge T = {1, . . . , Tmax } speichern. Beachten Sie, dass man in der Mathematik typischerweise eine

Abb. 5.10 Ein exemplarischer Verlauf der Stromnachfrage über 24 h

130

• • • • • •

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Aufzählung mit der Zahl Eins beginnt, was den Gepflogenheiten des Zählens in den meisten Programmiersprachen widerspricht, in denen das erste Element typischerweise die Null ist. Die Nachfrage nach Strom in Stunde t ∈ T wird mit dt bezeichnet und in der Einheit MW gemessen. Die maximale oder minimale Leistung des Kraftwerks erhält den Namen Pmax bzw. Pmin . Für die maximale betragsmäßige Änderungsrate der Leistung in MW/h wurde das Symbol max auserkoren und die minimale Betriebszeit nennt sich L min . Letztlich fallen Produktionskosten c in EUR/MWh an und Start-up costs von s.

Wie lauten Ihre Entscheidungsvariablen? In diesem Modell haben Sie als „echte“ Entscheidungsvariable die produzierte Leistung pro Zeiteinheit t und einige weitere Entscheidungsvariablen, die sich daraus ableiten und die Modellierung vereinfachen. • Die produzierte Leistung des Kraftwerks pro Stunde t wird mit pt bezeichnet und ist nichtnegativ, d. h., es gilt pt ≥ 0 für alle t ∈ T . Sie ist die entscheidende Größe Ihres Modells. • Die Binärvariable yt ∈ {0, 1} gibt an, ob das Kraftwerk in Stunde t in Betrieb ist (yt = 1) oder nicht (yt = 0). • Ob das Kraftwerk zu Beginn der Stunde t eingeschaltet wurde, entnehmen Sie der Tatsache, ob die Entscheidungsvariable δton ∈ {0, 1} den Wert Eins annimmt. Andernfalls ist δton = 0. (Der griechische Buchstabe δ wird übrigens „Delta“ ausgesprochen.) of f • Analog zum vorherigen Fall kodiert δt ∈ {0, 1} das Ausschalten des Kraftwerks zu Beginn der Stunde t. Nun kommen Sie zur Zielfunktion. Sie definieren die zu minimierende Funktion T max

pt · c + δton · S,

t=1

die alle anfallenden Kosten enthält. Würden Sie diese Zielfunktion nun ohne weitere Einschränkungen minimieren, so würde Ihr Lösungsalgorithmus trivialerweise alle Entscheidungsvariablen auf null setzen und Ihnen unbekümmert mitteilen, dass keine Kosten anfallen. Da dies leider nicht der Realität entspricht, werden Sie sich nun

5.5 Beispiele und Anwendungen

131

daran machen, alle Einschränkungen, die die Wirklichkeit mit sich bringt, in Form von Constraints abzubilden. • Nach Rücksprache mit der Kraftwerkscrew erfahren Sie, dass „Thermi“ zu Beginn des Planungshorizonts in Betrieb ist, und setzen deshalb y1 = 1, um diese Information in das Modell zu integrieren. • Die Restriktion pt ≥ dt , t ∈ T garantiert, dass zu jedem Zeitpunkt ausreichend Strom produziert wird, um die Nachfrage zu decken. • Die maximale Änderungsrate wird durch die Constraint | pt − pt−1 | ≤ max , t ∈ {2, . . . , Tmax } begrenzt. Halten Sie hier bitte kurz inne und überlegen, warum diese Restriktion nicht für t = 1 formuliert wird. Da es sich in dieser Formulierung durch das Betragszeichen nicht um eine lineare Nebenbedingung handelt, formulieren Sie diese für alle t ∈ {2, . . . , Tmax } äquivalent um zu pt − pt−1 ≤ max ,

pt−1 − pt ≤ max ,

wie Sie es in Abschn. 4.4.1 gelernt haben. • In der nächsten Nebenbedingung können Sie Ihr Wissen über „Big-M“-Formulierungen aus Abschn. 5.4.1 einbringen, um direkt zwei Eigenschaften des Kraftwerks gleichzeitig zu formulieren. Die Ungleichung pt ≤ Pmax · yt , t ∈ T sorgt zum einen dafür, dass pt niemals den Wert Pmax überschreitet, und garantiert zum anderen, dass keine Leistung produziert wird, wenn das Kraftwerk außer Betrieb ist, da hier aus yt = 0 direkt pt = 0 folgt. Zur Erinnerung: pt ≥ 0 wurde schon bei der Definition der Entscheidungsvariablen pt angemerkt. • Analog dazu formulieren Sie pt ≥ Pmin · yt , t ∈ T , um sicherzustellen, dass die Mindestleistung im Betrieb nicht unterschritten wird.

132

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

• Da das Kraftwerk in derselben Stunde nicht gleichzeitig an- und ausgeschaltet werden kann, fordern Sie of f

δton + δt

≤ 1, t ∈ T ,

da dadurch ausgeschlossen wird, dass die Binärvariablen zum Zeitpunkt t beide den Wert Eins annehmen. • Bisher wissen die Betriebsvariablen yt nichts von den Ein- und Ausschaltvariablen of f δton und δt . Um dies zu ändern, führen Sie die Constraint of f

yt = yt−1 + δton − δt

, t ∈ {2, . . . , Tmax }

ein. Diese ist schon etwas komplizierterer Natur. Um sie nachzuvollziehen, spielen wir verschiedene Fälle durch. of f = 0 ist. Das ist Zunächst stellen Sie fest, dass yt = yt−1 gilt, falls δton − δt auch okay so, denn wenn Sie das Kraftwerk in Stunde t weder ein- noch ausschalten, verharrt es im bisherigen Betriebsmodus. Beachten Sie, dass aufgrund of f der vorherigen Restriktion der Fall δton = δt = 1 ausgeschlossen ist. Falls zu Beginn der Stunde t das Kraftwerk hochgefahren wird, gilt δton = 1 of f und dementsprechend δt = 0. Ferner muss es in der vorherigen Stunde inaktiv gewesen sein (yt−1 = 0) und ist nun in Betrieb (yt = 1). Die Restriktion scheint also den Einschaltvorgang eines Kraftwerks korrekt abzubilden. Bitte spielen Sie selbst das Ausschalten des Kraftwerks durch und verifizieren, dass auch hier die Nebenbedingung korrekt funktioniert. • Die verbleibende Constraint wird im Englischen auch als minimum down-time constraint bezeichnet und wirkt eventuell beim ersten Lesen etwas einschüchternd. Versuchen Sie diese zunächst lediglich nachzuvollziehen. Mit der Zeit und entsprechender Erfahrung werden Sie mathematische Ausdrücke dieser Art auch selbst formulieren können: of f

L min · δt



t+L min 

(1 − ys ), t ∈ {1, . . . , Tmax − L min + 1}

s=t

Bei komplizierteren Ungleichungen hilft es immer, diese zunächst „von einer Richtung her kommend“ zu lesen. Was ist damit gemeint? Wir lesen die Ungleichung zunächst „von links“, d. h., wir überlegen uns, welche Werte auf der linken Seite der Ungleichung angenommen werden können und of f was deren Implikationen für die recht Seite sind. Falls δt = 0 ist, interessiert das die rechte Seite wenig, da die Summe von (1 − ys )-Termen ohnehin immer of f nichtnegativ ist. Der spannende Fall ist also δt = 1. In diesem Fall erzwingt die linke Seite eine Untergrenze für die Summe der Terme auf der rechten Seite. Im

5.5 Beispiele und Anwendungen

133 of f

Fall von „Termi“ ist L min = 8, und für δt = 1 muss die Summe der Terme (1 − ys ) für die Zeitpunkte s = t bis t + 8 mindestens 8 sein. Das wiederum erzwingt ys = 0 für die nächsten 8 Zeiteinheiten ab dem Zeitpunkt t. Oh! Wunderbar! Genau das wollten wir ja auch modellieren, da die Mindestpause von L min nach dem Ausschalten des Kraftwerks einzuhalten ist. Nun verbleibt noch die Überprüfung, ob die Nebenbedingung auch „von rechts lesend“ funktioniert. Falls alle Summanden den Wert eins annehmen, also ys = 0 of f gilt für alle s ∈ {t, . . . , t + L min }, so gilt L min · δt ≤ L min , was keine echte Einschränkung der rechten Seite darstellt, da diese ohnehin immer erfüllt ist. Sobald jedoch eine der Betriebsvariablen ys für s ∈ {t, . . . , t + L min } den Wert of f Eins annimmt, erhalten Sie eine Obergrenze für L min · δt , die strikt kleiner of f als L min ist, und verhindern damit δt = 1. Dies ist auch wieder korrekt, da ja auch das Kraftwerk nicht ausgeschaltet werden kann, wenn in einer der folgenden Stunden innerhalb der Zwangspause das Kraftwerk plötzlich wieder in Betrieb ist. • Um seltsame Randeffekte am Ende des Planungshorizonts auszuschließen, müssen wir die Erfüllung der letzten Restriktion noch leicht modifiziert für t ∈ {Tmax − L min +2, Tmax } fordern. Um diese recht technische Bedingung zu formulieren, nummerieren wir zunächst die Menge {Tmax − L min + 2, Tmax } mithilfe der Funktion s(t) = t − Tmax + L min − 1 durch und fügen dem Modell die Constraints of f

L min · δt

− s(t) ≤

T max

(1 − ys ), t ∈ {Tmax − L min + 2, Tmax }

s=t

hinzu. Diese Nebenbedingung lässt sich auch als verallgemeinerte Version formulieren, die den vorherigen Fall umfasst. Wir möchten darauf jedoch verzichten, da wir denken, dass durch die separate Unterscheidung der Fälle die Modellierung für den Leser leichter nachvollzogen werden kann. Hier ist der Vollständigkeit halber wieder das vollständige Modell zu besichtigen, wobei wir zugunsten der Allgemeingültigkeit die Restriktion y1 = 1 vernachlässigen, da sie speziell in diesem Beispiel für „Thermi“ gilt.

134

5

min

T max

Gemischt-ganzzahlige lineare Optimierungsmodelle

pt · c + δton · S

t=1

s.t. pt ≥ dt , pt − pt−1 ≤ max , pt−1 − pt ≤ max , pt ≤ Pmax · yt , pt ≥ Pmin · yt , of f

δton + δt

t∈T t ∈ {2, . . . , Tmax } t ∈ {2, . . . , Tmax } t∈T t∈T

≤ 1,

t∈T

of f yt = yt−1 + δton − δt , t+L min  of f L min · δt ≤ (1 − ys ), s=t of f

L min · δt

− s(t) ≤

T max

(1 − ys ),

t ∈ {2, . . . , Tmax } t ∈ {1, . . . , Tmax − L min + 1} t ∈ {Tmax − L min + 2, Tmax }

s=t

pt ≥ 0, of f

δton , δt ∈ {0, 1}, yt ∈ {0, 1},

t∈T t∈T t∈T

Die Lösung Bevor wir uns der Implementierung des allgemeingültigen Optimierungsmodells zuwenden, stellen wir natürlich fest, dass das oben vorgestellte Beispiel etwas einfacher als der Allgemeinfall ist. Insbesondere wird „Thermi“ nie ausgeschaltet, da zu jedem Zeitpunkt eine positive Nachfrage zu decken ist. Dieser einfache Fall des Unit Commitment Problems, bei dem keine Entscheidung über das An- oder Ausschalten eines Kraftwerks zu treffen ist und es zu jedem Zeitpunkt lediglich um die zu produzierende Strommenge geht, wird in der Literatur auch als economic dispatch bezeichnet. Hier ist die Python-Implementierung des vollständigen Modells.

5.5 Beispiele und Anwendungen

135

136

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Beachten Sie, dass Python im Gegensatz zu unserer Modellformulierung immer bei null zu zählen beginnt und das sogenannte slicing, was zum Beispiel beim Zerlegen der Menge hours in hours[l : u ] auftritt, die rechte Grenze außen vor lässt. Mehr dazu in einer verlässlichen Python-Quelle Ihrer Wahl. Validierung der Ergebnisse Je komplexer das Modell, desto leichter schleichen sich bei der Modellierung Fehler ein. Da Sie darüber hinaus nie vor fehlerhaften Daten gefeit sind, ist es immer ratsam, die Ergebnisse geeignet zu validieren. Was erwarten Sie von den Ergebnissen der Optimierung in diesem konkreten Beispiel?

5.5 Beispiele und Anwendungen

137

Abb. 5.11 „Thermis“ produzierte Leistung und die Nachfrage bei einer maximalen Änderungsrate von 120 MW/h

Zunächst erwarten Sie, dass „Thermi“ immer in Betrieb ist, da zu jedem Zeitpunkt eine positive Nachfrage nach Strom zu bedienen ist. Dies bedeutet, dass für alle Zeitpunkte t gelten sollte yt = 1. Dies können Sie programmatisch mit dem Code

testen, der Ihre Erwartung bestätigt. Darüber hinaus visualisieren Sie die erzeugte Strommenge und vergleichen Sie mit der Nachfrage. Da „Thermi“ ausreichend flexibel ist, um alle Spitzen der Nachfragekurve nachzufahren, stimmen beide Kurven überein, was in Abb. 5.11 zu sehen ist. Sobald wir die maximale Rampe von „Thermi“ einschränken, in diesem Fall auf 50 MW/h statt 120 MW/h, überschreitet die produzierte Leistung die Nachfrage zu manchen Zeitpunkten (s. Abb. 5.12) Weiterführende Themen Wir haben in den vergangenen Abschnitten gelernt, wie sich einzelne Pumpspeicherkraftwerke und thermische Kraftwerke optimieren lassen. Dieses Wissen lässt sich in verschiedene Richtungen erweitern. Sie können versuchen, beliebige Parks hydrothermischer Kraftwerke zu modellieren, um sie kurz- oder langfristig optimal gegen

138

5

Gemischt-ganzzahlige lineare Optimierungsmodelle

Abb. 5.12 „Thermis“ produzierte Leistung und die Nachfrage bei einer maximalen Änderungsrate von 50 MW/h

Preise oder in Lastdeckungsszenarien einzusetzen. Ferner möchten Sie vielleicht Regelenergie, Nichtlinearitäten oder die Sicht des Netzbetreibers mit einbeziehen. Für diese und weitere Themen sei erneut auf [27] verwiesen.

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

6.1

Motivation

Gemischt-ganzzahlige Optimierungsmodelle mit quadratischen Ausdrücken an beliebigen Stellen des Optimierungsmodells können erst seit 2019 von kommerziell verfügbaren MIP-Solvern gelöst werden. Dabei bedeutet „an beliebigen Stellen“, dass konvexe und nichtkonvexe quadratische Ausdrücke in der Zielfunktion, in Ungleichungen und in Gleichungen auftreten dürfen, was insbesondere durch Substitution die Optimierung beliebiger polynomieller Ausdrücke ermöglicht. Wollen Sie beispielsweise das Polynom f (x, y) = x 2 y 2 der Ordnung vier in Ihren Solver stecken, so reformulieren Sie es mithilfe quadratischer Gleichungen als das quadratische Modell f (x, y, v, w) = v · w, v = x 2 , w = y 2 . Diese enorm umfassende Modellklasse enthält natürlich einige sehr anspruchsvolle Probleme, die für große Instanzen nicht in akzeptabler Zeit gelöst werden können. Dennoch ist die Tür aufgestoßen, und die Zukunft wird zeigen, wo hier die Grenzen der Berechenbarkeit liegen. Es sei an dieser Stelle daran erinnert, dass in den 80ern selbst im linearen Fall die Vorstellung als utopisch galt, MILP-Solver zu programmieren, die als Black-Box-Solver, also ohne Informationen über die spezielle

Ergänzende Information Die elektronische Version dieses Kapitels enthält Zusatzmaterial, auf das über folgenden Link zugegriffen werden kann https://doi.org/10.1007/978-3-662-67381-2_6.

© Der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 N. Sudermann-Merx, Einführung in Optimierungsmodelle, https://doi.org/10.1007/978-3-662-67381-2_6

139

140

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

Struktur der Anwendung, hochdimensionale Probleme schnell global lösen können (s. [4]). Ein Traum, der glücklicherweise wahr wurde. 

6.2

Trick 9 Sie können Optimierungsmodelle mit beliebigen polynomiellen Termen, wie etwa x 4 , durch Substitution als quadratische Optimierungsmodelle darstellen, falls Ihr Solver quadratische Gleichungen erlaubt. In diesem Beispiel ist x 4 äquivalent zu y · z mit y = x 2 und z = x 2 .

Modellklasse

Ein gemischt-ganzzahliges quadratisches Optimierungsmodell, in dem quadratische Ausdrücke an beliebigen Stellen stehen dürfen, wird im Englischen mixed-integer quadratically constrained program benannt und mit MIQCP abgekürzt, um zu betonen, dass die quadratischen Terme auch Teil der Restriktionen sein dürfen. In Summenschreibweise lässt sich jedes MIQCP darstellen als MIQCP :

min

x∈Rn

n  n 

qkl xk xl +

k=1 l=1

n 

ck x k

k=1

s.t. L i ≤ xi ≤ Ui , n  n  k=1 l=1 n  n  k=1 l=1

rikl xk xl + s jkl xk xl +

i ∈ {1, . . . , n} n  k=1 n 

aik xk ≤ bi ,

i∈I

d jk xk = e j ,

j∈J

k=1

xi ∈ Z,

i ∈ I,

wobei I wie auch schon bei MILPs in Kap. 5 die Indexmenge der ganzzahligen Variablen ist. Ebenfalls bekannt sind die Indexmengen J und I der Gleichungs- und Ungleichungsrestriktionen, wohingegen die Koeffizienten qkl , rikl und s jkl der quadratischen Terme neu hinzugekommen sind. Herzlich Willkommen! Wie gewohnt ist die Matrix-Vektor-Schreibweise eines MIQCP durch die Abwesenheit der Summenzeichen und der zugehörigen Indizes wieder leichter zu konsumieren: MIQCP :

min x T Qx + c T x s.t. L ≤ x ≤ U

x∈Rn

x T Ri x + aiT x ≤ bi T

x Sj x

+ d Tj x

= ej

i∈I j∈J

xi ∈ Z, i ∈ I Der Vollständigkeit halber seien hier erneut alle auftretenden Vektoren und Matrizen exakt definiert, da sie sich teilweise doch recht deutlich von ihren linearen Pendants in den Kapiteln 4 und 5 unterscheiden. Insbesondere werden die Restriktionen

6.3 Mathematischer Hintergrund

141

weiterhin zeilenweise definiert und die Vektorisierung findet innerhalb der Restriktionen statt. Bei den Vektoren ⎛ ⎞ ⎛ ⎞ ⎛ ⎞ ⎛ ⎞ ⎛ ⎞ c1 L1 U1 ai1 d j1 ⎜ .. ⎟ ⎜ .. ⎟ ⎜ .. ⎟ ⎜ .. ⎟ ⎜ .. ⎟ c = ⎝ . ⎠ , L = ⎝ . ⎠ , U = ⎝ . ⎠ , ai = ⎝ . ⎠ und d j = ⎝ . ⎠ cn

Ln

Un

ain

d jn

ist zu beachten, dass sie teilweise einen Index tragen, was wir bisher nur von Skalaren (also Zahlen) kannten. Die Matrizen ⎛ ⎞ ⎞ ⎞ ⎛ ⎛ a11 . . . a1n r11 . . . r1n s11 . . . s1n ⎜ ⎟ ⎟ ⎟ ⎜ . ⎜ . Q = ⎝ ... ⎠ , Ri = ⎝ .. ⎠ und S j = ⎝ .. ⎠ an1 . . . ann

rn1 . . . rnn

sn1 . . . snn

sind alle quadratisch und modellieren das nichtlineare Zusammenspiel der Entscheidungsvariablen x1 . . . , xn . Bemerkung 6.2.1 Die quadratischen Restriktionen sowie die Zielfunktion enthalten dabei als Spezialfall immer auch lineare Ausdrücke. Das ist auch formal von obiger Definition abgedeckt, da jede der Matrizen als Nullmatrix gewählt werden kann. Beispiel 6.2.1 Das Optimierungsproblem P:

min x1 s.t.

x∈R2

(x1 − 2)2 + (x2 − 1.5)2 ≤ 1, x1 ∈ Z 2.52

ist ein MIQCP mit der kontinuierlichen Entscheidungsvariablen x2 und der ganzzahligen Variablen x1 sowie einer quadratischen Ungleichungsrestriktion. Versuchen Sie Vektoren c und d, Matrizen Q und R sowie eine rechte Seite b anzugeben, um das Problem in die Form des obigen allgemeinen MIQCPs zu pressen.

6.3

Mathematischer Hintergrund

6.3.1

Kontinuierliche Relaxierungen und Struktur der zulässigen Menge

Analog zu einem MILP aus Kap. 5 besteht die zulässige Menge M eines MIQCPs aus geschnitten den ganzzahligen Fasern, die aus ihrer kontinuierlichen Relaxierung M werden, d. h., es gilt M = {x ∈ Rn | L ≤ x ≤ U, xT Ri x + aTi x ≤ bi , i ∈ I, xT Sj x + dTj x = ej , j ∈ J}  Kontinuierliche Relaxierung M

∩ {x ∈ Rn | xi ∈ Z, i ∈ I} Ganzzahligkeitsbedingung

142

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

und Sie erreichen das Problem  : MIQCP

max x T Qx + c T x s.t. L ≤ x ≤ U ,

x∈Rn

x T Ri x + aiT x ≤ bi , i ∈ I x T S j x + d Tj x = e j ,

j ∈ J,

 lässt wenn Sie die Ganzzahligkeitsbedingungen ignorieren. Das Problem MIQCP sich vor allem für konvexe Probleme mithilfe von Inneren-Punkte-Methoden effizient lösen, worauf Lösungsverfahren für MIQCPs aufbauen. sowie die zulässige In Abb. 6.1 sehen Sie die kontinuierliche Relaxierung M Menge M aus Beispiel 6.2.1. Das relaxierte Problem besitzt den eindeutigen Optimalpunkt (4.5, 1.5), wohingegen eine ganze Faser der Menge M die Optimalpunkte des gemischt-ganzzahligen Problems enthält.

6.3.2

Durch nichtkonvexe Funktionen beschriebene Mengen können trotzdem konvex sein

Motivation Ihr Optimierungsmodell wird deutlich schneller gelöst, wenn die zulässige Menge oder zumindest ihre kontinuierliche Relaxierung konvex ist, weshalb es für Sie wichtig ist zu wissen, ob Ihre Nebenbedingungen eine konvexe Menge beschreiben oder eben nicht. Wie aber können Sie erkennen, ob die zulässige Menge Ihres Optimierungsmodells konvex ist? Bisher haben Sie in Kap. 2 vor allem konvexe Funktionen studiert und nur die Definition einer konvexen Mengen kennengelernt. Nun ist die zulässige Menge eines Optimierungsproblems wiederum stets funktional beschrieben, d. h., es gibt Funktionen, die Ungleichungen und Gleichungen definieren, die Sie wiederum per Code Ihrem Solver mitteilen. Den Zusammenhang zwischen Funk-

der zulässigen Menge aus Beispiel 6.2.1 sowie Abb. 6.1 Links: kontinuierliche Relaxierung M zugehöriger Optimalpunkt, rechts: zulässige Menge M sowie alle Optimalpunkte des Problems

6.3 Mathematischer Hintergrund

143

tionen, den durch sie beschriebenen Mengen und Konvexität möchten wir hier ohne Anspruch auf Vollständigkeit untersuchen, wobei für ein intensives Studium wieder auf [23] verwiesen wird. Die zulässige Menge ist konvex, wenn jede ihrer Komponenten konvex ist. Die Umkehrung gilt nicht immer. Da laut Satz 2.5.1 die Schnittmenge konvexer Mengen immer noch konvex ist, sind Sie auf der sicheren Seite, falls jede einzelne Restriktion für sich betrachtet eine konvexe Menge beschreibt, da deren Schnitt die komplette zulässige Menge definiert. Achtung! Die Umkehrung dieser Aussage gilt nicht immer. Falls einzelne Restriktionen nichtkonvexe Mengen beschreiben, kann dies manchmal durch den Schnitt mit konvexen Mengen „repariert“ werden. Versuchen Sie beispielsweise die nichtkonvexe Menge {x ∈ R| sin(x) ≤ 0} so mit anderen Mengen zu schneiden, dass deren Schnitt wieder konvex ist. Diesen Gedanken möchten wir hier jedoch nicht weiter verfolgen und konzentrieren und stattdessen darauf herauszufinden, ob die Restriktionen von Interesse konvexe Mengen beschreiben. Gleichungen Zulässige Mengen werden durch Ungleichungen und Gleichungen definiert. Für Gleichungen ist die Welt zum Glück recht übersichtlich. Durch lineare Funktionen definierte Gleichungen beschreiben (affine) Unterräume des Rn und damit konvexe Mengen. Denken Sie einfach an Geraden oder Ebenen. Die Nullstellenmenge einer nichtlinearen Funktion ist hingegen, von sehr konstruierten Fällen abgesehen, eine nichtkonvexe Menge. Satz 6.3.1 Die Menge {x ∈ Rn | h(x) = 0} ist konvex, falls h : Rn → R eine (affin) lineare Funktion ist. Beispiel 6.3.1 Beachten Sie, dass auch durch konvexe nichtlineare Funktionen definierte Gleichungen in der Regel keine konvexen Mengen darstellen. Ein Beispiel ist die Menge {x ∈ R| x 2 − 1 = 0} = {−1, 1}, die nichtkonvex ist, obwohl h(x) = x 2 − 1 eine konvexe Funktion ist. 

Trick 10 Achten Sie darauf, dass die Gleichungen Ihres Modells durch lineare Funktionen beschrieben werden, wenn Sie möchten, dass Ihr Modell, oder zumindest die zugehörige kontinuierliche Relaxierung, konvex ist.

Ungleichungen Wir starten direkt mit dem einfachen Fall. Für jede konvexe Funktion g : Rn → R ist die Menge {x ∈ Rn | g(x) ≤ 0} konvex, was bedeutet, dass jede Ungleichung, die durch eine konvexe Funktion g definiert wird, automatisch auch eine konvexe

144

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

Menge beschreibt. Im folgenden Satz wird das nochmal formuliert und auch schnell bewiesen. Satz 6.3.2 Sei g : Rn → R eine konvexe Funktion. Dann ist auch die Menge M = {x ∈ Rn | g(x) ≤ 0} konvex. Beweis Seien x, y ∈ M = {x ∈ Rn | g(x) ≤ 0} und λ ∈ [0, 1]. Dann gilt g(λx + (1 − λ)y) ≤ λg(x) + (1 − λ)g(y), da g konvex ist und deshalb laut Definition 2.5.2 die obige Ungleichung gilt. Da nun außerdem wegen x, y ∈ M auch g(x) ≤ 0 und g(y) ≤ 0 gilt, erhalten wir λ g(x) + (1 − λ) g(y) ≤ 0



≥0

≤0

≥0

≤0

und somit die gewünschte Aussage g(λx + (1 − λ)y) ≤ 0, was beweist, dass die Menge M konvex ist.  Bemerkung 6.3.1 Obiger Satz gilt natürlich auch für beliebige rechte Seiten, d. h. Ungleichungen der Form g(x) ≤ b, da konstante Faktoren die Konvexität von g nicht zerstören und einfach per g(x) − b ≤ 0 wieder auf den allgemeinen Fall zurückgeführt werden können. Hier sind zunächst zwei harmlose Beispiele, die Sie vermutlich nicht überraschen. Beispiel 6.3.2 Die konvexe Funktion g : R → R, g(x) = x 2 − 1 beschreibt die Menge M = {x ∈ R| g(x) ≤ 0} = {x ∈ R| x 2 ≤ 1} = [−1, 1], die als Intervall offensichtlich auch konvex ist. Beispiel 6.3.3 Die nichtkonvexe Funktion g : R → R, g(x) = sin(x) beschreibt die Menge M = {x ∈ R| g(x) ≤ 0} = {x ∈ R| sin(x) ≤ 0},

6.4 Praktische Hinweise

145

die als Vereinigung der disjunkten Intervalle [π(1 + 2k), 2π(1 + k)] für k ∈ Z offensichtlich nicht konvex ist. Das folgende Beispiel zeigt allerdings, dass nichtkonvexe Funktionen ebenfalls konvexe Mengen definieren können! Ein Umstand, den wir in Abschn. 6.4.1 auch zu unserem Vorteil nutzen werden. Beispiel 6.3.4 Die nichtkonvexe Funktion g : R → R, g(x) = x 3 beschreibt die Menge M = {x ∈ R| g(x) ≤ 0} = {x ∈ R| x 3 ≤ 0} = {x ∈ R| x ≤ 0}, die trotz der Nichtkonvexität von g konvex ist, da beliebige Konvexkombinationen λx + (1 − λ)y nichtnegativer Zahlen x, y wieder nichtnegativ sind. 

Trick 11 Die Ungleichung g(x) ≤ 0 beschreibt immer eine konvexe Menge, falls g eine konvexe Funktion ist. Allerdings kann {x| g(x) ≤ 0} auch konvex sein, falls g nichtkonvex ist!

6.3.3

Lösungsalgorithmen

MIQCPs werden ähnlich wie MILPs durch Branch-and-Bound- bzw. Branch-andCut-Verfahren gelöst. Dabei sind MIQCPs natürlich leichter zu lösen, falls Q und R positiv-semidefinit sind, da die kontinuierliche Relaxierung eines MICQPs dann ein konvexes Optimierungsproblem ist, das verhältnismäßig leicht gelöst werden kann. Für weitere Details und Einführungen in die Welt der Branch-and-Bound-Verfahren verweisen wir auf [10,11,25].

6.4

Praktische Hinweise

6.4.1

Modellierungstricks

Formulierung polynomieller Ausdrücke Wie bereits in der Motivation erwähnt, können nun zusätzlich zu allen bereits bekannten Umformulierungstechniken aus den Abschn. 3.5.1 zu UQPs, 4.4.1 zu LPs und 5.4.1 zu MILPs nun auch noch beliebige polynomielle Optimierungsprobleme als MIQCP modelliert werden.

146

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

Second-Order-Cone-Formulierungen In diesem Abschnitt soll es um quadratische Nebenbedingungen gehen, mit denen der Solver sehr gut zurechtkommt, obwohl sie auf den ersten Blick nichtkonvex aussehen. Das liegt daran, dass die zugrundeliegenden Mengen konvex sind, obwohl die beschreibenden Funktionen nichtkonvex sind. Dass das grundsätzlich möglich ist, haben Sie bereits in Beispiel 6.3.4 gesehen. Die Rede ist von sogenannten Second-Order-Cones (SOCs). Ein Second-OrderCone (SOC) ist ein Ungleichungssystem der Form x T x ≤ y2,

y ≥ 0,

das sich in Summenschreibweise auch als n 

xi2 ≤ y 2 ,

y≥0

i=1

darstellen lässt, wobei x ∈ Rn ein Vektor des Rn und y ≥ 0 eine eindimensionale Variable des R ist. Abb. 6.2 motiviert, warum ein SOC auch als ice cream cone“ bezeichnet wird. Ein sogenannter Rotated-Second-Order-Cone (RSOC) ist definiert gemäß x T x ≤ yz,

Abb. 6.2 Oberfläche eines SOC für x ∈ R2

y ≥ 0, z ≥ 0

6.5 Beispiele und Anwendungen

147

und enthält die neu eingeführte Variable z ≥ 0. Im Spezialfall y = z wird der RSOC wieder zu einem SOC. Was ein mathematischer Cone, zu deutsch Kegel, genau ist und warum sie wichtig für die Optimierung sind, können Sie in aller Ausführlichkeit in [6] nachlesen. Die Ungleichungssysteme SOC und RSOC teilen eine wichtige Eigenschaft. Obwohl die Funktionen f : Rn × R → R,

f (x, y) = x T x − y 2

und g : Rn × R × R → R, g(x, y, z) = x T x − yz jeweils nichtkonvex sind, beschreiben die Restriktionen SOC = {(x, y) ∈ Rn × R| f (x, y) ≤ 0, y ≥ 0} und RSOC = {(x, y, z) ∈ Rn × R × R| g(x, y, z) ≤ 0, y ≥ 0, z ≥ 0} jeweils konvexe Mengen! 

Trick 12 (Rotated) Second-Order-Cones sind konvexen Mengen, obwohl die beschreibenden Funktionen nichtkonvex sind!

6.4.2

Implementierung und Lösung in Python

Da Gurobi zum Zeitpunkt der Entstehung des Buches der einzige MIP-Solver ist, der beliebige quadratische Optimierungsmodelle akzeptiert, empfiehlt es sich hier auch zur Modellierung das Python-Paket gurobipy zu verwenden.

6.5

Beispiele und Anwendungen

6.5.1

Verschnittminimierung

Problembeschreibung Um Ihren (vegetarischen) Gulaschvorrat passend lagern zu können, haben Sie einen Quadratmeter Blech in quadratischer Form käuflich erworben und möchten damit eine Konservendose maximalen Volumens herstellen. Die Dose hat ganz klassisch die Form eines Kreiszylinders, d. h., Sie möchten entsprechend zwei Kreise und ein

148

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

Abb. 6.3 Ein zulässiger Ausschnitt der Komponenten der Konservendose

Rechteck passender Größe aus dem Blech schneiden. Da Sie relativ unerfahren im Umgang mit dem Blechschneider sind, möchten Sie das Rechteck nur parallel zum Rand des Blechs ausschneiden und entscheiden, dass der rechteckige Teil links unten zu beginnen hat. Eine mögliche Konfiguration sehen Sie in Abb. 6.3. Die abgebildeten Kreisteile der Konservendose haben einen Radius von r = 18 . Damit Kopf- und Endstücke mit dem Rumpf verbunden werden können, muss eine Seite des rechteckigen Teils 2πr = 41 π lang sein. Die verbleibende Rechteckseite ist 1 0.75 m lang. Damit ergibt sich ein Volumen von πr 2 ·h = π · 64 ·0.75 ≈ 0.0368 m3 = 36.8 l. Geht das noch besser? Das Modell Sie denken über Ihre Entscheidungsvariablen nach. Dies sind die Mittelpunkte (x1 , y1 ) und (x2 , y2 ) der Kreise K 1 bzw. K 2 sowie ihr gemeinsamer Radius r . Da der linke untere Eckpunkt des Rechtecks festgelegt ist, wollen Sie lediglich die Höhe a sowie die Breite b optimal wählen. Die Binärvariable z i ∈ {0, 1} gibt die relative Position des Kreises K i zum Rechteck an. Dabei soll z i = 1 dafür stehen, dass K i sich oberhalb des Rechtecks aufhält und z i = 0 bedeutet, dass K i einen Aufenthaltsort auf der rechten Seite gewählt hat. Nun zu den Restriktionen. Da hier einiges zusammenkommt, arbeiten Sie am besten strukturiert mit einer Liste. • Zunächst gilt offensichtlich a, b, xi , yi ∈ [0, 1] für i ∈ {0, 1} und r ∈ [0, 0.5], da das quadratische Blech eine Seitenlänge von 1 m besitzt. • Die Kreise dürfen nicht über den Rand ragen, weshalb r ≤ yi ≤ 1 − r und r ≤ xi ≤ 1 − r gilt, was verhindert, dass die Kreismittelpunkte zu nah am Blechrand platziert werden.

6.5 Beispiele und Anwendungen

149

• Da die Kreise sich nicht überlappen sollen, sollte die Entfernung der Kreismittelpunkte mindestens r betragen. Sie fordern also  (x1 − x2 )2 + (y1 − y2 )2 ≥ r , was Sie quadrieren dürfen, und erhalten die nichtkonvexe quadratische Formulierung (x1 − x2 )2 + (y1 − y2 )2 ≥ r 2 . • Jeder Kreis sollte sich entweder oberhalb oder rechts neben dem Rechteck befinden. Dies modellieren Sie für die Höhe über a + r ≤ yi + (1 − z i ) · 1.5, i ∈ {0, 1} und analog für die Seitenlage mit b + r ≤ xi + z i · 1.5, i ∈ {0, 1}. Gut. • Sie vermuten aus Symmetriegründen, dass es egal ist, ob Sie das Rechteck entlang der horizontalen oder vertikalen Achse krümmen, um es mit den Kreisteilen zu verbinden, und fordern deshalb per b = 2πr , dass die Breite b mit dem Kreisumfang übereinstimmen muss. Jetzt fehlt nur noch die zu maximierende Zielfunktion πr 2 a. Da diese ein Polynom von Grad drei ist, substituieren Sie r 2 mit einer Hilfsvariable s = r 2 , um ein MIQCP zu erhalten, das von Ihrem Solver akzeptiert wird. Die Lösung Bei der Implementierung des obigen Models in gurobipy ist zu beachten, dass der Parameter NonConvex auf den Wert 2 zu setzen ist, um den Umgang mit nichtkonvexen quadratischen Ausdrücken zu ermöglichen. Hier ist der Code.

150

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

Abb. 6.4 Optimaler Ausschnitt der Komponenten der Konservendose

import numpy as np from gurobipy import GRB , Model circles = range ( 2 ) m = Model ( " Gulasch " ) m . Params . NonConvex = 2 a b x y r z s

= = = = = = =

m . addVar ( ub = 1 ) m . addVar ( ub = 1 ) m . addVars ( circles , ub = 1 ) m . addVars ( circles , ub = 1 ) m . addVar ( ub = 0 . 5 ) m . addVars ( circles , vtype = GRB . BINARY ) m . addVar ()

m . addConstrs ( r < = y [ i ] for i in circles ) m . addConstrs ( y [ i ] < = 1 - r for i in circles ) m . addConstrs ( r < = x [ i ] for i in circles ) m . addConstrs ( x [ i ] < = 1 - r for i in circles ) m . addConstr (( x [ 0 ] - x [ 1 ] ) ** 2 + ( y [ 0 ] - y [ 1 ] ) ** 2 > = r ** 2 ) m . addConstrs ( a + r < = y [ i ] + ( 1 - z [ i ] ) * 1 . 5 for i in circles ) m . addConstrs ( b + r < = x [ i ] + z [ i ] * 1 . 5 for i in circles ) m . addConstr ( b = = 2 * np . pi * r ) m . addConstr ( s = = r ** 2 ) m . setObjective ( np . pi * s * a , sense = GRB . MAXIMIZE ) m . optimize ()

Die Komponenten der optimalen Gulaschdose sehen Sie in Abb. 6.4. Ihr Radius ist r = 0.16, die Breite b = 1 entspricht genau 2πr und die Höhe ist a = 0.68, woraus sich ein Gesamtvolumen von v = πr 2 a = 0.0542 m3 = 54.2 l ergibt. Das ist viel Gulasch.

6.5.2

Das Lasso-Problem

Wir haben uns in diesem Buch in den Abschn. 3.6.5, 3.6.6, 3.6.7, 4.5.2 und 5.5.3 schon mit vielen Varianten der linearen Regression beschäftigt. Den Abschluss bildet das

6.5 Beispiele und Anwendungen

151

sogenannte Lasso-Problem, das maßgeblich von der Statistiklegende Robert Tibshirani entwickelt wurde. Ähnlich wie beim Ridge-Regression-Ansatz (s. Abschn. 3.6.7) und beim Sparse-Least-Absolute-Deviations-Ansatz aus Abschn. 5.5.3 geht es darum, simultan optimale Gewichte für das Machine-Learning-Modell zu bestimmen und gleichzeitig unwichtige Features auszusortieren. Problembeschreibung Auch diese Regressionsvariante wird mit unserem Rotweinproblem aus Abschn. 3.6.6 konfrontiert. Zur Erinnerung: Es gab elf potentielle Einflussfaktoren auf die Weinqualität, deren Ausprägungen in einem größeren Datensatz gesammelt wurden. Wir suchen wie in Abschn. 5.5.3 erneut die fünf wichtigsten Einflussfaktoren. Das Modell Die Idee des Lasso-Problems besteht darin, die loss function ⎛ ⎞2 p p n   1 ⎝ β j xi j − yi ⎠ + λ |β j | β0 + L(β) = n i=1

j=1

j=1

zu minimieren. Woraus besteht L(β)? Ähnlich wie beim Ridge-Regression-Ansatz n minimieren Sie die Summe des quadratischen Vorhersagefehlers n1 i=1 (β0 + p p 2 j=1 β j x i j − yi ) und eines gewichteten Strafterms λ j=1 |β j |, der hohe Beträge der Gewichte β1 , . . . , β p bestraft. Im Gegensatz zur Ridge-Regression wird hier allerdings die 1 -Norm des Vektors aller Gewichte minimiert und nicht deren aufsummierte Quadrate. Das Gewicht λ ist erneut ein exogen vorgegebener Hyperparameter λ, der geeignet gewählt werden sollte. Wir versuchen es mit λ = 0.1 und ermutigen Interessierte mit verschiedenen Werten zu experimentieren. Da das Problem aufgrund der Betragszeichen zunächst nicht die Form eines MIQCPs hat, führen wir gemäß unserer Umformulierungstricks basierend auf Satz 4.4.3 die kontinuierlichen Hilfsvariablen α1 , . . . , α p ein und formulieren das Problem ⎛ ⎞2 p p n   1 ⎝ P: min β j xi j − yi ⎠ + λ |β j | β0 + β n i=1

j=1

j=1

äquivalent um zu ⎛ ⎞2 p p n    1 ⎝β 0 + P  : min β j xi j − yi ⎠ + λ α j s.t. β n i=1

j=1

βj ≤ αj,

j = 1, . . . , p

j=1

−β j ≤ α j ,

j = 1, . . . , p,

152

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

womit Sie ein rein kontinuierliches konvexes restringiertes quadratisches Optimierungsproblem enthalten. Das waren viele Attribute, deren Nachweis wir Ihnen teilweise schuldig bleiben. Wir wollen Sie aber nicht davon abhalten, diese bei Bedarf selbst zu verifizieren. Die Lösung Die Python-Implementierung des Problems P  lautet wie folgt. import pandas as pd from gurobipy import GRB , Model # Read data data_raw = pd . read_csv ( " winequality - red . csv " , delimiter = " ; " ) # Preprocessing # Drop d u p l i c a t e s df = data_raw . drop_duplicates () . reset_index ( drop = True ) # Scale values data = ( df - df . mean () ) / df . std () # Data points X = data [ [ d for d in data . columns if d ! = " quality " ] ] N = len ( X ) features = list ( X . columns ) # Labels y = data [ " quality " ] # Tuning p aramet e r l = 0.1 # Model d e c l a r a t i o n m = Model ( " Linear Regression nD " ) # De c i s i o n v a r i a b l e s intercept = m . addVar ( lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS ) beta = m . addVars ( features , lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS ) alpha = m . addVars ( features , lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS ) # Ob j e c t i v e f u n c t i o n m . setObjective ( 1/N * sum ( ( intercept + sum ( beta [ j ] * X . loc [i , j ] for j in features ) - y [ i ] ) ** 2 + l * sum ( alpha [ i ] for i in features ) for i in range ( N ) ) # Add c o n s t r a i n t s m . addConstrs ( beta [ i ] < = alpha [ i ] for i in features ) m . addConstrs ( - beta [ i ] < = alpha [ i ] for i in features ) # Solve s t a t e m e n t m . optimize () for name in beta : print ( f " { name } : { beta [ name ]. X :. 3f } " )

6.5 Beispiele und Anwendungen

153

Die optimale Lösung des Lasso-Problems hier lautet f i x e d a c i d i t y : 0 . 001 v o l a t i l e a c i d i t y : - 0 . 237 c i t r i c a c i d : 0 . 000 r e s i d u a l s u g a r : - 0 . 000 c h l o r i d e s : - 0 . 035 f r e e s u l f u r d i o x i d e : - 0 . 000 t o t a l s u l f u r d i o x i d e : - 0 . 036 d e n s i t y : - 0 . 000 pH : - 0 . 010 s u l p h a t e s : 0 . 118 a l c o h o l : 0 . 359

und unterscheidet sich erneut, wenn auch teilweise nur leicht, von den Ergebnissen der bisherigen Ansätze. Bemerkung 6.5.1 Warum wurden in diesem Buch so viele verschiedene Regressionsmodelle betrachtet? Maschinelles Lernen und Optimierung sind auf viele Arten miteinander verwoben, und die Minimierung der loss function ist eine dieser Schnittmengen. Sie sind nun hoffentlich mit den zugrundeliegenden Ideen vertraut und könnten beispielsweise eigene, auf Ihre Bedürfnisse zugeschnittene, Regressionsmodelle entwickeln oder bei Bedarf auch weitere Machine-Learning-Modelle in Optimierungsmodelle einbetten, wie es beispielsweise im Rahmen der sogenannten Bayesian Optimization in [26] für baumbasierte Verfahren geschieht und auch in Open-SourceProjekten vorangetrieben wird.1

6.5.3

Standortplanung I: Positionierung einer futuristischen Pizzeria

Das folgende Problem der Standortplanung lässt sich in vielerlei Hinsicht modifizieren und erweitern, um auch zahlreiche ernsthafte Anwendungen, wie beispielsweise die Positionierung von Lager- und Produktionsstätten zu modellieren. Problembeschreibung Sie betreiben in der Zukunft einen Pizzalieferdienst, der leider außerhalb der Stadt liegt. Die fortgeschrittene Technologie und eine angepasste Rechtspraxis ermöglichen es Ihnen, die Pizzen mithilfe von Drohnen zu Ihren etwa hundert Kundinnen zu transportieren. Eines schönen Tages wird Ihnen ein innerstädtischer Bauplatz innerhalb eines kreisförmigen Areals angeboten, von dem aus Sie Ihre Kunden weit besser als bisher beliefern könnten. Natürlich möchten Sie den Standort innerhalb des möglichen Baugebiets optimal wählen und begutachten zunächst den Sachverhalt in Abb. 6.5.

1 So

etwa hier: https://github.com/Gurobi/gurobi-machinelearning.

154

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

Abb. 6.5 Innerhalb des orange markierten Baugebiets ist ein optimaler Standort zu wählen, von dem aus die einhundert eingetragenen Kundinnen zu beliefern sind.

Da jeder eingetragene Kunde einen ähnlichen täglichen Pizzaverbrauch hat, sind Ihnen alle Kunden gleich wichtig, und Sie machen sich auf die Suche nach einem Modell, das Sie bei der Entscheidung unterstützen kann. Das Modell Sie möchten den Lieferservice so platzieren, dass der mittlere Abstand zu allen N Kundinnen minimiert wird. Dadurch ergibt sich direkt die zu minimierende Zielfunktion P:

min

x∈R2

N 1  d(x − y i ) s.t. x ∈ M, N i=1

wobei x = (x1 , x2 ) die planaren Koordinaten der Pizzeria sind, die Standorte der Kunden in den Punkten y 1 , . . . , y N ∈ R2 gespeichert sind und in unserem Beispiel N = 100 gilt. Zur Erinnerung, d(x, y) =



(x1 − y1 )2 + (x2 − y2 )2

bezeichnet den euklidischen Abstand, also den geometrisch betrachtet direkten Weg zwischen den Punkten x und y in der Ebene. Da die Lieferdrohne den direkten Weg auch abfliegen kann, passt das Abstandsmaß hier gut zur Anwendung. Die zulässige Menge entspricht hier dem kreisförmigen Baugebiet, was sich darstellen lässt als M = {x ∈ R2 | (x1 − a)2 + (x2 − b)2 ≤ c2 }, was einer Kreisscheibe mit dem Mittelpunkt (a, b) und dem Radius c entspricht.

6.5 Beispiele und Anwendungen

155

Sie formulieren P als MIQCP, um Ihren MIP-Solver für die Lösung verwenden zu können, und führen dazu für jede Kundin eine kontinuierliche nichtnegative Hilfsvariable wi , wi ≥ 0, i = 1, . . . , N ein. Damit lässt sich P umformulieren zu P :

min

(x,w)∈R2 ×R N

N  1  wi s.t. wi ≥ (x1 − y1i )2 + (x2 − y2i )2 , i = 1, . . . , N N i=1

(x1 − a)2 + (x2 − b)2 ≤ c2 w ≥ 0.

Um die eigentliche Problemstruktur freizulegen, führen wir für jeden Kunden eine weitere Hilfsvariable v i ∈ R2 , i = 1, . . . , N , ein, um die Differenzen im Radikanten der Summe zu substituieren, und erlauben uns die erste Nebenbedingung zu quadrieren, da beide Seiten ausschließlich nichtnegative Einträge enthalten: P  :

min

(x,w,v)∈R2 ×R N ×R2N

N 1  wi s.t. wi2 ≥ (v i )T v i , i = 1, . . . , N N i=1

v1i = x1 − y1i , i = 1, . . . , N v2i = x2 − y2i , i = 1, . . . , N (x1 − a)2 + (x2 − b)2 ≤ c2 w ≥ 0. Was fällt Ihnen auf, wenn Sie die Constraints von P  genauer betrachten? Richtig, die Ungleichungen wi2 ≥ (v i )T v i bilden gemeinsam mit der Nichtnegativität von w ein SOC und damit eine konvexe Menge. Geschnitten mit den anderen Restriktionen, die lineare Gleichungen sowie eine konvexe Kreisscheibe darstellen, handelt es sich bei P  also insgesamt um ein konvexes quadratisches Optimierungsproblem. Bemerkung 6.5.2 Dieses Beispiel ist eine Variation eines Problems, dessen unrestringierte Variante in der Literatur unter den Namen „Fermat-Weber-Problem“ oder „Fermat-Torricelli-Problem“ bekannt ist. Anstatt das Problem MIQCP-tauglich umzuformulieren, können Sie natürlich auch direkt versuchen, die ursprüngliche Formulierung P mithilfe eines Verfahrens der nichtlinearen Optimierung anzugehen, wie es beispielsweise in [1] auch geschieht. Die Lösung Im vorliegenden Beispiel wurden die Koordinaten der N = 100 Kunden zufällig aus dem Intervall [0,100] gezogen. Der zulässige Baubereich ist ein Kreis um (a, b) = (30, 40) mit dem Radius r = 7.

156

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

from gurobipy import GRB , Model , quicksum import numpy as np # Generate input data np . random . seed ( 19680801 ) N = 100 X1 = 100 * np . random . rand ( N ) X2 = 100 * np . random . rand ( N ) X = [ tuple ( x ) for x in zip ( X1 , X2 ) ] num_points = range (1 , N + 1 ) axes = [0 , 1 ] # O p t i m i z a t i o n model m = Model ( ’ Fermat - Weber constrained ’) x = m . addVars ( axes , name = ’x ’) w = m . addVars ( num_points , name = ’w ’) v = m . addVars ( num_points , axes , name = ’v ’ , lb = - GRB . INFINITY ) # Respect feasible c on s t r u c t i o n region m . addConstr ((( x [ 0 ] - 30 ) * ( x [ 0 ] - 30 ) + ( x [ 1 ] - 40 ) * ( x [ 1 ] - 40 ) < = 49 ) ) # Definition v m . addConstrs (( v [i , j ] = = x [ j ] - X [ i - 1 ] [ j ] for i in num_points for j in axes )) # SOC : Distance to regional w arehouse m . addConstrs (( quicksum ( v [i , j ] * v [i , j ] for j in axes ) < = w [ i ] * w [ i ] for i in num_points )) # Ob j e c t i v e m . setObjective ( w . sum () , sense = GRB . MINIMIZE ) # Solve s t a t e m e n t m . optimize ()

Die optimale Positionierung Ihrer Pizzeria entnehmen Sie Abb. 6.6 und melden sich direkt mit Ihrem Wunschort bei der zuständigen Stadtbaumeisterin, deren Job auch in der Zukunft noch unabdinglich ist.

6.5.4

Standortplanung II: Bau eines Lagers für radioaktiven Abfall

Das zweite Standortplanungsproblem mag Ihnen nach dem vorherigen Beispiel vertraut vorkommen, jedoch ändert sich durch die Umkehrung der Zielgröße weit mehr als nur das Vorzeichen der Zielfunktion, wie Sie im folgenden sehen werden. Problembeschreibung Sie bekommen die Aufgabe, innerhalb eines quadratischen Bauabschnitts der Seitenlänge 100 km ein Lager für radioaktiven Abfall zu positionieren. Wie Sie sich vorstellen können, haben die Bewohner der in Abb. 6.7 eingezeichneten 20 Städte dieser Region wenig Interesse daran, ein solches Lager in ihrer Nähe zu haben. In einem Treffen mit den Bürgermeisterinnen der jeweiligen Städte wird beschlossen, das Lager so zu planen, dass der Abstand des Lagers zur nächstgelegenen Stadt so groß wie möglich ist.

6.5 Beispiele und Anwendungen

157

Abb. 6.6 Innerhalb des orange markierten Baugebiets ist grün der optimale Standort eingetragen.

Das Modell Die nichtlineare Formulierung des zu lösenden Optimierungsproblems lautet max min d(x − y i ) s.t. x ∈ M,

P:

x∈R2 i=1,...,N

wobei x ∈ R2 die Koordinaten des Lagers und N = 20 die Anzahl der Städte mit den Koordinaten y i ∈ R2 , i = 1, . . . , N sind. Der erlaubte Baubereich ist diesmal das umrandende Quadrat in Abb. 6.7 und enthält lediglich untere und obere Schranken an x, d. h., es gilt M = {x ∈ R2 | L ≤ x ≤ U }. Um P erneut als quadratisches MIP formulieren zu können, führen Sie zunächst im Sinne einer Epigraphformulierung eine kontinuierliche Entscheidungsvariable α ein und schreiben P :

max

(x,α)∈R2 ×R

α s.t. L ≤ x ≤ U , α ≤

min d(x − y i ),

i=1,...,N

d. h., α drückt nun von unten, da Sie ja maximieren, gegen den Term der Zielfunktion. Dies können Sie nun ausdrücken als P :

max

(x,α)∈R2 ×R

α s.t. L ≤ x ≤ U α ≤ d(x − y i ), i = 1, . . . , N ,

158

6

Gemischt-ganzzahlige quadratische Optimierungsmodelle

Abb. 6.7 Grün markiert sehen Sie die Städte, die einen möglichst großen Abstand von dem zu positionierenden Lager einhalten möchten.

wobei Sie die Umformulierungstricks aus dem Min-Max-Fall in Abschn. 4.4.1 eines Minimierungsproblems entsprechend auch auf den Max-Min-Fall eines Maximierungsproblems übertragen haben. Ein letzter Ruck und schon haben Sie P äquivalent in das MIQCP P  :

max

(x,α)∈R2 ×R

α s.t. L ≤ x ≤ U α 2 ≤ (x1 − y1i )2 + (x2 − y2i )2 , i = 1, . . . , N

umgeformt, das Sie nun im nächsten Abschnitt optimal lösen möchten. Das Problem ist zwar leider nicht konvex, aber dafür nur dreidimensional, wobei Sie es immerhin mit N nichtlinearen Constraints zu tun haben.

Die Lösung Die 20 zufällig platzierten Städte besitzen Koordinaten im Intervall [0, 100]. Des Weiteren wird analog zum Vorgehen im ersten Standortplanungsproblem eine Hilfsvariable für die Differenzen im Radikanten der Summe eingeführt, was jedoch nicht notwendig ist. Unerlässlich ist hingegen zum Zeitpunkt der Entstehung des Buches, die Kennzeichnung des Modells als nichtkonvex, was über m.Params. NonConvex=2 passiert. Sollten Sie dies vergessen, wird Sie Gurobi allerdings per Fehlermeldung daran erinnern.

6.5 Beispiele und Anwendungen

159

from gurobipy import GRB , Model , quicksum import numpy as np # G enerate input data np . random . seed ( 73 ) N = 20 X1 = 100 * np . random . rand ( N ) X2 = 100 * np . random . rand ( N ) X = [ tuple ( x ) for x in zip ( X1 , X2 ) ] num_points = range (1 , N + 1 ) axes = [0 , 1 ] # O p t i m i z a t i o n model m = Model ( ’ Nuclear waste ’) # Set n o n c o n v e x i t y pa r amet e r to 2 since the model is not convex m . Params . NonConvex = 2 x = m . addVars ( axes , name = ’x ’ , lb =0 , ub = 100 ) alpha = m . addVar ( name = ’ alpha ’ , lb = - GRB . INFINITY ) v = m . addVars ( num_points , axes , name = ’v ’ , lb = - GRB . INFINITY ) m . addConstrs (( v [i , j ] = = x [ j ] - X [ i - 1 ] [ j ] for i in num_points for j in axes ) , name = ’ Definition v ’) m . addConstrs (( quicksum ( v [i , j ] * v [i , j ] for j in axes ) > = alpha * alpha for i in num_points ) , name = ’ Distance to cities ’) m . setObjective ( alpha , sense = GRB . MAXIMIZE ) m . optimize ()

Die optimale Lösung entnehmen Sie Abb. 6.8.

Abb. 6.8 Grün markiert die umliegenden Städte und rot eingetragen der optimale Standort des Atommülllagers

7

Fortgeschrittene Modellierungstechniken

7.1

Linearisierung

Wenn Sie einer Funktion gegenüber sitzen, deren Nichtlinearität schlimmer als quadratisch ist, kann es eine gute Idee sein, diese durch eine stückweise lineare Funktion zu approximieren, um anschließend mit einem MILP-Solver Ihrer Wahl das linearisierte Problem zu lösen. In diesem Kapitel werden Sie lernen, wie das funktioniert.

7.1.1

Linearisierung konvexer Zielfunktionen und konvexer Ungleichungen

Grundidee und motivierendes Beispiel Eine konvexe Zielfunktion kann auf sehr angenehme Weise linearisiert werden. Dazu können Sie ausnutzen, dass eine konvexe Funktion oberhalb jeder ihrer Tangenten liegt und deshalb durch die sogenannte Einhüllende der Tangenten approximiert werden kann. Was das genau bedeutet, sehen Sie in einigen Zeilen. Hier ist zunächst ein konkretes Beispiel. Wenn Sie etwa das unrestringierte Optimierungsproblem P:

min x 2 + sin(x) x∈R

Ergänzende Information Die elektronische Version dieses Kapitels enthält Zusatzmaterial, auf das über folgenden Link zugegriffen werden kann https://doi.org/10.1007/978-3-662-67381-2_7.

© Der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 N. Sudermann-Merx, Einführung in Optimierungsmodelle, https://doi.org/10.1007/978-3-662-67381-2_7

161

162

7

Fortgeschrittene Modellierungstechniken

Abb. 7.1 Links: Graph der Funktion f (x) = x 2 +sin(x) mit vier Tangenten, rechts: Graph sowie, grün eingezeichnet, die Einhüllende der Tangenten

betrachten, so wundern Sie sich vermutlich zunächst, dass die Zielfunktion trotz des enthaltenen Sinus konvex ist. Dies ist aber wegen f  (x) = 2 − sin(x) ≥ 1 > 0    ∈[−1,1]

eindeutig der Fall, da die zweite Ableitung strikt positiv ist. In Abb. 7.1 sehen Sie den Graphen von f sowie die Einhüllende der drei Tangenten von f , die an den Stellen x¯ ∈ {−1, 0, 1} angelegt wurden. Die Funktionsvorschriften der Tangenten t f ,x¯ (x) an f an der Stelle x¯ sind gegeben durch t f ,x¯ (x) = f (x) ¯ + f  (x)(x ¯ − x). ¯ So erhalten Sie etwa die Tangente an f an der Stelle x¯ = 1 durch t f ,1 (x) = f (1) + f  (1)(x − 1) = 1 + sin(1) + (2 + cos(1))(x − 1) ≈ −0.7 + 2.5x. Die anderen Tangentengleichungen sind gegeben durch t f ,0 (x) = x und t f ,−1 (x) ≈ −1.3 − 1.45x. Die Einhüllende der Tangenten ist das punktweise Maximum der drei Geraden, sodass Sie das nichtlineare Optimierungsproblem P durch das Problem P :

min

max

¯ x∈R x∈{−1,0,1}

t f ,x¯ (x)

approximieren können. Eine Epigraphformulierung von P  liefert P  :

min

(x,α)∈R × R

α

s. t.

max

x∈{−1,0,1} ¯

t f ,x¯ (x) ≤ α,

7.1 Linearisierung

163

was sich zu dem LP P 

min

(x,α)∈R × R

α

s. t.

t f ,x¯ (x) ≤ α, x¯ ∈ {−1, 0, 1}

umformulieren lässt. In diesem konkreten Beispiel gilt also P  :

min

(x,α)∈R × R

α

s. t.

−0.7 + 2.5x ≤ α, x ≤ α, −1.3 − 1.45x ≤ α,

und ein LP-Solver oder Stift und Papier liefern Ihnen den Optimalpunkt x  = 0.53 sowie den Optimalwert v = 0.53 der stückweise linearen Approximation P L P von P. Da die Tangenten konvexer Funktionen stets unterhalb des Funktionsgraphen liegen, unterschätzt der Optimalwert von P L P den wahren Optimalwert von P. Der allgemeine Fall und etwas mathematischer Hintergrund Die Tangentialebene einer differenzierbaren Funktion f : Rn → R an der Stelle x¯ ∈ Rn ist gegeben durch ¯ + ∇ f (x) ¯ T (x − x). ¯ t f ,x¯ (x) = f (x) Satz 7.1.1 verkündet die Botschaft, dass jede konvexe Funktion ohne Knicke genau dadurch charakterisiert ist, dass ihr Graph über allen Tangentialebenen liegt. Satz 7.1.1 Eine stetig differenzierbare Funktion f : Rn → R ist genau dann konvex, wenn für jede beliebige Stützstelle x¯ ∈ Rn gilt f (x) ≥ t f ,x¯ (x) für alle x ∈ Rn . Wenn Sie also eine konvexe Funktion f : Rn → R in der Zielfunktion finden, so stecken Sie sie zunächst mithilfe einer Epigraphformulierung in die Nebenbedingungen und erhalten eine Ungleichung der Form f (x) ≤ α. Falls f ohnehin bereits in einer solchen Ungleichung unterwegs war, können Sie auch hier wie folgt weitermachen. Sie approximieren f durch die Einhüllende der Tangenten maxx∈ ¯ X¯ t f ,x¯ (x), die aus dem punktweisen Maximum von Tangenten besteht, die an f an vorher zu wählenden Stützstellen X¯ ⊂ Rn liegen. Letztlich können Sie die Ungleichung max t f ,x¯ (x) ≤ α x∈ ¯ X¯

zu t f ,x¯ (x) ≤ α, x¯ ∈ X¯ umformen und haben ein LP, das sie lösen können, um eine lineare Approximation zu berechnen, deren Optimalwert wegen Satz 7.1.1 den wahren Optimalwert stets unterschätzt.

164

7.1.2

7

Fortgeschrittene Modellierungstechniken

Linearisierung nichtkonvexer Funktionen

Separable Funktionen In diesem Buch wird nur die Linearisierung sogenannter separabler Funktionen behandelt. Eine separable Funktion f : Rn → R lässt sich als Summe von n eindimensionalen Funktionen f i (xi ) : R → R für i ∈ {1, . . . , n} darstellen, d. h., es gilt f (x) =

n 

f i (xi ).

i=1

Ein Beispiel für eine nichtlineare separable Funktion wäre f 1 : R3 → R, f 1 (x) = 2 2 x12 +sin(x2 )+e x3 . Die nichtlineare Funktion f 2 : R2 → R, f 2 (x) = x12 ·sin(x2 )·e x3 ist nicht separabel. Der Vorteil hochdimensionaler separabler Funktionen bei der Linearisierung ist, dass Sie einfach jeden Summanden einzeln linearisieren können und sich dabei stets nur um eindimensionale Funktionen kümmern müssen. Wollen 2 Sie etwa f 2 linearisieren, so bringt es Ihnen weniger, die Faktoren x12 , sin(x2 ) und e x3 separat zu linearisieren und anschließend wieder miteinander zu multiplizieren, da das Produkt weiterhin ein nichtlineares Polynom von Grad drei wäre. Ausgestattet mit dem Wissen aus Kap. 6 könnten Sie das Problem nach Substitution jedoch immerhin als MIQCP formulieren. Dies lassen wir hier jedoch außen vor. Grundidee und Beispiel Sie möchten das nichtlineare Optimierungsproblem P:

min x∈R



x + sin(x) + 10e−x

s. t.

x ≥ 2, x ≤ 20

lösen und haben nur einen MILP-Solver zur Verfügung. Was ist zu tun? Zunächst wählen Sie sogenannte Stützstellen x1 , . . . , x N , an denen Sie die Funk√ tion f (x) = x + sin(x) + 10e−x stückweise linear approximieren wollen. Mangels besseren Wissens wählen Sie als Stützstellen die geraden Zahlen x1 = 2, x2 = 4, . . . , x9 = 20. Jede Stützstelle xi mit dem zugehörigen Stützwert f (xi ) bildet einen Stützpunkt (xi , f (xi )). Die Verbindung der Stützpunkte bildet einen Polygonzug. Das ist genau die zu minimierende stückweise lineare Funktion, die Sie in Abb. 7.2 sehen. Wie lässt sich die stückweise lineare Approximation von f als Teil eines MILPs darstellen? Zunächst führen Sie für jedes Intervall von benachbarten Stützstellen [xi , xi+1 ] eine Binärvariable z i ∈ {0, 1} mit i ∈ {1, . . . , N − 1} ein, für die zi = 1

⇐⇒

x ∈ [xi , xi+1 ]

7.1 Linearisierung

165

Abb. 7.2 Die Funktion f (x) =



x + sin(x) + 10e−x und eine stückweise lineare Approximation

gelten soll. Da das liebe kleine x sich nicht aufteilen kann und dementsprechend immer nur in einem Intervall zur gleichen Zeit sein kann, fordern Sie N −1 

z i = 1.

i=1

Zusätzlich möchten Sie mit „Segmentvariablen“ si ≥ 0 arbeiten, die angeben, wo genau innerhalb des Intervalls [xi , xi+1 ] sich x aufhält. Durch 0 ≤ si ≤ z i , i ∈ {1, . . . , N − 1} und x =

N −1 

z i xi + si (xi+1 − xi )

i=1

steuern Sie die genaue Positionierung von x in Abhängigkeit von z i und si . So würde beispielsweise z 1 = 1 und si = 0.5 bedeuten, dass x = 1 · 2 + 0.5 · (4 − 2) = 3 gilt und sich x somit genau in der Mitte des Intervalls [2, 4] befindet. Die y-Werte der stückweise linearen Funktion lassen sich ebenso über y =

N −1 

z i yi + si (yi+1 − yi )

i=1

mithilfe von z i , der Segmentvariablen si sowie der Stützwerte yi bestimmen.

166

7

Fortgeschrittene Modellierungstechniken

Das zu lösende Optimierungsmodell lautet also min

(x,y,z,s)∈R × R × R N −1 × R N −1

y

s. t.

N −1 

zi = 1

i=1

0 ≤ si ≤ z i , i ∈ {1, . . . , N − 1} x =

N −1 

z i xi + si (xi+1 − xi )

i=1

y =

N −1 

z i yi + si (yi+1 − yi ).

i=1

Die Implementierung unter Verwendung von python-mip sieht wie folgt aus. import numpy as np from mip import BINARY , Model , minimize , xsum

# No n l i n e a r f u n c t i o n def f ( x ) : return np . sqrt ( x ) + np . sin ( x ) + 10 * np . exp ( - x )

# S u p p o r t i n g points x_sup = range (2 , 21 , 2 ) y_sup = [ f ( t ) for t in x_sup ] intervals = range ( len ( x_sup ) - 1 ) # Lower and upper bounds on x lb_x = 2 ub_x = 20 # O p t i m i z a t i o n model # Model d e c l a r a t i o n m = Model ( " Linearization " ) # x y z s

Decision variables = m . add_var ( lb = lb_x , ub = ub_x ) = m . add_var ( lb = - float ( " inf " ) ) = { i : m . add_var ( var_type = BINARY ) for i in intervals } = { i : m . add_var ( lb =0 , ub = 1 ) for i in intervals }

# Constraints m + = xsum ( z [ i ] for i in z ) = = 1 for i in intervals : m += s[i] 0 . 99 ] G . add_edges_from ( edges_used ) nx . draw ( G ) plt . show ()

In diesem Code-Beispiel wird die kürzeste Rundreise durch 20 Städte berechnet, deren Koordinaten zufällig bestimmt werden. Nach jedem Rechenlauf wird die berechnete Route mithilfe des Python-Pakets networkx visualisiert, sodass Sie auf einen Blick sehen, ob die Route unzulässigerweise in Teilrouten zerfällt. Nehmen Sie sich etwas Zeit, um mit dem Code zu experimentieren. Variieren Sie die Anzahl der Knoten und schalten Sie mithilfe des Parameters add_subtour_elim_constrs das Hinzufügen der subtour elimination constraints an oder aus. Sie werden sehen, dass es für einige Werte von num_nodes gar nicht notwendig ist, die subtour elimination constraints hinzuzufügen. Die Nebenbedingungen scheinen oft ohnehin erfüllt zu sein. Für die Berechnung der optimalen Tour mit 20 Städten benötigt Gurobi 48 s, wobei allein 32 s für das Hinzufügen der immerhin 1 048 364 subtour elimination constraints verwendet werden. Ohne die subtour elimination constraints zerfällt die Route in zwei Teilrouten, wie Sie leicht überprüfen können. Das bringt Sie auf folgende Idee. Wie wäre es, die subtour elimination constraints nicht auf Vorrat zu formulieren, sondern nur bei Bedarf einzufügen? Vielleicht reicht eine kleine Anzahl ja schon aus, um eine Lösung ohne separate Subtouren zu erreichen. Aufgeregt implementieren Sie das folgende iterative Vorgehen. 1. Löse das TSP ohne subtour elimination constraints. 2. Überprüfe, ob die Lösungstour des TSP in Teilrouten zerfällt. Falls ja, gehe zu Punkt 3. Falls nein, haben Sie eine optimale Route des TSPs berechnet.

7.2 Dynamischer Modellaufbau am Beispiel des Traveling Salesman Problems

173

3. Füge für jede Teilroute eine subtour elimination constraint hinzu und löse das TSP erneut. Gehe zu 2. So sieht das Ganze implementiert aus. import random from itertools import chain , combinations import matplotlib . pyplot as plt import mip import networkx as nx import numpy as np from mip import BINARY , Model , minimize , xsum

# Computes the powerset of a set without the empty set and the set itself def powerset ( iterable ) : s = list ( iterable ) return chain . from_iterable ( combinations (s , r ) for r in range (3 , len ( s ) ) )

# Generate N nodes with random distances num_nodes = 100 nodes = range ( num_nodes ) edges = set ( combinations ( nodes , 2 ) ) random . seed ( 73 ) coord = { n : ( random . randint (0 , 100 ) , random . randint (0 , 100 ) ) for n in nodes } dist = { (n , m ) : np . sqrt ( ( coord [ n ] [ 0 ] - coord [ m ] [ 0 ] ) ** 2 + ( coord [ n ] [ 1 ] - coord [ m ] [ 1 ] ) ** 2 ) for (n , m ) in edges } n_se_constrs = 0 # O p t i m i z a t i o n model m = Model ( " TSP " ) # Decision variable x = { e : m . add_var ( var_type = BINARY ) for e in edges } # c o n s t r a i n t : leave and enter each node only once for n in nodes : m += ( xsum ( x [n , v ] for v in nodes if (n , v ) in edges ) + xsum ( x [v , n ] for v in nodes if (v , n ) in edges ) == 2 )

174

7

Fortgeschrittene Modellierungstechniken

# Objective m . objective = minimize ( xsum ( dist [ e ] * x [ e ] for e in edges ) ) # optimizing m . optimize ()

def compute_cycles ( x : mip . Var , nodes ) - > list [ list ] : G = nx . Graph () G . add_nodes_from ( nodes ) edges_used = [ e for e in x if x [ e ] . x > 0 . 99 ] G . add_edges_from ( edges_used ) cycles = nx . m i n i m u m _ c y c l e _ b a s i s ( G ) return cycles

cycles = compute_cycles (x , nodes ) while len ( cycles [ 0 ] ) < len ( nodes ) : for cycle in cycles : cycle = sorted ( cycle ) m += ( xsum ( x [u , v ] for (u , v ) in combinations ( cycle , 2 ) ) < = len ( cycle ) - 1 ) n_se_constrs + = 1 m . optimize () cycles = compute_cycles (x , nodes )

def d r a w _ f i n a l _ g raph ( x : mip . Var , nodes ) : G = nx . Graph () G . add_nodes_from ( nodes ) edges_used = [ e for e in x if x [ e ] . x > 0 . 99 ] G . add_edges_from ( edges_used ) nx . draw ( G ) plt . show ()

print ( f " { n_se_constrs } subtour elimination constraints were added . " ) draw_final_graph (x , nodes )

Um die neue Formulierung zu lösen, benötigt Gurobi 0 s (statt 48 s) und fügt dafür 4 subtour elimination constraints (statt 1 048 364) hinzu. 

Trick 13 Falls Ihr Modell komplizierte Constraints enthält, die in der Regel auch ohne explizite Formulierung erfüllt sind, so bietet es sich an, diese nur bei Bedarf einzuführen.

Bemerkung 7.2.1 Kommerzielle Solver halten für diese flexible Art der ConstraintFormulierung sogenannte Lazy Constraints bereit, die je nach Anwendungsfall auch mit Callback-Funktionen kombiniert werden können, die mit dem Solver zur Laufzeit interagieren, womit sich das erneute Starten eines Modelllaufs verhindern lässt.

7.3 Infeasibilities und Irreducible Inconsistent Subsystems

175

Bemerkung 7.2.2 Da Suchalgorithmen in Python auf einer Menge schneller operieren als auf einer Liste, werden die Kanten des Graphen als set und nicht als list implementiert. Das beschleunigt die Ausführung des Codes für die ein- und ausgehenden Kanten extrem, da hier bei jedem Summanden überprüft wird, ob (n, v) bzw. (v, n) Teil von edges sind.

7.3

Infeasibilities und Irreducible Inconsistent Subsystems

Die generell gute Stimmung unzähliger Modelliererinnen ist schon beim Erscheinen der folgenden Fehlermeldung in den Keller gerutscht. The optimization model is infeasible. Was ist damit gemeint? Wenn ein Optimierungsmodell vom Solver für infeasible befunden wird, ist damit gemeint, dass die zulässige Menge leer ist. Solche Optimierungsprobleme nennt man auch inkonsistent, wie Sie bereits in Abschn. 1.3.5 erfahren haben. Das bedeutet in der Regel nicht, dass das Anwendungsproblem keine zulässige Lösung hat, sondern Sie haben einen Fehler bei der Modellierung begangen oder die verwendeten Daten, wie etwa Schranken an die Entscheidungsvariablen, sind fehlerhaft. So kann es offensichtlich kein x ∈ R geben, für das x ≤ 0 und x ≥ 1 gilt. Wie aber finden Sie diesen Fehler in einem Modell mit tausenden von Variablen und Restriktionen basierend auf obiger sehr allgemein gehaltener Fehlermeldung? Kommerzielle Solver bieten verschiedene Tools zur Erkennung der Gründe von Infeasibilities. Die bekannteste Methode ist die Berechnung eines sogenannten Irreducible Inconsistent Subsystem, das mit IIS abgekürzt wird. Was ist ein IIS? Ein IIS ist eine Teilmenge der Restriktionen mit folgenden Eigenschaften: • Die Teilmenge der Restriktionen ist immer noch inkonsistent, d. h., sie enthält einen Widerspruch und somit keinen zulässigen Punkt. • Sobald Sie eine beliebige Nebenbedingung aus dem IIS entfernen, wird diese Teilmenge von Nebenbedingungen konsistent. Aha! Das klingt für Sie hoffentlich interessant. Die Hoffnung bei der Berechnung eines IIS ist es immer, dass das IIS deutlich kleiner ist als die Menge aller Restriktionen, da Sie unter zehn Gleichungen und Ungleichungen vermutlich leichter einen Widerspruch finden als in einem System mit zehntausenden von Nebenbedingungen. Leider ist das nicht garantiert, und ein IIS kann immer noch sehr viele Restriktionen enthalten, was die Suche vielleicht vereinfacht, aber nicht trivial macht. Darüber hinaus gibt es das Problem, dass inkonsistente zulässige Mengen in der Regel mehrere IIS enthalten, und kommerzielle Solver wie CPLEX, Gurobi oder Xpress nicht zwangsläufig das kleinste IIS bestimmen. Trotzdem lohnt sich ein Blick in das IIS, um zumindest eine Idee davon zu erhalten, wo Sie mit der Suche nach dem Grund für die vorliegende Infeasibility beginnen können.

176

7

Fortgeschrittene Modellierungstechniken

Beispiel 7.3.1 Betrachten Sie das folgende System von Ungleichungen mit zwei kontinuierlichen Variablen x1 , x2 ∈ R und überlegen Sie einen Moment, warum es keine Lösung geben kann: x1 ≥ 1, x2 ≥ 2, x1 + x2 ≤ 2.5, x1 ≤ −1 Gibt es vielleicht sogar mehrere Probleme? Wie viele IIS können Sie angeben? Es gibt zwei Gründe für die Unlösbarkeit, die jeweils als IIS angegeben werden können. Das erste lautet x1 ≥ 1, x2 ≥ 2, x1 + x2 ≤ 2.5. Warum bildet diese Teilmenge obiger Restriktionen ein IIS? Nun, zunächst ist es unlösbar, da die Summe zweier Variablen, die jeweils größer als 1 bzw. 2 sind, nicht kleiner als 2.5 sein kann. Zum anderen wird dieses Teilsystem lösbar, wenn Sie eine beliebige der drei Restriktionen weglassen. Probieren Sie es aus! Jetzt ist es jedoch so, dass durch das Weglassen einer der Restriktionen zwar diese Teilmenge lösbar ist, aber es in der Menge aller Nebenbedingungen noch ein weiteres Problem gibt, das in dem IIS x1 ≥ 1, x1 ≤ −1 mündet. Erst eine Lösung beider Probleme wird Ihnen ein konsistentes System aus Ungleichungen bescheren. Bei der folgenden Python-Implementierung des Beispiels 7.3.1 gibt es einiges zu kommentieren. from gurobipy import GRB , Model # Model d e c l a r a t i o n m = Model ( " IIS " ) # Decision variable x = m . addVars ( range ( 2 ) , lb = - GRB . INFINITY , vtype = GRB . CONTINUOUS , name = " x " ) # Constraints m . addConstr ( x [ 0 ] > = 1 , name = " lower bound 1 " ) m . addConstr ( x [ 1 ] > = 2 , name = " lower bound 2 " ) m . addConstr ( x [ 0 ] + x [ 1 ] < = 2 . 5 ) m . addConstr ( x [ 0 ] < = -1 , name = " upper bound -1 " )

Beachten Sie, dass allen Entscheidungsvariablen und Constraints über das Attribut name ein Name zugewiesen wurde. Dies ist für die Lesbarkeit des IIS später hilfreich, da sich ansonsten Gurobi für die Variablen und Constraints selbst wunderschön klingende Namen wie R0 ausdenken wird.

7.3 Infeasibilities und Irreducible Inconsistent Subsystems

177

# Solve s t at e m e nt m . optimize ()

Nach dem Optimierungslauf lässt Ihnen der Solver die Nachricht Infeasible model zukommen und setzt das Attribut m.Status auf den Wert 3. Da Solver oft nicht auf Anhieb inkonsistente von unbeschränkten Modellen unterscheiden können, was sich im Wert m.Status=4 widerspiegelt, sei hier noch die folgende hilfreiche Abfrage erwähnt, die in diesem konkreten Fall unnötig ist. # m . Status == 4 indic ates that the model is i n f e a s i b le or u nb o u nded . if m . Status = = 4 : # Set D u a l R e d u c t i o n s to zero , so the solver can de t e r m i n e if the model is i n f e a s i b l e or u n b o u n d e d . m . Params . DualReduction s = 0 # reset all i n f o r m a t i o n from previous model runs m . reset () # reoptimize m . optimize ()

Nun kommen wir zum eigentlich spannenden Teil, der Berechnung des IIS. Welches der obigen IIS wird Gurobi wohl finden? # m . Status == 3 indicates that the model is i nfeasible . if m . Status = = 3 : # Compute an IIS m . computeIIS () # Write IIS m . write ( " IIS . ilp " )

Stolz meldet der Solver IIS computed: 3 constraints and 0 bounds, IIS runtime: 0.00 seconds und Sie wissen, dass das größere der beiden IIS berechnet wurde, was ein Blick in die erzeugte Datei IIS.ilp auch bestätigt. \ Model IIS_copy \ LP format - for model browsing . Use MPS format to capture full model detail . Minimize Subject To lower_bound_1 : x [ 0 ] > = 1 lower_bound_2 : x [ 1 ] > = 2 R2 : x [ 0 ] + x [ 1 ] < = 2 . 5 Bounds x [ 0 ] free x [ 1 ] free End

Interessanterweise berechnet Gurobi auch das kleinere der beiden IIS, wenn Sie bei der Deklaration die Reihenfolge der zweiten und vierten Constraint vertauschen.

178

7

Fortgeschrittene Modellierungstechniken

Dieses Beispiel und die zugehörigen warmen Worte waren hoffentlich hilfreich für das Verständnis von IIS, ihren Möglichkeiten und Grenzen.

7.4

Mehrzieloptimierung

In Anwendungsproblemen sind Sie oft nicht mit einer, sondern mehreren Zielgrößen konfrontiert, die in der Regel zueinander in Konflikt stehen. So möchten Sie etwa gleichzeitig kostenminimal und möglichst nachhaltig produzieren. Dies führt Sie zur Problemklasse der sogenannten Mehrzieloptimierung, die wir hier nur kurz anschneiden möchten. Falls Sie sich ausführlicher mit diesem spannenden Thema beschäftigen möchten, könnten der Artikel [5] inklusive dem zugehörigen PythonPaket pymoo sowie der Klassiker [9] für Sie interessant sein.

7.4.1

Ein einführendes Transportbeispiel

Das folgende Geschichte des Unternehmers Raffzahn soll Ihnen einen Einblick in ein typisches Mehrzielproblem gewähren. Problembeschreibung Der Unternehmer Raffzahn möchte mit einem Artikel zehn Kunden bedienen. Ihm steht dabei ein Netzwerk aus drei Zentral- und sechs Regionallagern zur Verfügung. Hierbei ist jede Kante mit variablen Kosten belegt, die pro transportierter Einheit anfallen. Zusätzlich möchte Herr Raffzahn gern möglichst wenig Regionallager verwenden, da die Inbetriebnahme eines Lagerhauses mit Mehraufwand verbunden ist. Allerdings kann er diesen Aufwand nicht quantifizieren. Das potentiell nutzbare Netzwerk zwischen allen Kunden, Zentral- und Regionallagern sehen Sie in Abb. 7.6. Herrn Raffzahns Vorgabe ist, dass die Regionallager keine Lagerbestände zu führen haben, d. h., die gewünschte Menge ist immer vom Zentrallager über ein Regionallager direkt zum Kunden zu transportieren. Das Modell Zunächst vergeben wir allen Komponenten schöne Buchstaben, um sie später platzsparend im Modell verbauen zu können. Seien also • W die Menge aller Zentrallager, • R die Menge aller Regionallager und • C die Menge aller Kunden. Außerdem definieren wir

7.4 Mehrzieloptimierung

179

Abb. 7.6 Transportnetzwerk (rot: Zentrallager, grün: Regionallager, gelb: Kunde)

• die Nachfrage Dc von Kunde c ∈ C, • die variablen Transportkosten K wr von Zentrallager w ∈ W zu Regionallager r ∈ R und • die variablen Transportkosten K r c von Regionallager r ∈ R zu Kunde c ∈ C. • Der Lagerbestand des Produkts im zentralen Lager w ∈ W erhält die Bezeichnung Sw . Unsere Entscheidungsvariablen sind • die transportierten Mengen twr ≥ 0 zwischen Zentrallager w und Regionallager r sowie • die Transportmengen tr c ≥ 0 zwischen Regionallager r und Kunde c. • Außerdem haben wir die binäre Entscheidung yr ∈ {0, 1}, ein Regionallager r zu öffnen (yr = 1) oder es zu lassen (yr = 0). Kommen wir zu den Restriktionen. Die Kundennachfrage soll erfüllt werden  Dc = tr c , c ∈ C, r ∈R

wobei der Lagerbestand die maximale Verfügbarkeit vorgibt:  Sw ≥ twr , w ∈ W r ∈R

Außerdem können Regionallager nur versenden, was sie erhalten, also   twr = tr c , r ∈ R, w∈W

c∈C

180

7

Fortgeschrittene Modellierungstechniken

und nur geöffnete Regionallager sind am Transport beteiligt. Da nie mehr als M := w∈W Sw über eine Kante transport werden kann, ist M eine gültige Oberschranke für die Summe alle Transportmengen zu einem Regionallager r , und wir formulieren 

twr ≤ yr M, r ∈ R.

w∈W

Nun wenden Sie sich den beiden Zielfunktionen zu. Die gesamten Transportkosten sind gegeben durch 

min



K wr twr +

w∈W ,r ∈R

K r c tr c ,

r ∈R,c∈C

und min



yr

r ∈R

modelliert eine Minimierung der Gesamtzahl aktiver Regionallager. Zusammengefasst lautet das Optimierungsmodell 

min

K wr twr +

w∈W ,r ∈R

min



r ∈R

s. t.

Dc =



K r c tr c

r ∈R,c∈C

yr



tr c ,

c∈C

twr ,

w∈W

r ∈R

Sw ≥ 

 r ∈R

twr =

w∈W





tr c ,

r∈R

c∈C

twr ≤ yr M,

r∈R

w∈W

twr ≥ 0, tr c ≥ 0, yr ∈ {0, 1},

w ∈ W, r ∈ R r ∈ R, c ∈ C r ∈ R,

wobei Ihnen vermutlich noch unklar ist, wie Sie mit den beiden Zielfunktionen umgehen möchten. Implementierung und erste Lösungsversuche Wir ignorieren zunächst Herrn Raffzahns Wunsch, möglichst wenig Regionallager zu verwenden, und minimieren lediglich die Transportkosten. Ein Optimierungslauf ergibt einen Optimalwert von 3219. Hierbei werden alle 6 Regionallager verwendet.

7.4 Mehrzieloptimierung

181

Diese Lösung scheint Ihnen etwas „extrem“ zu sein. Da haben Sie eine Idee, wie Sie sich in diesem konkreten Beispiel einen Überblick verschaffen können. Sie lösen das Optimierungsmodell sechs Mal und schränken jedes Mal die maximale Anzahl eröffneter Regionallager ein. In Durchgang i = 6, 5, . . . , 1 fügen Sie dem Modell also die Restriktion  yr ≤ i r ∈R

hinzu. Es folgt der zugehörige Python-Code. from gurobipy import GRB , Model , quicksum import matplotlib . pyplot as plt import random # Create data # Number w arehouses num_w = 3 # Number c ustome r s num_c = 10 # Central wa reh ouses ( 1 . Layer ) W = [ f ’W { i } ’ for i in range ( num_w ) ] # Regional wa r e h o u s es ( 2 . Layer ) R = [ f ’R { i } ’ for i in range ( 2 * num_w ) ] # Cu s t o m e r s ( 3 . Layer ) C = [ f ’C { i } ’ for i in range ( num_c ) ] # Create edges in t rans port network ( which you can use for # instance in a network package like networkx , if you like to # from central to regional warehouse edges_wr = [ (w , r ) for w in W for r in R ] # from regional w arehouse to customer edges_rc = [ (r , c ) for r in R for c in C ] edges = edges_wr + edges_rc # from central to regional warehouse for w in W : for r in R : edges . append (( w , r ) ) # from regional w arehouse to customer for r in R : for c in C : edges . append (( r , c ) ) # G e n e r a t e random , but r e p r o d u c i b l e de m a n d and cost data random . seed ( 73 ) dem = { c : random . randint ( 50 , 100 ) for c in C } cost = { e : random . randint (1 , 10 ) for e in edges } dem_tot = sum ( dem . values () ) # D i s t r i b u t e total demand equally among all cetral w a r e h o u s e s sup = { w : int (( dem_tot + ( 3 - dem_tot % 3 ) ) / 3 ) for w in W } # O p t i m i z a t i o n model # Model d e c l a r a t i o n m = Model ()

182

7

Fortgeschrittene Modellierungstechniken

# Decision variables twr = m . addVars (W , R ) trc = m . addVars (R , C ) y = m . addVars (R , vtype = GRB . BINARY ) # Constraints # Satisfy demand m . addConstrs ( dem [ c ] = = quicksum ( trc [r , c ] for r in R ) for c in # Respect supply m . addConstrs ( sup [ w ] > = quicksum ( twr [w , r ] for r in R ) for w in # Flow equation m . addConstrs ( quicksum ( twr [w , r ] for w in W ) = = quicksum ( trc [r , in C ) for r in R ) # Big M M = sum ( dem . values () ) m . addConstrs ( quicksum ( twr [w , r ] for w in W ) < = M * y [ r ] for r in

C) W) c ] for c

R)

# First ob ject ive : Minimize total t r an s p o r t a t i o n costs t_cost_total = m . addVar () m . addConstr ( t_cost_total = = quicksum ( cost [w , r ] * twr [w , r ] for w in W for r in R ) + quicksum ( cost [r , c ] * trc [r , c ] for r in R for c in C ) ) # Second o bjective : Minimize total number of used regional warehous es y_total = m . addVar () m . addConstr ( y_total = = quicksum ( y [ r ] for r in R ) ) # First , minimize only the first o bjective m . setObjective ( t_ cost_total , sense = GRB . MINIMIZE ) # Run o p t i m i z a t i o n m . optimize () # Solve results = [ ] for i in range ( len ( R ) , 0 , - 1 ) : m . addConstr ( y_total < = i ) m . optimize () results . append (( y_total .X , m . ObjVal ) ) # Plot results plt . scatter ( [ e [ 0 ] for e in results ] , [ e [ 1 ] for e in results ] ) plt . xlabel ( " Anzahl Regionallager " ) plt . ylabel ( " Transportkosten " ) plt . savefig ( " m u l t i o b j _ e x a m p l e _ s o l u t i o n s . pdf " ) plt . show ()

Sie sehen die Ergebnisse der jeweiligen Optimierungsrechnungen in Tab. 7.1, wobei sich die Transportkosten je nach Anzahl geöffneter Regionallager in der Regel unterscheiden. Wie erwartet, führt eine kleine Anzahl von Regionallagern zu höheren Transportkosten. Allerdings scheint laut den Optimierungsergebnissen eine Sättigung einzutreten, sobald Sie fünf Regionallager eröffnet haben, da der Schritt von fünf auf sechs Regionallager keine Kostensenkungen mit sich bringt.

7.4 Mehrzieloptimierung

183

Tab. 7.1 Die Ergebnisse der Optimierungsrechnungen für Unternehmer Raffzahn. Für jede Anzahl eröffneter Regionallager sind die jeweiligen Transportkosten angegeben. Anzahl Regionallager

Transportkosten

1 2 3 4 5 6

5675 4295 3679 3392 3219 3219

Abb. 7.7 Die verschiedenen Lösungsmöglichkeiten für Unternehmer Raffzahn. Für jede Option sind die Transportkosten und die jeweilige Anzahl verwendeter Regionallager angegeben.

Sie visualisieren Ihre Ergebnisse in Abb. 7.7 und betrachten Ihren Job als erledigt, da Herr Raffzahn unter den verschiedenen Optionen eine wählen kann, die seiner persönliche Präferenz am ehesten entspricht. Die einzige Möglichkeit, die sich definitiv ausschließen lässt, ist es, sechs Regionallager zu eröffnen, da dies im Vergleich zur Lösung mit fünf Regionallagern keine Kosteneinsparung bringt. So schön übersichtlich wie in diesem Beispiel sind die verschiedenen Optionen, die sich durch konkurrierende Zielfunktionen ergeben, in der Praxis leider selten, weshalb Sie in Abschn. 7.4.2 einige allgemeine Konzepte zum Umgang mit multikriteriellen Optimierungsproblemen kennenlernen werden.

184

7.4.2

7

Fortgeschrittene Modellierungstechniken

Lösungskonzepte

In diesem Abschnitt möchten wir uns Problemen mit mehreren Zielfunktionen, also multikriteriellen Optimierungsmodellen etwas strukturierter und allgemeiner zuwenden. Seien M ⊂ Rn eine zulässige Menge sowie K ∈ N die Anzahl der verschiedenen Zielfunktionen f 1 , . . . , f K : Rn → R, die über M minimiert werden sollen. Wir können und wollen hier das riesige Thema der Mehrzieloptimierung nicht annähernd erschöpfend diskutieren, werden aber nach einem Abschnitt über die sogenannte Pareto-Front zwei sehr hilfreiche Ansätze zur Behandlung multikriterieller Optimierungsprobleme kennenlernen. Hierbei handelt es sich um 1. den Gewichtete-Summe-Ansatz sowie 2. die hierarchische Optimierung, auch bekannt als lexikographische Optimierung, die wir in den folgenden Abschnitten kennenlernen werden. Zuvor besprechen wir allerdings noch kurz die Pareto-Front. Pareto-Front Ihnen ist in Abschn. 7.4.1 aufgefallen, dass die Lösung mit sechs Regionallagern uninteressant war, da die Alternative mit fünf Regionallagern in jeder Hinsicht mindestens genauso gut war und sogar strikt weniger Lager benötigte und die Lösung mit sechs Lagern somit „dominierte“. Formal nennen wir den Bildpunkt ( f 1 (x), . . . , f K (x)) ∈ R K eines Punktes x ∈ M einen nichtdominierten Punkt, falls es keinen Punkt z ∈ M gibt mit f 1 (z) ≤ f 1 (x), . . . ,

f K (z) ≤ f K (x)

und f i (z) < f i (x) für mindestens ein i ∈ {1, . . . , K }. Jeder Bildpunkt ( f 1 (x), . . . , f K (x)) ∈ R K eines nichtdominierten Punktes x wird Pareto-Optimum genannt und die Menge aller Pareto-Optima bilden die sogenannte Pareto-Front. Der zugehörige Punkt x ∈ Rn im „x-Raum“ wird effizienter Punkt genannt. In Abb. 7.8 sehen Sie die Pareto-Front und den dominierten Punkt des Beispiels aus Abschn. 7.4.1. Bemerkung 7.4.1 Visualisierungen von Pareto-Fronten, die anschließend Entscheiderinnen vorgelegt werden können, sind von großem Wert. Wie wollen Sie allerdings Pareto-Fronten mit mehr als drei Zielfunktionen visualisieren? An dieser Stelle möchte ich Sie ermutigen, eine Internetsuche zum Thema Parallelachsenplots (parallel coordinates plots) durchzuführen. Ein spannendes Thema!

7.4 Mehrzieloptimierung

185

Abb. 7.8 Die Pareto-Front der verschiedenen Lösungsmöglichkeiten für Unternehmer Raffzahn. Für jede Option sind die Transportkosten und die jeweilige Anzahl verwendeter Regionallager angegeben

Gewichtete-Summe-Ansatz Der Gewichtete-Summe-Ansatz besteht darin, eine gewichtete Summe der Zielfunktionen zu optimieren und das Mehrzielproblem damit wieder auf ein klassisches Optimierungsproblem mit einer Zielfunktion zurückzuführen. Sie wählen also Gewichtsparameter λ1 , . . . , λ K ∈ R, die Ihren Präferenzen entsprechen, und lösen das Problem  minn λk f k (x) s. t. x ∈ M. (7.1) x∈R

k=1,...,K

Da dieser Ansatz so interpretiert werden kann, dass Sie damit den Vektor der Zielfunktionen ( f 1 (x), . . . , f K (x)) in einen Skalar k=1,...,K λk f k (x) verwandeln, wird der Ansatz auch Skalarisierungsansatz genannt. Beachten Sie allerdings, dass es nicht den einen Skalarisierungsansatz gibt, sondern viele Möglichkeiten, das Mehrzielproblem in ein klassisches Einzielproblem zu konvertieren, weshalb GewichteteSumme-Ansatz die spezifischere Bezeichnung dieses Vorgehens ist. Ein typisches Vorgehen in der Praxis wäre es nun, für verschiedene Wahlen von λ1 , . . . , λ K das Optimierungsproblem 7.1 zu lösen. Bemerkung 7.4.2 Man kann mathematisch zeigen, dass jeder Optimalpunkt von 7.1 ein effizienter Punkt ist und dessen Bildpunkt somit einen Teil der Pareto-Front bildet. Die umgekehrte Aussage gilt je nach Struktur des Problems nicht immer, sodass sich für gewisse, insbesondere nichtkonvexe, Modellklassen nicht alle Punkte der Pareto-Front durch wiederholtes Lösen von 7.1 berechnen lassen.

186

7

Fortgeschrittene Modellierungstechniken

Hierarchische Optimierung In der hierarchischen Optimierung, auch lexikographische Optimierung genannt, sortieren wir die Zielfunktionen nach Wichtigkeit und weisen jeder Funktion f k eine Toleranz εk ≥ 0 zu. Hierbei nehmen wir an, dass die Zielfunktionen f 1 , . . . , f K bereits absteigend nach Wichtigkeit sortiert sind. 1. Wir optimieren zunächst die wichtigste Zielfunktion, d. h., wir lösen das Optimierungsproblem min f 1 (x)

s. t.

x ∈ M,

und erhalten den Optimalwert f 1 . 2. Nun erlauben wir kleine Abweichungen von der wichtigsten Zielfunktion und optimieren bezüglich der zweitwichtigsten Zielfunktion f 2 , d. h., wir lösen min f 2 (x)

s. t.

x ∈ M, f 1 (x) ≤ f 1 + ε1 .

Der Optimalpunkt ist optimal in Bezug auf die zweite Zielfunktion unter der Nebenbedingung, dass sich die erste Zielfunktion maximal um ε1 verschlechtert. 3. Fahre analog für alle weiteren Zielfunktionen fort. Der Vorteil dieser Vorgehensweise ist, dass es oft eine natürliche Priorität innerhalb der verschiedenen Zielfunktionen gibt und sich das ε im Idealfall als Geldbetrag ausdrücken oder anderweitig quantitativ erfassen lässt, was der Interpretierbarkeit der Ergebnisse zugute kommt. Zum Abschluss sei erwähnt, dass verschiedene Konzepte der Mehrzieloptimierung auch von kommerziellen Solvern nativ durch komfortable Implementierungen unterstützt werden.

7.5

Sensitivitätsanalyse

7.5.1

Motivation und einführendes Beispiel aus der Netzwerkanalyse

Motivation Bisher haben wir die definierenden Inputdaten eines Optimierungsmodells als fest vorgegeben betrachtet. In der Sensitivitätsanalyse sowie in vielen praktischen Fragestellungen möchte man hingegen an den problemdefinierenden Daten „wackeln“ und die entsprechenden Auswirkungen auf die Optimalität untersuchen. Ganz konkret könnte dabei eine der beiden folgenden Fragen aufkommen: • Lohnen sich Erweiterungen der Restriktionen, die etwa die Produktionskapazitäten darstellen? • Wie sensitiv sind die Ergebnisse im Bezug auf Änderungen der Inputdaten wie Kostensteigerungen?

7.5 Sensitivitätsanalyse

187

Q 30

5

10

T1 10

10

T2 5

S 30

10

3

15

8

2

T3 25 Abb. 7.9 Das Netzwerk, über das der kostenminimale Transport von 30 Einheiten von Q nach S stattfinden soll. Die Kantengewichte entsprechen den variablen Transportkosten, und die Kapazitäten der Knoten T1 , T2 und T3 sind jeweils auf den Knoten eingetragen.

• Wie sensitiv sind die Ergebnisse im Bezug auf Änderungen der Inputdaten wie Kostensteigerungen? Auf diese Fragestellungen wollen wir in folgender Problemstellung exemplarisch eingehen. Problemstellung Bei Netzwerkproblemen sollten Sie in diesem Buch nicht in erster Linie an Ihre Internetverbindung denken. Netzwerke, auch Graphen genannt, sind omnipräsent und begleiten Sie durch Ihren Alltag. Wie Sie bereits aus Abschn. 7.2 wissen, bestehen Graphen aus Knoten und Kanten, die wiederum gerichtet oder ungerichtet sein können, was in den Bezeichnungen gerichteter oder ungerichteter Graph mündet. Graphen können Computernetzwerke, Streckenpläne der Bahn, Straßen, Flugrouten, Fluchtwege in Fußballstadien, Datenbankstrukturen, Produktionsnetzwerke, soziale Netzwerke und vieles mehr sein. Sie möchten im gerichteten Graphen aus Abb. 7.9 kostenminimal 30 Einheiten von der Quelle (Q) zur Senke (S) transportieren. Dabei bezeichnen wir die Zahlen auf den Kanten des Netzwerks als Kantengewichte, die in diesem Beispiel den variablen Transportkosten pro Einheit entsprechen. Die Kapazitäten der Durchgangsknoten T1 , T2 und T3 entsprechen den eingetragenen Zahlen auf den jeweiligen Knoten. Das Netzwerk enthält bereits alle Informationen, die Sie brauchen, um das zugehörige Optimierungsmodell formulieren zu können. Das Modell Wir modellieren das Beispiel als gerichteten gewichteten Graphen G mit Knoten V = {Q, T1 , T2 , T3 , S},

188

7

Fortgeschrittene Modellierungstechniken

Kanten E = {(Q, T1 ), (Q, T2 ), (Q, T3 ), (T2 , T1 ), (T2 , T3 ), (T1 , S), (T2 , S), (T3 , S)} und Gewichten we , e ∈ E. Darüber hinaus haben wir eine Kapazitätsbeschränkung Cv für jeden Transitknoten v ∈ {T1 , T2 , T3 }. Dem S sei die Nachfrage der Senke, die in unserem Beispiel dem Angebot Sup Q der Quelle entspricht. Schließlich definieren wir Pre(v2 ) := {v1 ∈ V | (v1 , v2 ) ∈ E}, die Menge aller direkten Vorgänger von v2 , und Suc(v1 ) := {v2 ∈ V | (v1 , v2 ) ∈ E}, die Menge aller direkten Nachfolger von v1 . Die Entscheidungsvariablen bestehen aus dem jeweiligen Fluss, d. h. der transportierten Menge xe ≥ 0 über Kante e ∈ E, und nichtnegativen kontinuierlichen Variablen. Die Nebenbedingungen lauten wie folgt. • Wir fordern



x(v1 ,v2 ) ≤ Cv2 , v2 ∈ {T1 , T2 , T3 },

v1 ∈Pre(v2 )

d. h., die Summe aller eingehenden Flüsse darf die Kapazität eines Knotens nicht übersteigen. • Erhaltungsgleichung der Transportströme: 



x(v1 ,v) =

v1 ∈Pre(v)

x(v,v2 ) , v ∈ {T1 , T2 , T3 }

v2 ∈Suc(v)

• Erfüllung der Nachfrage: 

x(v1 ,S) ≥ Dem S

v1 ∈Pre(S)

• Berücksichtigung des Quellenangebots: 

x(Q,v2 ) ≤ Sup Q

v2 ∈Suc(Q)

Wir minimieren die Transportkosten, d. h., unsere Zielfunktion f ist gegeben durch f (x) :=

 e∈E

we xe .

7.5 Sensitivitätsanalyse

Implementierung und Lösung Hier ist die Python-Implementierung des obigen Modells. from gurobipy import GRB , Model import pandas as pd # Data # Create pandas d ataframes from input data df = pd . read_csv ( ’ edges . csv ’ , header = None , names = [ ’ Start ’ , ’ Destination ’ , ’ Costs ’] ) df_cap = pd . read_csv ( ’ capacities . csv ’ , header = None , names = [ ’ Nodes ’ , ’ Capacity ’] ) # Build sets , lists and d i c t i o n a r i e s that contain input data for the # o p t i m i z a t i o n model from these data frames capacities = { n : cap for (n , cap ) in df_cap . values } edges = set ( [ tuple ( x ) for x in df [ [ ’ Start ’ , ’ Destination ’] ] . values ] ) costs = { (n , n1 ) : w for (n , n1 , w ) in df . values } nodes = set ( df [ ’ Start ’] . append ( df [ ’ Destination ’] ) ) nodes_intermed = [ n for n in nodes if n [ 0 ] = = ’T ’] # O p t i m i z a t i o n model # Model dec l a r a t i o n m = Model ( ’ flow ’) # Decision variables x = m . addVars ( edges , name = ’ Transport on edge ’) # Constraints # 30 units have to be t r a n s p o r t e d from source to sink m . addConstr ( sum ( x [n , ’S ’] for n in nodes if (n , ’S ’) in edges ) = = 30 ) m . addConstr ( sum ( x [ ’Q ’ , n ] for n in nodes if ( ’Q ’ , n ) in edges ) = = 30 ) # Capacity constraints cap_restr = m . addConstrs ( sum ( x [ n1 , n ] for n1 in nodes if ( n1 , n ) in edges ) < = capacities [ n ] for n in nodes_intermed ) # Flow c o n s e r v a t i o n e q u a t i o n m . addConstrs ( sum ( x [ n1 , n ] for n1 in nodes if ( n1 , n ) in edges ) = = sum ( x [n , n2 ] for n2 in nodes if (n , n2 ) in edges ) for n in nodes_intermed ) # Objective function m . setObjective ( sum ( costs [ e ] * x [ e ] for e in edges ) , sense = GRB . MINIMIZE ) # Solve o p t i m i z a t i o n model m . optimize () # Print results print ( f " Total transportation costs : { m . ObjVal } " ) for e in x : if x [ e ] . X > 0 . 1 : print ( f " Edge : { e } , Transported units : { x [ e ]. X } " )

189

190

7

Fortgeschrittene Modellierungstechniken

T1 10 10

10

10

T2 5

10

10

Q 30

8

5

5

5

3

15

S 30 2

15

T3 25

20

Abb. 7.10 Netzwerk aus Abb. 7.9, rot eingetragen der optimale Fluss über das Netzwerk mit den jeweils zu transportierenden Mengen

Die minimalen Transportkosten betragen 460, und eine optimale Transportmöglichkeit sehen Sie in den nächsten Zeilen. Total Edge : Edge : Edge : Edge : Edge : Edge :

transportation costs : 460 . 0 ( ’ T2 ’ , ’ T3 ’) , Transported units : 5 . 0 ( ’Q ’ , ’ T1 ’) , Transported units : 10 . 0 ( ’ T1 ’ , ’S ’) , Transported units : 10 . 0 ( ’ T3 ’ , ’S ’) , Transported units : 20 . 0 ( ’Q ’ , ’ T2 ’) , Transported units : 5 . 0 ( ’Q ’ , ’ T3 ’) , Transported units : 15 . 0

Fragen zur Sensitivität der Ergebnisse In Abb. 7.10 sehen Sie eine Visualisierung des optimalen Flusses, der im letzten Abschnitt berechnet wurde. Basierend darauf stellen Sie sich die folgenden Fragen. 1. Angenommen, Ihnen stünde ein Budget zur Verfügung, um an einer Stelle die Kapazität des vorhandenen Netzwerks auszubauen. Von welcher Kapazitätserweiterung versprechen Sie sich die größte Kostensenkung? 2. Offensichtlich werden nicht alle Kanten des Netzwerks für den Transport verwendet. Wie günstig müssen die variablen Transportkosten der nicht-verwendeten Strecken werden, damit die jeweiligen Kanten in einer optimalen Route Berücksichtigung finden? Im nächsten Abschn. 7.5.2 zu Schattenpreisen werden wir uns um die erste Frage kümmern und uns anschließend in Abschn. 7.5.3 der zweiten Frage zuwenden, die uns auf das Thema der reduced costs führen wird.

7.5 Sensitivitätsanalyse

7.5.2

191

Schattenpreise

In aller Kürze Jede Ungleichung aiT x ≤ bi besitzt einen Schattenpreis λi , der Ihnen die marginale Verbesserung Ihres Optimalwerts bei einer Relaxierung der rechten Seite bi angibt. Dieser Wert ist mit Vorsicht zu genießen, da schon bei einer sehr kleinen Erweiterung der rechten Seite eine andere Restriktion bindend sein könnte und Sie somit die erhoffte Verbesserung Ihres Optimalwertes in Höhe des Schattenpreises nicht immer realisieren können. Schattenpreise werden als Optimalpunkte der dualen Optimierungsprobleme berechnet, was den Zusammenhang zur LP-Dualitätstheorie herstellt, die Sie in Abschn. 4.3.3 kennenlernen durften. Bemerkung 7.5.1 Falls Sie sich tiefer mit dem Thema Dualität und Schattenpreise beschäftigen möchten als in diesem Buch angerissen, empfehle ich Ihnen einen Blick in [23] verbunden mit dem Hinweis, dass Schattenpreise nichts anderes als KKTMultiplikatoren sind. Darüber hinaus beschäftigt sich das Optimierungsgebiet der sogenannten parametrischen Optimierung eingehend mit der Sensitivität von Optimierungsproblemen jeglicher Art. Als Einstieg bietet sich hier beispielsweise die Lektüre von [22] und [21] an. Mathematischer Hintergrund Hier wird der Begriff des Schattenpreises für Interessierte mathematisch präzisiert, ohne die zugehörigen Beweise anzugeben, die Sie in [22] nachlesen können. Die Optimalwertfunktion v des primalen Problems P:

max c T x

s. t.

Ax ≤ b, x ≥ 0

als Funktion von b ist v(b) := max{c T x| Ax ≤ b, x ≥ 0}. Sie ist eine stückweise-lineare konkave monoton steigende Funktion. Die Richtungsableitung v(b + tu) − v(b) t von v an b in Richtung u ist gegeben durch v  (b, u) := lim

t→0+

v  (b, u) = min{u T λ| λ ∈  }, wobei  die Menge der Optimalpunkte des dualen Problems D:

min b T λ

λ∈Rm

s. t.

A T λ ≥ c, λ ≥ 0

ist. Aus der Formel für die Richtungsableitung folgt, dass die marginale Erhöhung der rechten Seite b eine marginale Erhöhung der Zielfunktion um den zugehörigen Wert der optimalen Dualvariablen induziert.

192

7

Fortgeschrittene Modellierungstechniken

Bemerkung 7.5.2 Wichtig im Zusammenhang mit Schattenpreisen ist das Wort marginal. Wenn Ihre Kapazitätsrestriktion aiT x ≤ bi den Schattenpreis λi = 10 hat, bedeutet dies nicht zwangsläufig, dass eine Erhöhung der rechten Seite bi um i = 4 Ihnen einen Zielfunktionszuwachs von i · λi = 4 · 10 = 40 beschert. Glücklicherweise können kommerzielle Solver zusätzlich zum Schattenpreis λi einen Gültigkeitsbereich G i angeben, für den gilt, dass für alle i ≤ G i die Verbesserung i · λi der Zielfunktion gewährleistet wird. Implementierung und Anwendung auf die Netzwerkanalyse Gurobis Python-API stellt Ihnen im Attribut .Pi den Schattenpreis der jeweiligen Restriktion zur Verfügung. Im obigen Beispiel können Sie etwa mit cap_restr [’T3’].Pi den Schattenpreis der Kapazitätsrestriktion im Knoten T3 auslesen. In unserem Beispiel gilt cap_restr[’T1’].Pi = - 4, cap_restr[’T2’] .Pi = - 2 und cap_restr[’T3’].Pi = 0. Sie halten also spontan eine Kapazitätserweiterung von T1 für sinnvoll, da Ihnen hier pro weitere Kapazität eine Kostensenkung von 4 in Aussicht gestellt wird. Interessant ist noch die Beobachtung, dass T3 kein Flaschenhals zu sein scheint, da eine Erweiterung seiner Kapazität keine Kostensenkung erwirtschaftet. Schauen wir uns die zugehörigen Gültigkeitsbereiche an, die Gurobi im Attribut . SARHSUp verwahrt. Hier gilt cap_restr[’T1’].SARHSUp=25, cap_restr [’T1’].SARHSUp=20 und cap_restr[’T1’].SARHSUp=inf. Sie wissen also, dass Ihnen eine Erweiterung der Kapazität in T1 um  = 25 eine Kostensenkung von  · (−4) = −100 bescheren wird. Spannend!

7.5.3

Reduced Costs

Idee Im Gegensatz zu Schattenpreisen ist die Leitfrage beim Thema reduced costs eine andere. Sie wählen eine Entscheidungsvariable aus, die im Optimalpunkt den Wert Null hat, d. h. nicht berücksichtigt wurde, und fragen sich, um wie viel der Zielfunktionskoeffizient dieser Variablen reduziert werden muss, damit sie Teil einer optimalen Lösung wird. Implementierung und Anwendung auf die Netzwerkanalyse Konkret auf das Netzwerk in Abb. 7.10 bezogen, können Sie sich etwa die nicht verwendete Kante (T2 , S) aussuchen und fragen, wie viel günstiger die Transportkosten auf der Kante (T2 , S) sein müssen, damit diese Route Teil des optimalen Transportplans wird. Zur Beantwortung diese Frage können Sie Gurobis Attribut .rc konsultieren. Um die reduced costs aller Kanten zu berechnen, führen Sie den Python-Code for k in x : print ( f " { k } : { x [ k ]. rc } " )

7.5 Sensitivitätsanalyse

193

aus und erhalten ( ’Q ’ , ’ T2 ’) : 0 . 0 ( ’Q ’ , ’ T1 ’) : 0 . 0 ( ’ T3 ’ , ’S ’) : 0 . 0 ( ’ T1 ’ , ’S ’) : 0 . 0 ( ’ T2 ’ , ’S ’) : 5 . 0 ( ’ T2 ’ , ’ T1 ’) : 17 . 0 ( ’ T2 ’ , ’ T3 ’) : 0 . 0 ( ’Q ’ , ’ T3 ’) : 0 .0 ,

was Sie sofort verifizieren möchten. Die Tatsache, dass auf sechs der Kanten die reduced costs null sind, passt gut dazu, dass genau diese sechs Kanten bereits Teil der optimalen Transportroute sind. Lediglich für die bisher unbenutzten Routen (T2 , S) und (T2 , T1 ) werden reduced costs berechnet. Beachten Sie, dass die reduced costs für (T2 , T1 ) mit 17 sogar die variablen Transportkosten von 10 überschreiten. Es muss also ein Bonus von 17 − 10 = 7 gezahlt werden, um diese Route für den gewünschten Transport hinreichend attraktiv zu machen. 

Trick 14 Sensitivitätsüberlegungen basierend auf Schattenpreisen und reduced costs können durchgeführt werden, ohne eine erneute Modellrechnung durchführen zu müssen, was je nach Modellgröße doch eine erheblich Zeitersparnis sein kann.

8

Optimierungsmodelle in der Praxis

All models are wrong, but some are useful. George E. P. Box

8.1

Erfolgsrezepte für den Einsatz von Optimierungsmodellen

Es gibt einige Punkte, die für den erfolgreichen Einsatz eines Optimierungsmodells zu beachten sind.

8.1.1

Welche Probleme Sie mit Optimierung lösen sollten (und welche nicht)

Optimierungsmodelle können bei der Suche nach guten Entscheidungen hilfreich sein. Insbesondere sind sie in der Regel nicht rein deskriptiver Natur, wie es beispielsweise viele statistische Modelle sind, sondern zielen immer darauf ab, mithilfe von Modellinformationen eine gute Entscheidung zu treffen. Fragen Sie sich also, was die Entscheidung ist, bei der Sie ein Optimierungsmodell unterstützen soll. Diese Entscheidung sollte relevant, umsetzbar, und nicht-trivial sein. Relevanz Optimierungsmodelle werden in aller Regel nicht zum Privatvergnügen erstellt, sondern dienen der Lösung handfester Probleme im Industriekontext. Versuchen Sie zunächst ein Gefühl dafür zu bekommen, ob das Problem, das Sie lösen möchten, relevant ist. Können Sie den Nutzen der Lösung Ihres Problems quantifizieren? Würde Ihr Optimierungsmodell Ihrem Unternehmen helfen Geld zu sparen? Sehen Sie Optimierungspotential, was die Nachhaltigkeit oder die Sicherheit der aktuellen Situation angeht, und denken Sie, dass ein Modellansatz hier helfen könnte? © Der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 N. Sudermann-Merx, Einführung in Optimierungsmodelle, https://doi.org/10.1007/978-3-662-67381-2_8

195

196

8

Optimierungsmodelle in der Praxis

Wie wird das Problem aktuell ohne Optimierungsmodelle gelöst? Ist die bestehende Lösung nicht schon ausreichend und angemessen für den Sachverhalt, oder erwarten Sie einen signifikanten Mehrwert durch den Einsatz mathematischer Optimierung? Eine Beantwortung diese Fragen liefert Ihnen einen ersten Anhaltspunkt dafür, ob ein Optimierungsansatz sinnvoll ist, und liefert außerdem gute Argumente für eine mögliche Priorisierung bei anstehenden Finanzierungen, denn ein Optimierungsprojekt kostet immer auch Geld. Umsetzbarkeit Stellen Sie sich schon vor Projektbeginn kurz vor, das Modell wäre bereits fertig entwickelt und würde Ihre Fragen beantworten. Wären die Ergebnisse in Ihrem Unternehmen umsetzbar? Besitzt das Thema die nötige Management-Attention, um basierend auf den Modellergebnissen Entscheidungen zu treffen und umzusetzen? Liegt es in der Entscheidungsmacht Ihrer Auftragsgeberin, die als Entscheidungsvariablen definierten Größen auch wirklich beeinflussen zu können? Versuchen Sie sich von dem Gedanken zu lösen, alle zur Verfügung stehenden Informationen im Modell aufnehmen zu wollen. Ein Optimierungsmodell ist keine beschreibende Simulation, sondern soll nur relevante Einschränkungen und Auswirkungen möglicher Entscheidungen berechnen. Dementsprechend sollten nur echte Freiheitsgrade als Entscheidungsvariablen berücksichtigt werden, die nach erfolgreicher Implementierung des Modells auch in die Praxis umgesetzt werden können. Nicht-Trivialität Nicht jedes Problem ist hinreichend komplex, um den Aufwand eines Optimierungsmodells zu rechtfertigen. Wenn es einfache und gute Lösungen gibt, schön für Sie! Dann können Sie Ihre Energie einem anderen Anwendungsfall widmen, der eines Optimierungsansatzes würdig ist.

8.1.2

Einbindung in die IT-Infrastruktur

Oft scheitern Optimierungsprojekte nicht an der Mathematik oder der Modellierung, sondern an einer geeigneten Einbindung in die bestehende IT-Infrastruktur. Wenn etwa sämtliche Daten und Informationen in Ihrem SAP-System liegen und Sie weder etwas von Mathematik noch von Programmierung verstehen, bringt Ihnen das Optimierungsmodell wenig, das Ihr Optimierungsfreund Ihnen während des letzten Mittagessens mit schwer leserlicher Handschrift auf drei DIN A4 Seiten in den Schreibblock gekritzelt hat. Hier sind einige Punkte, die ich für wichtig erachte, in loser Reihenfolge vorgetragen. Ausbau eigener IT-Kenntnisse Das Problem beginnt damit, dass Optimierungsexperten in der Regel über keine ausgeprägten Kenntnisse im Bereich Softwareentwicklung verfügen und somit auf die Zusammenarbeit mit IT-Abteilungen angewiesen sind, um ihr Optimierungsmodell zu einer nutzbaren Software ausbauen zu können. Im Sinne der Arbeitsteilung

8.1 Erfolgsrezepte für den Einsatz von Optimierungsmodellen

197

moderner Gesellschaften ist dieses Problem auch nicht zu umgehen. Sie können jedoch die Erfolgswahrscheinlichkeit einer solchen Kooperation deutlich erhöhen, indem Sie auch selbst beginnen, sich mit IT-Themen auseinanderzusetzen. Es hat einem Modellierer noch nie geschadet, die Funktionsweise von Datenbanken, WebApplikationen oder Cloud-Diensten zumindest grob nachzuvollziehen. Umgekehrt eignen sich idealerweise auch die beteiligten Softwareentwicklerinnen zumindest ein grobes Grundverständnis von mathematischer Optimierung an. IT-Systeme als Heimat von Optimierungsmodellen Bei der Wahl einer geeigneten IT-Umgebung für Ihr Optimierungsmodell ist es hilfreich, verschiedene Problemtypen zu unterscheiden, wobei die folgende Aufzählung weder vollständig noch trennscharf ist. Eine One-Shot-Solution löst knifflige Aufgabenstellungen, die selten auftreten und deren einmalige Lösung das Problem zumindest mittelfristig erschöpfend behandelt. Wenn beispielsweise ein Unternehmen alle zehn Jahre eine neue Produktionshalle errichtet und Sie um die Berechnung des optimalen Layouts bittet, so können Sie diese Fragestellung völlig losgelöst von der IT-Infrastruktur im stillen Kämmerchen beantworten und sich anschließend mit einem Plan und flankierenden Analysen wieder bei Ihrer Auftraggeberin melden. Auch wenn die anzuwendende Methodik sehr anspruchsvoll sein kann, so ist das Problem aus IT-Sicht angenehm zu handhaben, da Sie keine Software, sondern Ergebnisse in Form von Zahlen produzieren. Unter einer Stand-Alone-Solution verstehen wir ein selbstständiges Stück Software, das ein Optimierungsmodell im Bauch hat, jedoch IT-seitig eher losgelöst von der bestehenden Infrastruktur funktioniert. Ein Beispiel dafür wäre ein Jupyter Notebook oder eine Web-Applikation, deren Daten in Form von CSV-Dateien zur Verfügung gestellt werden. Das Ergebnis ist ein Tool, das Sie, vergleichbar zu Excel-Dateien, einer Endnutzerin zur Verfügung stellen, die damit eigene Analysen durchführen kann. Der Datenfluss ist jedoch nicht vollständig automatisiert, sodass sich diese Art von Lösung für wiederkehrende Aufgaben niedriger Frequenz eventuell anbieten kann. Falls Ihr Optimierungsmodell Teil einer sogenannten Fully-Flegded-Solution ist, handelt es sich dabei um eine vollständig integrierte Lösung, die automatisiert Daten erhält und produziert. Aufgrund des hohen Automatisierungsgrades sind in der Regel viele Pre- and Postprocessing-Schritte notwendig, um ein hohes Sicherheitslevel garantieren zu können. Dies resultiert allerdings hoffentlich in einem hochproduktiven und skalierbaren System, das auch im operativen Betrieb für einen hohen Mehrwert sorgen kann, nachdem die hohen IT-Hürden bei der Einführung des Systems und der Schulung der Nutzer gemeistert wurden.

8.1.3

Strategisch, taktisch oder operativ?

Möchten Sie mit Ihrem Modell strategische, taktische oder operative Fragen beantworten?

198

8

Optimierungsmodelle in der Praxis

Zur Wiederholung: In der Regel wird ein Planungshorizont in operative, taktische und strategische Zeiträume unterteilt. Operative Entscheidungen betreffen das „Tagesgeschäft“ und damit einen Zeithorizont von deutlich unter einem Jahr bis hin zu wenigen Stunden oder Minuten. Taktische Planungen beziehen sich auf wenige Jahre, wohingegen die Strategie eines Unternehmens deutlich weiter in die Zukunft blickt. Die Wahl Ihres Planungshorizonts beeinflusst natürlich die zu modellierenden Teile Ihres Optimierungsproblems. Ein Planungsmodell mit dem Sie Investitionsentscheidungen für die nächsten zehn Jahre berechnen, wird in der Regel nicht Größen enthalten, die im Minutentakt variieren. Umgekehrt wird ein Modell zur Optimierung Ihres Warenflusses keine Entscheidungen über das Eröffnen oder Schließen eines Lagers enthalten, wenn Sie damit den stündlichen Ein- und Abgang der Waren in Ihrem Lager berechnen wollen, da die grundsätzliche Entscheidung über die Eröffnung von Lagern nicht Teil der operativen Planung ist, sondern eine langfristige Perspektive erfordert.

8.2

Vorgehen bei der Entwicklung eines Optimierungsmodells

Hier sind einige Hinweise zur Entwicklung von Optimierungsmodellen in praktischen Anwendungen. Problemverständnis entwickeln Im ersten Schritt ist es wichtig, das zu lösende Problem bestmöglich zu verstehen. Dies ist oft leichter gesagt als getan. Stellen Sie sich vor, Frau Elektra mit jahrzehntelanger Erfahrung in der Energiewirtschaft präsentiert Ihnen ein Problem aus ihrem Arbeitsumfeld, das Wissen über Elektrotechnik, Auktionssysteme und vielleicht noch Teile der Wirtschaftswissenschaften voraussetzt. In der Regel werden Sie das nicht auf Anhieb verstehen. Stellen Sie also Fragen. Viele Fragen. Komplexe Probleme zu verstehen, kann sich über viele Wochen hinziehen, da Sie in der Regel als Methodikexperte und nicht als Anwendungsexperte gefragt sind und sich in die meisten Anwendungen zunächst einzuarbeiten haben. Dieser Teil der Arbeit ist meistens der wertvollste und gleichzeitig der anstrengendste Teil Ihrer Arbeit. Sobald Sie die Anwendung von Frau Elektra verstanden haben, lohnt es sich oft, noch weitere Meinungen hinzuzuziehen, da eine Problemformulierung immer auch eine subjektive Färbung enthält und weitere Expertinnen Ihnen vielleicht andere Informationen über mögliche Nebenbedingungen und Freiheitsgrade liefern können. Dieser Teil ist für das Erstellen eines Optimierungsmodells essentiell, da Ihre Aufgabe darin besteht, Anwendungsverständnis in Formeln zu übersetzen. Dies ist gleichzeitig auch ein großer Unterschied zu Modellen aus den Bereichen der Statistik und das Maschinellen Lernens, in denen oft zunächst direkt aus Trainingsdaten gelernt wird. Auch hier sind natürlich Kenntnisse der Anwendung von Vorteil, aber diese müssen nicht explizit in Gleichungen und Variablen gegossen werden.

8.2 Vorgehen bei der Entwicklung eines Optimierungsmodells

199

Formulierung des Optimierungsmodells Nun geht es daran, die Übersetzung des Problemverständnisses in die Mathematik vorzunehmen. Denken Sie zunächst daran, im Sinne von Abschn. 8.1 nur die relevanten Teile der Problemstellung zu modellieren. Ob Sie das zunächst auf Blatt und Papier, in LaTeX oder direkt am PC in beispielsweise Python oder einer anderen Modellierungssprache durchführen, ist Geschmacksfrage und hängt meistens von der Komplexität des Modells ab. Bei der Implementierungsreihenfolge der Modellkomponenten empfiehlt es sich oft, zunächst mit den Entscheidungsvariablen und der Zielfunktion zu beginnen. Anschließend können die Restriktionen sukzessive hinzugefügt werden, was die Suche nach etwaigen Formulierungsfehlern in den Constraints vereinfacht und Sie darüber hinaus auch an der Inspektion der Ergebnisse des unvollständigen Modells selbst bemerken, welche Restriktionen noch fehlen. Welchen Weg Sie auch einschlagen, das Ziel sollte eine initiale Formulierung Ihres Modells sein. Dokumentation des Modells Denken Sie daran, dass das Modell nach Fertigstellung nicht nur funktionieren sollte, sondern auch von Ihrem Kollegen verstanden werden muss, falls Sie sich morgen dazu entscheiden, zu kündigen und den Rest Ihres Lebens in der Südsee zu verbringen. Eine gute und feingranulare Dokumentation ist hier besonders wichtig, da Ihre Modelle eine sehr hohe Informationsdichte aufweisen. Es wird regelmäßig vorkommen, dass Sie an einzelnen Restriktionen Wochen tüfteln und daher nicht erwarten können, dass die zugehörige Formulierung lediglich durch eine Lektüre des Codes zu verstehen ist. Wie geht es weiter? Implementierung und Tests auf zunächst kleinen Datensätzen Falls Sie das Modell nicht bereits im letzten Schritt implementiert haben, so machen Sie das bitte jetzt und nutzen Sie die Gelegenheit, um direkt kleine Tests zu formulieren. Das Testen einer Software ist ein riesiges Gebiet der Softwareentwicklung, das in der Modellentwicklung bisher zu wenig Aufmerksamkeit findet. Suchen oder erdenken Sie sich bitte kleine Datensätze und überlegen sich vor dem Starten des Optimierungslaufs, welches Ergebnis Sie erwarten. Vergleichen Sie nun Ihre Erwartung mit dem Ergebnis und passen Sie entweder Ihre Erwartungshaltung an oder finden Sie den Fehler in der Modellformulierung. Der entscheidende Punkt ist nun, dass Sie diese Testfälle idealerweise nicht wegschmeißen, sondern aufbewahren, um regelmäßig Ihr Modell verschiedenen Tests zu unterziehen. Wer garantiert Ihnen sonst, dass Sie nicht beim Beheben eines Fehlers vielleicht einen neuen Fehler einbauen? Das Entwicklungsprinzip test driven development wird nicht Teil dieses Buches sein, aber sei an dieser Stelle für weiterführende Recherche erwähnt. Frühes Feedback einholen Präsentieren Sie Ihr Modell und erste Ergebnisse früh Ihrer Auftraggeberin. Dies ermöglicht es Ihnen, frühzeitig auf Missverständnisse und überraschende Entwicklungen reagieren zu können. Vielleicht sind Ihre Entscheidungsvariablen doch nicht frei wählbar, die Grenzen waren zu optimistisch oder pessimistisch gesetzt oder

200

8

Optimierungsmodelle in der Praxis

sonstige Elemente bedürfen einer Nacharbeitung. Außerdem ist das eine tolle Gelegenheit, um weitere Testfälle zu sammeln, für die idealerweise direkt auch die Erwartungshaltungen formuliert werden. Arbeit mit großen Datensätzen und Plausibilitätschecks Nun ist der Zeitpunkt gekommen, ihr Modell auf die volle Problemgröße loszulassen. Die erste spannende Frage ist natürlich, ob die Rechenzeit tolerierbar und die Problemformulierung konsistent ist, d. h. keine sich widersprechenden Nebenbedingungen enthält. Falls nein, lohnt sich vielleicht ein Blick in Abschn. 7.3. Falls ja, sind die Ergebnisse auf den ersten Blick oft schwer konsumierbar. Wer sieht schon auf die Schnelle, ob die Belegung tausender Entscheidungsvariablen plausibel aussieht. Es empfiehlt sich also, schnellstmöglich mit dem Aufbau vieler Plausibilitätschecks zu beginnen. Dies können Tests sein, wie in vorherigen Abschnitten besprochen, dürfen aber auch gern visualisierende Tools sein, die Ihnen helfen, Licht in das Dunkel zu bringen. Pre- und Postprocessing In der Vor- und Nachverarbeitung von Daten im Optimierungskontext geht es darum, klassische Fehler in Daten a priori zu erkennen und zu beheben und Optimierungsergebnisse auf die Weiterverarbeitung vorzubereiten. Vielleicht möchten Sie Ergebnisdaten für Folgesysteme aggregiert darstellen oder bereits Visualisierungen der Daten vornehmen. Je mehr Sie sich in Richtung einer Fully-Fledged-Solution aus Abschn. 8.1.1 bewegen, desto wichtiger werden diese Schritte, um eine nahtlose weitgehend automatisierte Einbindung in Ihre Datenpipeline zu gewährleisten. Wann bin ich fertig? Nun, die obigen Schritte wiederholen Sie nun in einer wilden Reihenfolge, bis entweder Ihr Ziel erfüllt oder das Budget für Ihr Projekt aufgebraucht ist.

8.3

Heuristiken

Wenn Sie auf ein Problem stoßen, bei dem Sie nicht zwangsläufig die optimale Lösung berechnen müssen, sondern Ihnen ein guter zulässiger Punkt ausreicht, könnten Heuristiken für Sie interessant sein.

8.3.1

Was sind Heuristiken?

Lassen Sie uns kurz einen Blick in die englische Wikipedia Definition einer Heuristik werfen. Definition 8.3.1 In mathematical optimization and computer science, heuristic [...] is a technique designed for solving a problem more quickly when classic methods

8.3 Heuristiken

201

are too slow for finding an approximate solution, or when classic methods fail to find any exact solution. This is achieved by trading optimality, completeness, accuracy, or precision for speed. [...] Die bisher besprochenen Lösungsmethoden, wie Simplex-Verfahren oder Branchand-Bound sind Verfahren, die Ihnen garantieren können, dass der berechnete Optimalpunkt auch global optimal ist, d. h. es keinen besseren Punkt als den berechneten geben kann. Heuristiken können Ihnen ein solches Optimalitätszertifikat nicht liefern. Stattdessen ist die Hoffnung, dass eine Heuristik in kurzer Zeit einen guten zulässigen Punkt berechnet. Beispiel: Greedy-Verfahren für das Traveling Salesman Problem Wir betrachten ein TSP mit N = 4 Städten v1 , . . . , v4 . Die Entfernung b zwischen vi und v j entspricht dem Eintrag di, j der Distanzmatrix D = (di, j ), die gegeben ist durch ⎛ ⎞ 0 10 7 8 ⎜10 0 3 4⎟ ⎟ D = ⎜ ⎝ 7 3 0 2⎠ . 8 4 20 Der Abstand zwischen den Städten v1 und v3 ist beispielsweise d1,3 = 7. Die Idee des Greedy-Verfahrens besteht darin, in jeder Iteration die größtmögliche Verbesserung der Zielfunktion zu erreichen. Angewandt auf das TSP, möchten wir ausgehend von einem Startpunkt immer das nächstgelegene Reiseziel auswählen und hoffen, mit dieser kurzfristigen Betrachtungsweise global eine gute Route zu berechnen. Wie sieht das hier aus? Ausgehend von v1 überprüfen Sie, in der ersten Zeile von D, welche die nächstgelegene Stadt ist, und landen bei v3 , die 7 Distanzeinheiten von v1 entfernt liegt. Die Städte v2 und v4 sind mit 10 bzw. 8 jeweils weiter entfernt von v1 . Nun gut, Sie reisen also von v1 nach v3 . Wie geht es weiter? Von v3 aus entscheiden Sie sich gemäß den Informationen in der dritten Zeile von D für die Stadt v4 , die 2 Einheiten entfernt liegt. Von v4 aus würden Sie am liebsten nach v3 reisen, da Sie v3 aber schon besucht haben und eine Rundreise planen, besuchen Sie als nächstes v2 zu den Kosten von 4 und beenden Ihre Rundreise wieder in der Stadt v1 , die für die Kosten von 10 erreichbar ist. Die gesamte Route lautet also v1 → v3 → v4 → v2 → v1 und hat die Länge 7 + 2 + 4 + 10 = 23. Wenn Sie sich nun jedoch die Mühe machen, die exakte Lösung des TSPs unter Verwendung des Modells in Abschn. 7.2 zu berechnen, so werden Sie feststellen, dass die optimale Route v1 → v 3 → v 2 → v 4 → v 1

202

8

Optimierungsmodelle in der Praxis

die Länge 22 besitzt, was ein Beispiel für die mögliche Suboptimalität einer Heuristik gibt.

8.3.2

Heuristiken und Metaheuristiken

Wir unterscheiden zwischen Heuristiken und Metaheuristiken. Während Heuristiken in der Regel problemspezifische Informationen ausnutzen, um eine approximative Lösung des Problems zu berechnen, sind Metaheuristiken allgemeinerer Natur und möchten gute Punkte für allgemeine Klassen von Optimierungsproblemen berechnen. Ein einfaches Beispiel für eine klassische Heuristik ist das Greedy-Verfahren im letzten Abschnitt, das in diesem Fall auf das TSP zugeschnitten wurde. Metaheuristiken hingegen sind anwendungsagnostisch. Die prominentesten Vertreter sind genetische Algorithmen, Particle-Swarm-Methoden, Evolutionäre Verfahren sowie Simulated-Annealing. Oft sind die Algorithmen motiviert durch physikalische oder biologische Prozesse wie dem Abkühlen in der Metallurgie oder dem Verhalten von Bienenschwärmen. Eine hervorragende Python-Implementierung vieler Metaheuristiken bietet https://pymoo.org/.

8.3.3

Wann sollten Sie Heuristiken einsetzen (und wann nicht)?

Der Einsatz von Heuristiken bietet sich unter anderem in folgenden Fällen an. Eine Negation der Fälle gibt Ihnen dementsprechend ein Indiz dafür, lieber klassische Verfahren zu verwenden. • Für Ihren Anwendungsfall spielt globale Optimalität keine Rolle und sie wollen lediglich verhältnismäßig schnell gute zulässige Punkte bestimmen. • Die Constraint-Struktur Ihres Problems ist nicht kompliziert. Insbesondere der Umgang mit kombinatorischen Restriktionen, d. h. Nebenbedingungen, deren Kern aus Binärvariablen besteht, ist eine Wissenschaft für sich, die in MIP-Solvern in der Regel deutlich besser umgesetzt ist als in Metaheuristiken. Lineare kontinuierliche Constraints sind in der Regel auch von Heuristiken gut zu handhaben. Wird es jedoch komplizierter, müssen Sie hier zumindest einige Arbeit investieren mit leider ungewissem Ausgang. • Sie können oder wollen das Problem nicht mathematisch sauber formulieren. Dafür gibt es viele Gründe. Heuristiken sind relativ einfach zu implementieren und oft nah an der Denkweise von Softwareentwicklern, welche keine vertiefte Erfahrung mit der Formulierung mathematischer Optimierungsmodelle haben. Selbst wenn Sie jedoch über die entsprechende Vorbildung verfügen, enthält das zu optimierende Modell vielleicht Black-Box-Funktionen wie Simulationen oder ist einfach nur sehr, sehr kompliziert. Generell ist die Entscheidungslage natürlich deutlich komplizierter als hier umrissen und obliegt wie immer den persönlichen Präferenzen der zuständigen Modelliererin.

Literatur

1. Beck, A. Introduction to nonlinear optimization: Theory, algorithms, and applications with MATLAB. SIAM, 2014. 2. Bertsimas, D. und Dunn, J. Machine Learning Under a Modern Optimization Lens. Dynamic Ideas LLC, 2019. 3. Bertsimas, D. und Tsitsiklis, J. N. Introduction to linear optimization. Bd. 6. Athena Scientific Belmont, MA, 1997. 4. Bixby, R. E. „A brief history of linear and mixed-integer programming computation“. In: Documenta Mathematica 2012 (2012), S. 107–121. 5. Blank, J. und Deb, K. „ Pymoo: Multi-objective optimization in python“. In: IEEE Access 8 (2020), S. 89497–89509. 6. Boyd, S., Boyd, S. P. und Vandenberghe, L. Convex optimization. Cambridge university press, 2004. 7. Cortez, P., Cerdeira, A., Almeida, F., Matos, T. und Reis, J. „Modeling wine preferences by data mining from physicochemical properties“. In: Decision Support Systems 47.4 (1998), S. 547–553. 8. Dantzig, G. Linear programming and extensions. Princeton university press, 2016. 9. Ehrgott, M. Multicriteria optimization. Bd. 491. Springer Science & Business Media, 2005. 10. Floudas, C. A. Deterministic global optimization: theory, methods and applications. Bd. 37. Springer Science & Business Media, 2013. 11. Horst, R. und Tuy, H. Global optimization: Deterministic approaches. Springer Science & Business Media, 2013. 12. Hürlimann, T. Mathematical Modeling, Case Studies II. Departement of Informatics, University of Fribourg, 2020. 13. Hürlimann, T. Puzzles and Games: A Mathematical Modeling Approach. Departement of Informatics, University of Fribourg, 2020. 14. Hürlimann, T. Mathematical Modeling, Case Studies I. Departement of Informatics, University of Fribourg, 2021. 15. James, G., Witten, D., Hastie, T. und Tibshirani, R. An introduction to statistical learning. Bd. 112. Springer, 2013. 16. Kallrath, J. Gemischt-ganzzahlige Optimierung: Modellierung in der Praxis. Springer Vieweg Wiesbaden, 2012. 17. Khachiyan, L. „A polynomial algorithm in linear programming (in Russian)“. In: Doklady Akademii Nauk SSSR 244 (1979), S. 1094–1096.

© Der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 N. Sudermann-Merx, Einführung in Optimierungsmodelle, https://doi.org/10.1007/978-3-662-67381-2

203

204

Literatur

18. Klee, V. und Minty, G. J. „How good is the simplex algorithm“. In: Inequalities 3.3 (1972), S. 159–175. 19. Nocedal, J. und Wright, S. J. Numerical Optimization. 2. Aufl. Springer New York 2006. 20. Parikh, N. und Boyd, S. „Proximal algorithms“. In: Foundations and Trends in optimization 1.3 (2014), S. 127–239. 21. Rockafellar, R., Wets, M. und Wets, R. Variational Analysis. Grundlehren der mathematischen Wissenschaften. Springer Berlin Heidelberg, 2009. 22. Stein, O. Grundzüge der Parametrischen Optimierung. Springer Spektrum, 2020. 23. Stein, O. Grundzüge der Globalen Optimierung. Springer Spektrum, 2021. 24. Sudermann-Merx, N. und Rebennack, S. „Leveraged least trimmed absolute deviations“. In: OR Spectrum 43 (2021), S. 809–834. 25. Tawarmalani, M. und Sahinidis, N. V. Convexification and global optimization in continuous and mixed-integer nonlinear programming: theory, algorithms, software, and applications. Bd. 65. Springer Science & Business Media, 2013. 26. Thebelt, A., Kronqvist, J., Mistry, M., Lee, R. M., Sudermann-Merx, N. und Misener, R. „ENTMOOT: a framework for optimization over ensemble tree models“. In: Computers & Chemical Engineering 151 (2021), S. 107343. 27. Van den Bergh, K., Bruninx, K., Delarue, E. und D’haeseleer, W. „A mixedinteger linear formulation of the unit commitment problem“. In: KU Leuven, TME working paper (2014). 28. Weisberg, S. Applied linear regression. Bd. 528. John Wiley & Sons, 2005. 29. Williams, H. P. Model Building in Mathematical Programming. Wiley, 2013. 30. Wolsey, L. A. Integer programming. John Wiley & Sons, 2020. 31. Ziegler, G. Lectures on Polytopes. Graduate Texts in Mathematics. Springer New York, 2012.

Sachverzeichnis

B Big-M, 98 C Constraints, 6 D Dualität schwache, 74 starke, 74

G Gewichtete-Summe-Ansatz, 185 Gradient, 21 Graph, 187 gerichteter, 187 ungerichteter, 187 Greedy-Verfahren, 201 H Heuristik, 200 Meta-, 202

E Eckensatz, 75 Einhüllende, 161 Entscheidungsvariable, 6 binäre, 7 ganzzahlige, 7 kontinuierliche, 7 Epigraph, 25 Epigraphformulierung, 80

I Indexmenge, 7 Innere-Punkte-Verfahren, 78

F Funktion affin-lineare, 70 konkave, 26 konvexe, 25 lineare, 70 nichtlineare, 70 quadratische, 17 separable, 164 streng monoton steigende, 41

M Matrix positiv semi-definite, 28 transponierte, 19 Maximum, 9 Mehrzieloptimierung, 178 Menge abgeschlossene, 14 konvexe, 23 offene, 14

K Kontinuierliche Relaxierung, 95 Konvexität konvexe Funktion, 25 konvexe Menge, 23 Konvexkombination, 24

© Der/die Autor(en), exklusiv lizenziert an Springer-Verlag GmbH, DE, ein Teil von Springer Nature 2023 N. Sudermann-Merx, Einführung in Optimierungsmodelle, https://doi.org/10.1007/978-3-662-67381-2

205

206 zulässige, 6 Metrik, 47 Minimum, 9 N Nebenbedingungen, 6 Netzwerk, 187 Nichtdominiertheit, 184 no-good cut, 115 Norm euklidsche, 50 Mannhattan-, 47 O Optimalpunkt, 8 Optimalwert, 8 Optimierung, hierarchische, 186 Optimierungsmodell gemischt-ganzzahliges lineares, 93 infeasible, 12, 175 inkonsistentes, 12, 175 lineares, 67 multikriterielles, 184 restringiertes, 6 unrestringiertes, 6 unrestringiertes quadratisches, 35 Optimierungsproblem duales, 73 primales, 73 P Pareto -Front, 184 -Optimum, 184 Polyeder, 71 Polygonzug, 164 Polytop, 71 Projektion, 48

Sachverzeichnis Punkt effizienter, 184 kritischer, 37 optimaler, 8 zulässiger, 6 R Reduced Costs, 192 Restriktion Gleichungsrestriktion, 68 Ungleichungsrestriktion, 68 S Schattenpreis, 191 Schranke obere, 68 untere, 68 Second-Order-Cone, 146 rotated, 146 Simplex-Verfahren, 76 Stützpunkt, 164 stelle, 164 wert, 164 T Tangentialebene, 163 Transformation streng monoton steigende, 41 V Vektor Nullvektor, 38 Spaltenvektor, 19 Zeilenvektor, 19 Z Zielfunktion, 6