Technische Universität Kaiserslautern Prof Dr Sven O Krumke Dr Sabine Büttner MSc Marco Natale Praktische Mathematik: Lineare und Netzwerk-Optimierung (SS 2015) Praktikumsaufgaben Aufgabe 1 (Konvertieren eines LPs in Standardform) Schreiben Sie eine Matlab Funktion, welche die Daten eines LPs mit Gleichungen, Ungleichungen und eventuell freien Variablen in Standardform konvertiert Ihre Implementierung soll dabei als Hauptprozedur folgende Funktion besitzen: function [A,b,c,xmap,slack,doubled] = Convert2Standard(A,b,c,op,bounded) Konvertiert ein LP in allgemeiner Form in ein LP in Standardform Eingabe: A = m x n Matrix, welche die Nebenbedingungen beschreibt b = m x 1 Vektor auf der rechten Seite c = n x 1 Vektor der Zielfunktion op = m x 1 Vektor der relationalen Operatoren zur rechten Seite -1: <= 0: = 1: >= bounded = n x 1 Vektor der Vorzeichenbeschränkungen der Variablen 0: Variable ist freie Variable 1: Variable ist vorzeichenbeschränkt Ausgabe: A = aktualisierte Matrix, die auch Spalten für die neuen Variablen enthält b = m x 1 Vektor auf der rechten Seite c = aktualisierter Vektor der Zielfunktion, der auch Einträge für die neuen Variablen enthält xmap = containersmap() Objekt, das für jede ursprünglich freie Variabe x(j) den Index k=xmap(j) der zugehörigen zweiten Variablen enthält Falls x(j) eine Schlupf-/Überschussvariable ist, dann ist xmap(j)=0 slack = Anzahl der hinzugefügten Schlupf-/Überschussvariablen doubled = Anzahl der freien Variablen x die durch x^+ - x^- ersetzt wurden Ihre Funktion soll dabei für die freien Variablen die einfachste Variante wählen, indem sie eine freie Variable x j durch x + j x j mit x + j, x j 0 ersetzt Wird x j ersetzt, so soll x + j den Platz von x j einnehmen 1
Im containersmap() Objekt xmap sollen die Indizes der Partnervariablen gespeichert werden Wird also beim Bearbeiten der freien Variablen x j eine neue Variable x p generiert, die den negativen Teil beschreibt, so soll xmap(j)=p und xmap(p)=j gesetzt werden Zusätzlich soll für die hinzugefügten Schlupf- bzw Überschussvariablen x j xmap(j)=0 gesetzt werden Damit lässt sich dann zum Schluss erkennen, ob eine Variable eine ursprüngliche Variable ist und, falls sie eine neue Variable ist, ob sie eine Schlupf-/Überschussvariable oder eine Variable der Form x j ist Seien n_original und n_neu die Anzahl der Variablen vor bzw nach der Transformation Dann kann man eine Lösung x R n neu wie folgt in eine Lösung des Originalproblems im R n original zurückrechnen und ausgeben: for i=1:n_original if (bounded(i)==1) Variable x(i) ist eine Variable des ursprünglichen Problems fprintf ( x(d) = f\n, i,x(i)); else Die Variable ist eine freie Variable Der Index der ursprünglichen freien Variablen ist in xmap(i) gespeichert fprintf ( x(d) = f\n, i,x(i)-x(xmap(i))); end end In Anhang A ist das Eingabeformat für die Daten angegeben Zum Einlesen der Daten stellen wir Ihnen die Matlab-Funktion function [A,b,c,op,bounded] = ReadLP(filename) zur Verfügung, die Sie auf der Webseite zur Vorlesung herunterladen können Die Details zu dieser Funktion sind in Anhang B aufgeführt Weiterhin können Sie von der Webseite zur Vorlesung die Datei Simplex1_wrapperm herunterladen, welche einen einfachen Rahmen für die Aufgabe bietet In Anhang C haben wir kurze Informationen zu containersmap() in Matlab zusammengestellt Abgabe: Bitte senden Sie die Datei bis spätestens Dienstag den 120515 an natale@mathematikuni-klde Schreiben Sie außerdem Ihren Namen als Kommentar in jede von Ihnen verfasste Datei 2
A Datenformat Eine Datei LPdat zur Spezifikation eines Linearen Programms (1a) (1b) (1c) (1d) (1e) (1f) min (c 1,, c n ) T x a 11 x 1 + a 12 x 2 + + a 1n x n relop 1 b 1 a 21 x 1 + a 22 x 2 + + a 2n x n relop 2 b 2 a m1 x 1 + a m2 x 2 + + a mn x n relop 1 b m x j 0 für j J {1,, n} mit relop i {=,, } für i = 1,, m hat die folgende Struktur: n m a 11 a 12 a 1n a 21 a 22 a 2n a m1 a m2 a mn b 1 b m op 1 op m c 1 c 2 c n f 1 f 2 f n Dabei besteht zwischen relop i und op i die folgende Beziehung: relop i op i -1 = 0 1 Die Werte f j {0, 1} gebe an, ob eine Variable x j vorzeichenbeschränkt ist Für das LP gemäß (1) mit der Menge J {1,, n} der vorzeichenbeschränkten Variablen wie in (1f) haben wir { 1, falls j J, dh falls x j vorzeichenbeschränkt ist f j = 0, sonst Das Alkohol-Mininmierungsproblem für Simple Ex aus der Vorlesung hat dann die Eingabedatei: min 4x 1 + 2x 2 + 3x 3 2x 1 + x 2 + 2x 3 = 3 2x 2 + x 3 = 2 x 1 0 x 2 0 x 3 0 3
3 2 2 1 2 0 2 1 3 2 0 0 4 2 3 1 1 1 Auf der Website finden Sie diese Datei unter dem Namen SimpleExdat, sowie eine weitere Beispieldatei (Beispiel1dat) B Einlesen von LPs mittels ReadLP Das Einlesen von Daten für ein Lineares Programm aus einer Datei mit dem in Anhang A beschriebenen Datenformat kann mit der folgenden Funktion erfolgen, die wir auf der Webseite zur Vorlesung zur Verfügung stellen: function [A,b,c,op,bounded] = ReadLP(filename) Liest die Daten für ein Lineares Programm aus einer Textdatei ein ACHTUNG: Diese Funktion ist nicht sehr robust, dh sie erwartet das in den Praktikumsangaben beschriebenen Format Eingabe: filename = Dateiname Ausgabe: A = m x n Matrix, welche die Nebenbedingungen beschreibt b = m x 1 Vektor auf der rechten Seite c = n x 1 Vektor der Zielfunktion op = m x 1 Vektor der relationalen Operatoren zur rechten Seite -1: <= 0: = 1: >= bounded = n x 1 Vektor der Vorzeichenbeschränkungen der Variablen 0: Variable ist freie Variable 1: Variable ist vorzeichenbeschränkt C Matlab Objekte containersmap In Matlab bietet containersmap eine einfache Möglichkeit, Abbildungen (genauer gesagt, Hash-Maps) zu erstellen Für die Praktikumsaufgabe benötigen wir nur eine Abbildung von ganzen Zahlen in die ganzen Zahlen Eine solche Abbildung xmap erstellt man (als leeres Objekt) zunächst mittels: xmap = containersmap( KeyType, int64, ValueType, int64 ); 4
Dann kann man in naheliegender Weise durch xmap(r) = s dem Schlüsselwert r den Wert s zuweisen Mit der Hilfefunktion in Matlab kann mann durch help containersmap eine ausführliche Hilfe bekommen 5