Praktikum1 - Technische Universität Kaiserslautern
Transcription
Praktikum1 - Technische Universität Kaiserslautern
Technische Universität Kaiserslautern Prof. Dr. Sven O. Krumke Dr. Sabine Büttner M.Sc. 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 = containers.Map() 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 xj durch x+ j − xj mit xj , xj ≥ 0 ersetzt. Wird xj ersetzt, so soll x+ j den Platz von xj einnehmen. 1 Im containers.Map() Objekt xmap sollen die Indizes der Partnervariablen“ ” gespeichert werden. Wird also beim Bearbeiten der freien Variablen xj eine neue Variable xp 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 xj 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 ∈ Rn neu wie folgt in eine Lösung des Originalproblems im Rn 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_wrapper.m herunterladen, welche einen einfachen Rahmen für die Aufgabe bietet. In Anhang C haben wir kurze Informationen zu containers.Map() in Matlab zusammengestellt. Abgabe: Bitte senden Sie die Datei bis spätestens Dienstag den 12.05.15 an [email protected]. Schreiben Sie außerdem Ihren Namen als Kommentar in jede von Ihnen verfasste Datei. 2 A Datenformat Eine Datei LP.dat zur Spezifikation eines Linearen Programms (1a) min (c1 , . . . , cn )T x (1b) a11 x1 + a12 x2 + · · · + a1n xn relop1 b1 (1c) (1d) a21 x1 + a22 x2 + · · · + a2n xn .. . relop2 .. . b2 .. . (1e) am1 x1 + am2 x2 + · · · + amn xn relop1 bm (1f) xj ≥ 0 für j ∈ J ⊆ {1, . . . , n} mit relopi ∈ {=, ≤, ≥} für i = 1, . . . , m hat die folgende Struktur: n a11 a21 .. . m a12 a22 .. . ... ... .. . am1 b1 op1 c1 f1 am2 ... ... c2 f2 ... amn bm opm ... cn ... fn a1n a2n .. . Dabei besteht zwischen relopi und opi die folgende Beziehung: relopi opi ≤ = ≥ -1 0 1 Die Werte fj ∈ {0, 1} gebe an, ob eine Variable xj 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, d.h. falls xj vorzeichenbeschränkt ist fj = 0, sonst. Das Alkohol-Mininmierungsproblem für Simple Ex aus der Vorlesung min 4x1 + 2x2 + 2x1 + x2 + 2x3 = 3 2x2 + x3 = 2 x1 ≥ 0 x2 ≥ 0 hat dann die Eingabedatei: 3 3x3 x3 ≥ 0 3 2 0 3 0 4 1 2 1 2 2 0 2 1 2 1 3 1 Auf der Website finden Sie diese Datei unter dem Namen SimpleEx.dat, sowie eine weitere Beispieldatei (Beispiel1.dat). 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, d.h. 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 containers.Map In Matlab bietet containers.Map 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 = containers.Map(’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 containers.Map eine ausführliche Hilfe bekommen. 5