             
             
             
             Praktikum zur Objektorientierten Programmierung / 1

       
       Bearbeitungszeit: Drei Praktikumstermine
       
       Thema: Das  n|2||Cmax - Problem  (Buchbinderproblem)

       
       Inhalt dieser Aufgabe ist eine Eiffel-Implementierung des Johnson-Al-
       gorithmus fr das Buchbinderproblem, wie er in der Vorlesung beschrie-
       ben wurde.
       
       [ Es ist Ihnen freigestellt, auch andere OBJEKT-orientierte Program-
       miersprachen zu benutzen. Auf jeden Fall sollte sich Ihr Programm aber
       an der im folgenden angegebenen Klassenhierarchie orientieren. ]

       Kern des Johnson-Algorithmus ist die Sortierung der  n  gegebenen Jobs 
       gem der in der Vorlesung angegebenen Priorittsregel.
       Implementierung dieser Sortier-Prozedur ist nicht Teil der Aufgabe. 
       Sie knnen die in Eiffel/S enthaltene Prozedur  sort  aus der Klasse  
       SORTER  benutzen, mit der ein Feld der Lnge  n  in Rechenzeit  
       O(n*log n)  sortiert wird.

       
       Ihr Programm sollte die folgenden Klassen enthalten:
       
       Eine Klasse  IO , die von  BASIC_IO  erbt und die dort fehlenden 
       features  get_int  und  get_ real  implementiert.

       Eine Klasse  JOB , die von  ORDER  erbt. Die Klasse  JOB  reprsen-
       tiert die Jobs des n|2||Cmax - Problems und implementiert ferner die 
       Priorittsregel des Johnson-Algorithmus.

       Eine Klasse  JOHNSON , die die Prozeduren fr die einzelnen Aktionen 
       des Programms implementiert:
       - Daten einlesen
       - Daten zeigen
       - optimale Reihenfolge berechnen
       - Zielfunktionswert berechnen 


       Bei der Implementierung der features  get_int  und  get_real  kann man
       sich der in  BASIC_IO  vorhandenen Prozedur  get_string  bedienen und 
       ferner der Prozeduren  s2i , s2r  aus der Klasse  FORMAT , mit denen
       strings in Integers bzw. Reals umgewandelt werden.


       Die Klasse  JOB  sollte die folgenden features enthalten:
       - Jobnummer
       - Dauer auf Maschine 1  (ganzzahlig)
       - Dauer auf Maschine 2  (ganzzahlig)
       - Implementierung der Priorittsregel
       
       Fr die Implementierung der Priorittsregel ist eine Erluterung ange-
       bracht:
       Seien  J1  und  J2  zwei Jobs  und seien  dur1  bzw.  dur2  die Bear-
       beitungszeiten auf Maschine 1 bzw. Maschine 2.
       Dann kann die Priorittsregel der Vorlesung folgendermaen ausgedrckt 
       werden (man mache sich klar, warum das so ist):

       J1  kommt vor  J2 , wenn
                 min (J1.dur1, J2.dur2)  <  min (J1.dur2, J2.dur1)
       
       Die letzte Ungleichung zeigt, wie der in  ORDER  aufgeschobene Opera-
       tor  <  in der erbenden Klasse  JOB  zu definieren ist.

       Da Minima zu berechnen sind, empfiehlt es sich, eine Funktion zu 
       schreiben, die das Minimum von zwei ganzen Zahlen berechnet.


       Die Sortierprozedur von Eiffel/S hat die folgende Signatur:
             sort (arr : ARRAY [G], lower, upper : INTEGER) is  ...
       Die Prozedur  sort  sortiert also Arrays.
       Es ist daher erforderlich, ein Array zu deklarieren und die Einlese-
       prozedur so zu organisieren, da sie die Daten in das Array einliest.

       Die Prozedur  "Daten zeigen"  ist lediglich zur Kontrolle der einge-
       lesenen Daten gedacht. 

       Die Prozedur "Optimale Reihenfolge berechnen" reduziert sich auf den
       Aufruf der Prozedur  sort .

       Bei der Berechnung des Zielfunktionswertes sollte man vorgehen wie in
       der Vorlesung beschrieben. Weil dabei Maxima zu berechnen sind, ist
       eine Funktion ntzlich, die das Maximum von zwei ganzen Zahlen berech-
       net.

       
       Wenn Sie die Prozedur  " Zielfunktionswert berechnen"  sowohl auf die
       Startreihenfolge als auch auf die optimale Reihenfolge anwenden, so
       gibt Ihnen dies Auskunft ber die vom Johnson-Algorithmus erzielte Ver-
       besserung.


       Man teste das Programm an selbstgewhlten Beispielen und an dem in der
       Vorlesung untersuchten Datensatz.

