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

Documents pareils