Sie sind auf Seite 1von 2

Institut für Mathematische Optimierung TU Braunschweig

Fortgeschrittenen-Praktikum Optimierung
Prof. Dr. Marc Pfetsch SS 2010
Dipl.-Math. Oec. Andreas Tillmann 08.04.2010

1. Programmieraufgabe
Instanzen einlesen und aufbereiten

Implementieren Sie den in der Vorlesung vorgestellten Preprocessing-Algorithmus. Schreiben


Sie dazu ein C-Programm, indem Sie die folgenden Teilaufgaben umsetzen:

Teilaufgabe 1: (15 Punkte)

Schreiben Sie eine Funktion ReadData, die eine RSP-Instanz aus einer Datei einliest, in der
die (allesamt ganzzahligen) Instanzdaten in folgendem Format gegeben sind:

C
n
w1 p1
w2 p2
.. ..
. .
wn pn

Alle Zahlen sollen in Variablen vom Typ int gespeichert werden. Definieren Sie dazu eine pas-
send aufgebaute Datenstruktur struct instance, welche alle notwendigen Daten aufnehmen
kann.Der Speicherplatz soll dynamisch (d. h. über malloc oder calloc) angefordert und später
auch wieder (über free) freigeben werden. Der Dateiname soll nicht fest im Code verankert,
sondern direkt beim Programmaufruf als Kommandozeilenargument übergeben werden. Ist
n ≤ 0, dann soll das Programm mit einer entsprechenden Meldung abbrechen.

Teilaufgabe 2: (40 Punkte)

Schreiben Sie eine Funktion Preprocessing, welche sicherstellt, dass die „stehenden Annah-
men” aus der Vorlesung erfüllt sind, und die Instanzgröße – falls möglich – geeignet verringert.
Zusätzlich zum Verfahren aus der Vorlesung (außer Schritt 1) sollen folgende Aspekte dabei
berücksichtigt werden:

• Die Funktion soll (einen Zeiger auf) die neu erzeugte (Residual-)Instanz, zurückgeben.
• Bei Abbruch des Preprocessing in Schritt 5 (bei negativer Residualkapazität) soll der
NULL-Zeiger zurückgegeben werden und durch eine dementsprechende Abfrage im Haupt-
programm der Abbruch des ganzen Programms erfolgen.
• Abschließend sollen die Anzahl im Preprocessing auf 1 bzw. auf 0 fixierter Variablen,
Gesamtnutzen und -gewicht bereits eingepackter Objekte sowie die Residualkapazität
von der Funktion auf den Bildschirm ausgegeben werden.

Teilaufgabe 3: (20 Punkte)

Schreiben Sie eine Funktion TransformSolution, welche aus der Lösung des Residualproblems
die Lösung der ursprünglichen Instanz erzeugt bzw. vervollständigt (z. B. die noch fehlenden
Einträge (x∗j mit j ∈ J = (J − ∪ J + ) \ J0y ) durch passende Rücktransformation der Residuallö-
sung auffüllt).
Teilaufgabe 4: (15 Punkte)

Testen Sie Ihr Programm mit den auf der Homepage der Veranstaltung zur Verfügung gestell-
ten Instanzen. Da Sie noch kein Lösungsverfahren zur Hand haben, testen Sie Ihre Funktion
aus Teilaufgabe 3, indem Sie ihr den Vektor y ≡ 0 als „Lösung” des Residualproblems überge-
ben. Erzeugen Sie eine Bildschirmausgabe mit dem Zielfunktionswert, dem Gesamtgewicht der
eingepackten Objekte der ursprünglichen Instanz sowie den Indizes (bzw. Nummern) dieser
Objekte.

Teilaufgabe 5: (10 Punkte)

Kommentieren Sie Ihr Programm sinnvoll und ausreichend – als Richtlinie kann hier gelten,
dass ein Außenstehender den Programmcode verstehen und anhand der Kommentare nach-
vollziehen können sollte. Alle Dateien, die Sie abgeben, sollten im Dateinamen Ihre jeweiligen
Nachnamen enthalten, um sie besser zuordnen zu können.

Abgabe per E-Mail an Andreas Tillmann (a.tillmann@tu-bs.de)


und Jan Golz (jangolz@web.de) bis Dienstag, 20.04.10, 12 Uhr