Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • p.anaguano/informatik2022
  • a.engelke/informatik2022
  • p.schleinzer/informatik2022
  • n.rosenkranz/informatik2022
  • w.weber/informatik2022
  • xuhao.zhang/informatik2022
  • h.el-menuawy/informatik2022
  • saifalla.ibrahim/informatik2022
  • d.krause/informatik2022
  • p.schilling/informatik2022
  • j.tolke/informatik2022
  • f.luckau/informatik2022
  • danish.ahmad/informatik2022
  • emir.sagdani/informatik2022
  • d.griedel/informatik2022
  • j.mahnke/informatik2022
  • l.poehler/informatik2022
  • christoph.wrede/informatik2022
  • y.kummert/informatik2022
  • alexander.reisch/informatik2022
  • t.dickel/informatik2022
  • ni.petersen/informatik2022
  • markus.werner/informatik2022
  • s.mouammar/informatik2022
  • j.jahns/informatik2022
  • m.figueroa-castillo/informatik2022
  • b.hannan/informatik2022
  • v.lapschiess/informatik2022
  • j.hegner/informatik2022
  • g.paraschiv/informatik2022
  • e.abkaimov/informatik2022
  • l.krogmann/informatik2022
  • d.mizyed/informatik2022
  • h.almasri/informatik2022
  • a.mickan/informatik2022
  • f.shikh-alshabab/informatik2022
  • j.feldbausch/informatik2022
  • l.abdel-kader/informatik2022
  • jan.seibt/informatik2022
  • e.goekmen/informatik2022
  • nathanael.schenk/informatik2022
  • r.reksius/informatik2022
  • edmont.schulze/informatik2022
  • a.singh/informatik2022
  • p.christensen/informatik2022
  • m.woidt/informatik2022
46 results
Show changes
Showing
with 3076 additions and 0 deletions
%% Cell type:markdown id:ca8d90cf tags:
# <font color='blue'>**Übung 2 - Anwendung von Datenstrukturen (Fortsetzung)**</font>
## <font color='blue'>**Problemstellung: Auftragsverwaltung einer Fertigungsmaschine**</font>
### <font color='blue'>**Problembeschreibung**</font>
Es soll eine Datenstruktur zur Verwaltung von Aufträgen für CNC-Fertigungsmaschinen implementiert werden. Hierbei soll jedoch nicht ein First-in-first-out (FIFO) Prinzip verwendet werden, sondern es soll möglich sein, Aufträge zu priorisieren. Die Aufträge sollen folgende Elemente enthalten:
* Name
* Stückzahl
* Materialart
* Materialmenge pro Stück
* Dauer pro Stück<br>
* Priorität<br>
Die ````__init()__````- Methode soll prüfen, dass bei den Zahlenwerten nur positive Werte eingegeben werden.
Die Maschine soll Aufträge annehmen und bearbeiten können. Bei der Bearbeitung eines soll zur Kontrolle eine Textausgabe ausgeben, welcher Auftrag ausgeführt wurde, und wie viel Zeit und Material dafür benötigt wurde. Es soll eine weitere Methode geben, mit der alle verbleibenden Aufträge abgearbeitet werden.
### <font color='blue'>**Modellbildung**</font>
Das Modell besteht aus Aufträgen mit den oben genannten Informationen und der Maschine, die die Aufträge speichert, sortiert, und bei Bearbeitung eine entsprechende Statusmeldung ausgibt. Dazu werden die Material- und Zeitbedarfe mit der Stückzahl multipliziert. Die Speicherung und Sortierung wird mithilfe einer geeigneten Datenstruktur gelöst, was im Bereich "Algorithmierung" näher besprochen wird.
### <font color='blue'>**Algorithmierung**</font>
Für die Anwendung einer Vorrangwarteschlange eignet sich die Datenstruktur (Minimum-) Heap hervorragend, da wir neue Elemente hinzufügen und immer das Element mit dem niedrigsten Schlüssel entnehmen können. Wir verwenden eine Standardimplementierung mit den Methoden `insert()` und `extractMin()` zur Nutzung, sowie den internen Methoden `__init__()`,`remove()`, `exchange()` und `heapify` aus dem Grundlagennotebook. Die Algorithmen für das Hinzufügen, Entnehmen und Sortieren sind im Grundlagenteil bereits besprochen. Wir fügen der Implementierung die Methode `__len__()`hinzu, um die Anzahl der gespeicherten Elemente erhalten zu können. In der verwendeten Implementierung wird der Prioritätsschlüssel ausschließlich im Zusammenhang mit den Vergleichsoperationen `<=` und `<` ausgewertet. Es muss also dafür gesorgt werden, dass die von uns in diesem Heap gespeicherten Aufträge (Elemente) eine sinnvolle und auf die Priorität bezogene Implementierung von `<=` und `<` haben. Dann kann diese Implementierung des Heaps direkt verwendet werden.
Für die Aufträge erstellen wir zwei Klassen, um die Funktionalität für die Priorätatswarteschlange vom eigentlichen Auftrag zu trennen. Die Klasse `Auftrag` erhält somit nur einen Konstruktor `__init__()` und die Attribute, die den Auftrag beschreiben.
Die abgeleitete Klasse `PrioAuftrag` erweitert `Auftrag` um den Schlüssel `prio`, sowie die Implementierung der `<=` und `<` Operatoren mithilfe der Magic-Methoden `__le__()` und `__lt__()`. Diese Methoden erhalten das Objekt hinter dem Operator als Argument und geben als Ergebnis den Vergleich der Attribute `prio` der beiden Objekte zurück. So kann es direkt vom verwendeten Heap verarbeitet werden.
Die Klasse `Maschine` verwaltet den Heap und stellt die geforderten Methoden zur Verfügung. Die Methoden rufen die passenden Methoden des Heaps auf.
Die Struktur ist im folgenden UML-Diagramm gezeigt:
%% Cell type:markdown id:5e2c7b57 tags:
![MinHeap_Maschine.svg](Pics/MinHeap_Maschine.svg)
%% Cell type:markdown id:ea55317c tags:
### <font color='blue'>**Umsetzung**</font>
Auftrag:
%% Cell type:code id:f847f8e0 tags:
``` python
class Auftrag:
def __init__(self, name, material, materialverbrauch_pro_stueck, stueckzahl, stueckdauer):
"?"
```
%% Cell type:markdown id:e0cf1a69 tags:
PrioAuftrag ableiten:
%% Cell type:code id:d425e591 tags:
``` python
class PrioAuftrag(Auftrag):
def __init__(self, name, material, materialverbrauch_pro_stueck, stueckzahl, stueckdauer, prio):
super().__init__(name, material, materialverbrauch_pro_stueck, stueckzahl, stueckdauer) # Aufruf Basisklassenkonstruktor
"?"
def __le__(self, other):
"?"
def __lt__(self,other):
"?"
```
%% Cell type:markdown id:4b88c81b tags:
Heap (übernommen aus Grundlagen-Notebook, `__len__()` hinzugefügt):
%% Cell type:code id:3c319063 tags:
``` python
class Heap:
def __init__(self):
self.A = [] # Array/Liste
def __len__(self):
"?"
def insert(self, newNode):
self.A.append(newNode)
self.heapify(len(self.A)-1)
def extract_min(self):
x = self.A[0]
self.remove(0)
return x
def remove(self, kE):
self.exchange(kE,len(self.A)-1)
del self.A[-1]
self.heapify(kE)
def exchange(self, k1, k2):
x = self.A[k1]
self.A[k1] = self.A[k2]
self.A[k2] = x
def heapify(self, kE):
# Austausch aufwärts
while kE > 0:
kV = (kE-1)//2
if self.A[kE] <= self.A[kV]:
self.exchange(kE,kV)
kE = kV
else:
break
# Austausch abwärts,
# falls kE ist innerer Knoten
while kE < len(self.A)//2:
kN = 2*kE+1
if kN+1 < len(self.A):
if self.A[kN+1] < self.A[kN]:
kN += 1
if self.A[kE] <= self.A[kN]:
return
self.exchange(kE, kN)
kE = kN
```
%% Cell type:markdown id:9a0aa0a2 tags:
Maschine:
%% Cell type:code id:d745f1fd tags:
``` python
class Maschine:
def __init__(self):
"?"
def neuer_auftrag(self, auftrag):
"?"
def bearbeite_auftrag(self):
info = "?"
print("?")
def bearbeite_alle_auftraege(self):
for "?":
"?"
```
%% Cell type:markdown id:b9174f58 tags:
### <font color='blue'>**Anwendung**</font>
Zum Testen werden eine Maschine und verschiedene Aufträge angelegt. Über Variation der Prioritätswerte kann getestet werden, ob die Implementierung korrekt funktioniert. Ist das der Fall, wird unabhängig von der Reihenfolge des Erstellens der Aufträge immer als nächstes der Auftrag mit der höchsten Priorität (bzw. dem niedrigsten Prioritätsschlüssel) abgearbeitet.
%% Cell type:code id:bf9970e6 tags:
``` python
fraese = "?"
fraese.neuer_auftrag("?"("Grundplatte", "Stahl", 0.4, 20, 8, 5))
fraese.neuer_auftrag("?"("Formwerkzeug", "Necuron 690", 0.3, 4, 120, 1))
fraese.bearbeite_auftrag()
fraese.neuer_auftrag("?"("Stütze", "Aluminium", 0.3, 40, 6, 3))
fraese.bearbeite_alle_auftraege()
```
%% Cell type:markdown id:f71e5ad3 tags:
### <font color='blue'>**Anregungen zum selbst Programmieren**</font>
Nimm zwei Erweiterungen an dem Programm vor:
* Damit Aufträge mit anfangs niedriger Priorität auch irgendwann abgearbeitet werden und nicht immer von neueren Aufträgen mit höherer Priorität blockiert werden, soll die Maschine immer nach der Abarbeitung von z.B. 2 Aufträgen die Priorität der verbleibenden Aufträge erhöhen. Damit dies funktioniert, benötigt die Maschine ein weiteres Attribut, das die abgearbeiteten Aufträge seit der letzten Prioritätserhöhung zählt. Sie benötigt eine Methode (z.B. "Prio_erhoehen"), die immer beim Bearbeiten von Aufträgen aufgerufen wird, sobald genug Aufträge abgearbeitet werden. In dieser Methode wird ein neuer Heap angelegt. Die Aufträge des auftraege-Heaps werden ausgelesen, der Prioritätsschlüssel verringert und anschließend der Auftrag dem neuen Heap hinzugefügt. Sind alle Aufträge aus dem auftraege-Heap in den neuen Heap eingefuegt, wird der neue Heap als auftraege-Heap abgespeichert. So können die Aufträge verändert werden, ohne manipulativ in die Datenstruktur des Heaps einzugreifen (und damit potentiell die korrekte Funktion des Heaps zu zerstören, die darauf basiert, dass außer für ein gerade angehängtes Element die Heap-Bedingung immer erfüllt ist).
* Die Aufträge sollen zusätzlich ein Attribut für "Gewinn pro Stück" erhalten. Der Prioritätswert soll nun automatisch so gewählt werden, dass Aufträge, die in kurzer Zeit viel Gewinn bringen, priorisiert werden.
%% Cell type:markdown id:ca8d90cf tags:
# <font color='blue'>**Übung 2 - Anwendung von Datenstrukturen (Fortsetzung)**</font>
## <font color='blue'>**Problemstellung: Auftragsverwaltung einer Fertigungsmaschine**</font>
### <font color='blue'>**Problembeschreibung**</font>
Es soll eine Datenstruktur zur Verwaltung von Aufträgen für CNC-Fertigungsmaschinen implementiert werden. Hierbei soll jedoch nicht ein First-in-first-out (FIFO) Prinzip verwendet werden, sondern es soll möglich sein, Aufträge zu priorisieren. Die Aufträge sollen folgende Elemente enthalten:
* Name
* Stückzahl
* Materialart
* Materialmenge pro Stück
* Dauer pro Stück<br>
* Priorität<br>
Die ````__init()__````- Methode soll prüfen, dass bei den Zahlenwerten nur positive Werte eingegeben werden.
Die Maschine soll Aufträge annehmen und bearbeiten können. Bei der Bearbeitung eines soll zur Kontrolle eine Textausgabe ausgeben, welcher Auftrag ausgeführt wurde, und wie viel Zeit und Material dafür benötigt wurde. Es soll eine weitere Methode geben, mit der alle verbleibenden Aufträge abgearbeitet werden.
### <font color='blue'>**Modellbildung**</font>
Das Modell besteht aus Aufträgen mit den oben genannten Informationen und der Maschine, die die Aufträge speichert, sortiert, und bei Bearbeitung eine entsprechende Statusmeldung ausgibt. Dazu werden die Material- und Zeitbedarfe mit der Stückzahl multipliziert. Die Speicherung und Sortierung wird mithilfe einer geeigneten Datenstruktur gelöst, was im Bereich "Algorithmierung" näher besprochen wird.
### <font color='blue'>**Algorithmierung**</font>
Für die Anwendung einer Vorrangwarteschlange eignet sich die Datenstruktur (Minimum-) Heap hervorragend, da wir neue Elemente hinzufügen und immer das Element mit dem niedrigsten Schlüssel entnehmen können. Wir verwenden eine Standardimplementierung mit den Methoden `insert()` und `extractMin()` zur Nutzung, sowie den internen Methoden `__init__()`,`remove()`, `exchange()` und `heapify` aus dem Grundlagennotebook. Die Algorithmen für das Hinzufügen, Entnehmen und Sortieren sind im Grundlagenteil bereits besprochen. Wir fügen der Implementierung die Methode `__len__()`hinzu, um die Anzahl der gespeicherten Elemente erhalten zu können. In der verwendeten Implementierung wird der Prioritätsschlüssel ausschließlich im Zusammenhang mit den Vergleichsoperationen `<=` und `<` ausgewertet. Es muss also dafür gesorgt werden, dass die von uns in diesem Heap gespeicherten Aufträge (Elemente) eine sinnvolle und auf die Priorität bezogene Implementierung von `<=` und `<` haben. Dann kann diese Implementierung des Heaps direkt verwendet werden.
Für die Aufträge erstellen wir zwei Klassen, um die Funktionalität für die Priorätatswarteschlange vom eigentlichen Auftrag zu trennen. Die Klasse `Auftrag` erhält somit nur einen Konstruktor `__init__()` und die Attribute, die den Auftrag beschreiben.
Die abgeleitete Klasse `PrioAuftrag` erweitert `Auftrag` um den Schlüssel `prio`, sowie die Implementierung der `<=` und `<` Operatoren mithilfe der Magic-Methoden `__le__()` und `__lt__()`. Diese Methoden erhalten das Objekt hinter dem Operator als Argument und geben als Ergebnis den Vergleich der Attribute `prio` der beiden Objekte zurück. So kann es direkt vom verwendeten Heap verarbeitet werden.
Die Klasse `Maschine` verwaltet den Heap und stellt die geforderten Methoden zur Verfügung. Die Methoden rufen die passenden Methoden des Heaps auf.
Die Struktur ist im folgenden UML-Diagramm gezeigt:
%% Cell type:markdown id:728ee1f2 tags:
![MinHeap_Maschine.svg](Pics/MinHeap_Maschine.svg)
%% Cell type:markdown id:ea55317c tags:
### <font color='blue'>**Umsetzung**</font>
Auftrag:
%% Cell type:code id:f847f8e0 tags:
``` python
class Auftrag:
def __init__(self, name, material, materialverbrauch_pro_stueck, stueckzahl, stueckdauer):
self.name = name
self.material = material
if materialverbrauch_pro_stueck > 0 and stueckzahl > 0 and stueckdauer > 0:
self.materialverbrauch_pro_stueck = materialverbrauch_pro_stueck
self.stueckzahl = stueckzahl
self.stueckdauer = stueckdauer
else:
self.materialverbrauch_pro_stueck = 0
self.stueckzahl = 0
self.stueckdauer = 0
```
%% Cell type:markdown id:e0cf1a69 tags:
PrioAuftrag ableiten:
%% Cell type:code id:d425e591 tags:
``` python
class PrioAuftrag(Auftrag):
def __init__(self, name, material, materialverbrauch_pro_stueck, stueckzahl, stueckdauer, prio):
super().__init__(name, material, materialverbrauch_pro_stueck, stueckzahl, stueckdauer)
self.prio = prio
def __le__(self, other):
return self.prio <= other.prio
def __lt__(self, other):
return self.prio < other.prio
```
%% Cell type:markdown id:4b88c81b tags:
Heap (übernommen aus Grundlagen-Notebook, `__len__()` hinzugefügt):
%% Cell type:code id:3c319063 tags:
``` python
class Heap:
def __init__(self):
self.A = [] # Array/Liste
def __len__(self):
return len(self.A)
def insert(self, newNode):
self.A.append(newNode)
self.heapify(len(self.A)-1)
def extractMin(self):
x = self.A[0]
self.remove(0)
return x
def remove(self, kE):
self.exchange(kE,len(self.A)-1)
del self.A[-1]
self.heapify(kE)
def exchange(self, k1, k2):
x = self.A[k1]
self.A[k1] = self.A[k2]
self.A[k2] = x
def heapify(self, kE):
# Austausch aufwärts
while kE > 0:
kV = (kE-1)//2
if self.A[kE] <= self.A[kV]:
self.exchange(kE,kV)
kE = kV
else:
break
# Austausch abwärts,
# falls kE ist innerer Knoten
while kE < len(self.A)//2:
kN = 2*kE+1
if kN+1 < len(self.A):
if self.A[kN+1] < self.A[kN]:
kN += 1
if self.A[kE] <= self.A[kN]:
return
self.exchange(kE, kN)
kE = kN
```
%% Cell type:markdown id:9a0aa0a2 tags:
Maschine:
%% Cell type:code id:d745f1fd tags:
``` python
class Maschine:
def __init__(self):
self.auftraege = Heap()
def neuer_auftrag(self, auftrag):
self.auftraege.insert(auftrag)
def bearbeite_auftrag(self):
info = self.auftraege.extractMin()
print(f"{info.stueckzahl} Stück {info.name} wurden in {info.stueckdauer * info.stueckzahl} s hergestellt" +
f" und dabei {info.materialverbrauch_pro_stueck * info.stueckzahl} kg {info.material} verwendet.")
def bearbeite_alle_auftraege(self):
for i in range(len(self.auftraege)):
self.bearbeite_auftrag()
```
%% Cell type:markdown id:b9174f58 tags:
### <font color='blue'>**Anwendung**</font>
Zum Testen werden eine Maschine und verschiedene Aufträge angelegt. Über Variation der Prioritätswerte kann getestet werden, ob die Implementierung korrekt funktioniert. Ist das der Fall, wird unabhängig von der Reihenfolge des Erstellens der Aufträge immer als nächstes der Auftrag mit der höchsten Priorität (bzw. dem niedrigsten Prioritätsschlüssel) abgearbeitet.
%% Cell type:code id:bf9970e6 tags:
``` python
fraese = Maschine()
fraese.neuer_auftrag(PrioAuftrag("Grundplatte", "Stahl", 0.4, 20, 8, 5))
fraese.neuer_auftrag(PrioAuftrag("Formwerkzeug", "Necuron 690", 0.3, 4, 120, 1))
fraese.bearbeite_auftrag()
fraese.neuer_auftrag(PrioAuftrag("Stütze", "Aluminium", 0.3, 40, 6, 3))
fraese.bearbeite_alle_auftraege()
```
%% Output
4 Stück Formwerkzeug wurden in 480 s hergestellt und dabei 1.2 kg Necuron 690 verwendet.
40 Stück Stütze wurden in 240 s hergestellt und dabei 12.0 kg Aluminium verwendet.
20 Stück Grundplatte wurden in 160 s hergestellt und dabei 8.0 kg Stahl verwendet.
%% Cell type:markdown id:f71e5ad3 tags:
### <font color='blue'>**Anregungen zum selbst Programmieren**</font>
Nimm zwei Erweiterungen an dem Programm vor:
* Damit Aufträge mit anfangs niedriger Priorität auch irgendwann abgearbeitet werden und nicht immer von neueren Aufträgen mit höherer Priorität blockiert werden, soll die Maschine immer nach der Abarbeitung von z.B. 2 Aufträgen die Priorität der verbleibenden Aufträge erhöhen. Damit dies funktioniert, benötigt die Maschine ein weiteres Attribut, das die abgearbeiteten Aufträge seit der letzten Prioritätserhöhung zählt. Sie benötigt eine Methode (z.B. "Prio_erhoehen"), die immer beim Bearbeiten von Aufträgen aufgerufen wird, sobald genug Aufträge abgearbeitet werden. In dieser Methode wird ein neuer Heap angelegt. Die Aufträge des auftraege-Heaps werden ausgelesen, der Prioritätsschlüssel verringert und anschließend der Auftrag dem neuen Heap hinzugefügt. Sind alle Aufträge aus dem auftraege-Heap in den neuen Heap eingefuegt, wird der neue Heap als auftraege-Heap abgespeichert. So können die Aufträge verändert werden, ohne manipulativ in die Datenstruktur des Heaps einzugreifen (und damit potentiell die korrekte Funktion des Heaps zu zerstören, die darauf basiert, dass außer für ein gerade angehängtes Element die Heap-Bedingung immer erfüllt ist).
* Die Aufträge sollen zusätzlich ein Attribut für "Gewinn pro Stück" erhalten. Der Prioritätswert soll nun automatisch so gewählt werden, dass Aufträge, die in kurzer Zeit viel Gewinn bringen, priorisiert werden.
This diff is collapsed.
<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="430px" preserveAspectRatio="none" style="width:332px;height:430px;background:#FFFFFF;" version="1.1" viewBox="0 0 332 430" width="332px" zoomAndPan="magnify"><defs/><g><!--class Auftrag--><g id="elem_Auftrag"><rect codeLine="1" fill="#F1F1F1" height="129.4844" id="Auftrag" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="136" x="98" y="294"/><ellipse cx="135.5" cy="310" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M137.8438,305.6719 C136.9063,305.2344 136.3125,305.0938 135.4375,305.0938 C132.8125,305.0938 130.8125,307.1719 130.8125,309.8906 L130.8125,311.0156 C130.8125,313.5938 132.9219,315.4844 135.8125,315.4844 C137.0313,315.4844 138.1875,315.1875 138.9375,314.6406 C139.5156,314.2344 139.8438,313.7813 139.8438,313.3906 C139.8438,312.9375 139.4531,312.5469 138.9844,312.5469 C138.7656,312.5469 138.5625,312.625 138.375,312.8125 C137.9219,313.2969 137.9219,313.2969 137.7344,313.3906 C137.3125,313.6563 136.625,313.7813 135.8594,313.7813 C133.8125,313.7813 132.5156,312.6875 132.5156,310.9844 L132.5156,309.8906 C132.5156,308.1094 133.7656,306.7969 135.5,306.7969 C136.0781,306.7969 136.6875,306.9531 137.1563,307.2031 C137.6406,307.4844 137.8125,307.7031 137.9063,308.1094 C137.9688,308.5156 138,308.6406 138.1406,308.7656 C138.2813,308.9063 138.5156,309.0156 138.7344,309.0156 C139,309.0156 139.2656,308.875 139.4375,308.6563 C139.5469,308.5 139.5781,308.3125 139.5781,307.8906 L139.5781,306.4688 C139.5781,306.0313 139.5625,305.9063 139.4688,305.75 C139.3125,305.4844 139.0313,305.3438 138.7344,305.3438 C138.4375,305.3438 138.2344,305.4375 138.0156,305.75 L137.8438,305.6719 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="54" x="154.5" y="314.8467">Auftrag</text><line style="stroke:#181818;stroke-width:0.5;" x1="99" x2="233" y1="326" y2="326"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="95" x="104" y="342.9951">name : string</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="112" x="104" y="359.292">dauer : int/float</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="105" x="104" y="375.5889">wert : int/float</text><line style="stroke:#181818;stroke-width:0.5;" x1="99" x2="233" y1="382.8906" y2="382.8906"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="124" x="104" y="399.8857">__repr__() : string</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="62" x="104" y="416.1826">__init__()</text></g><!--class Maschinenbelegungsplan--><g id="elem_Maschinenbelegungsplan"><rect codeLine="2" fill="#F1F1F1" height="227.2656" id="Maschinenbelegungsplan" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="318" x="7" y="7"/><ellipse cx="71.75" cy="23" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M74.0938,18.6719 C73.1563,18.2344 72.5625,18.0938 71.6875,18.0938 C69.0625,18.0938 67.0625,20.1719 67.0625,22.8906 L67.0625,24.0156 C67.0625,26.5938 69.1719,28.4844 72.0625,28.4844 C73.2813,28.4844 74.4375,28.1875 75.1875,27.6406 C75.7656,27.2344 76.0938,26.7813 76.0938,26.3906 C76.0938,25.9375 75.7031,25.5469 75.2344,25.5469 C75.0156,25.5469 74.8125,25.625 74.625,25.8125 C74.1719,26.2969 74.1719,26.2969 73.9844,26.3906 C73.5625,26.6563 72.875,26.7813 72.1094,26.7813 C70.0625,26.7813 68.7656,25.6875 68.7656,23.9844 L68.7656,22.8906 C68.7656,21.1094 70.0156,19.7969 71.75,19.7969 C72.3281,19.7969 72.9375,19.9531 73.4063,20.2031 C73.8906,20.4844 74.0625,20.7031 74.1563,21.1094 C74.2188,21.5156 74.25,21.6406 74.3906,21.7656 C74.5313,21.9063 74.7656,22.0156 74.9844,22.0156 C75.25,22.0156 75.5156,21.875 75.6875,21.6563 C75.7969,21.5 75.8281,21.3125 75.8281,20.8906 L75.8281,19.4688 C75.8281,19.0313 75.8125,18.9063 75.7188,18.75 C75.5625,18.4844 75.2813,18.3438 74.9844,18.3438 C74.6875,18.3438 74.4844,18.4375 74.2656,18.75 L74.0938,18.6719 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="180" x="92.25" y="27.8467">Maschinenbelegungsplan</text><line style="stroke:#181818;stroke-width:0.5;" x1="8" x2="324" y1="39" y2="39"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="241" x="13" y="55.9951">geplante_auftraege : list[Auftrag]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="176" x="13" y="72.292">planungsdauer : int/float</text><line style="stroke:#181818;stroke-width:0.5;" x1="8" x2="324" y1="79.5938" y2="79.5938"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="201" x="13" y="96.5889">get_gesamtwert() : int/float</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="208" x="13" y="112.8857">get_gesamtdauer() : int/float</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="115" x="13" y="129.1826">zuruecksetzen()</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="152" x="13" y="145.4795">hinzufuegen(Auftrag)</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="202" x="13" y="161.7764">greedy_planen(list[Auftrag])</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="220" x="13" y="178.0732">_waehle(list[Auftrag]) : Auftrag</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="306" x="13" y="194.3701">_filter_auftrage(list[Auftrag]) : list[Auftrag]</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="124" x="13" y="210.667">__repr__() : string</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="62" x="13" y="226.9639">__init__()</text></g><!--reverse link Maschinenbelegungsplan to Auftrag--><g id="link_Maschinenbelegungsplan_Auftrag"><path codeLine="4" d="M166,247.774 C166,263.77 166,279.562 166,293.967 " fill="none" id="Maschinenbelegungsplan-backto-Auftrag" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="166,234.316,162,240.316,166,246.316,170,240.316,166,234.316" style="stroke:#181818;stroke-width:1.0;"/></g><!--SRC=[bL9BRiCW4Drp2Y-TIb7ttVK0FK5LeQdpJ539D1e6HVNf2vPJvsEiT0NpFlDXw0B5sBocNeMSwSReZMAtzmp-H81BxE8n41kpZ3TFs-rVWghefN4e5uMbKGk730OVzNqoVzIzvIZXZX8anvxrkG_Vf6lbr3f4EkW9ektclwwnrAEs8Kb2znMX0xZTr8KP75AVyl3SJcElg9q0knzRego_UgiLbpqHzW4t-aoSbrHtzZuePDgGMqZnuBwi5Hp5sl7zeehdjQhMizSYDcPAdL6c0sRpZDz_WPahcwvGInrTikSMVW40]--></g></svg>
\ No newline at end of file
<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="484px" preserveAspectRatio="none" style="width:519px;height:484px;background:#FFFFFF;" version="1.1" viewBox="0 0 519 484" width="519px" zoomAndPan="magnify"><defs/><g><ellipse cx="334" cy="16" fill="#222222" rx="10" ry="10" style="stroke:none;stroke-width:1.0;"/><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="167" x="250.5" y="67"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="147" x="260.5" y="88.1387">erhaltene Liste kopieren</text><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="109" x="279.5" y="142"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="89" x="289.5" y="163.1387">Auftrge filtern</text><g id="elem_#7"><polygon fill="#F1F1F1" points="302,217,314,229,302,241,290,229,302,217" style="stroke:#181818;stroke-width:0.5;"/></g><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="155" x="102.5" y="295"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="135" x="112.5" y="316.1387">besten Auftrag whlen</text><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="324" x="7" y="370"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="304" x="17" y="391.1387">gewhlten Auftrag geplanten Auftrgen hinzufgen</text><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="413" x="100.5" y="445"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="393" x="110.5" y="466.1387">gewhlten Auftrag aus Liste der zu planenden Auftrge entfernen</text><ellipse cx="302" cy="312" fill="none" rx="10" ry="10" style="stroke:#222222;stroke-width:1.0;"/><ellipse cx="302.5" cy="312.5" fill="#222222" rx="6" ry="6" style="stroke:none;stroke-width:1.0;"/><!--link start to erhaltene Liste kopieren--><g id="link_start_erhaltene Liste kopieren"><path d="M334,26.177 C334,35.269 334,49.527 334,61.485 " fill="none" id="start-to-erhaltene Liste kopieren" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="334,66.791,338,57.791,334,61.791,330,57.791,334,66.791" style="stroke:#181818;stroke-width:1.0;"/></g><!--link erhaltene Liste kopieren to Auftr?ge filtern--><g id="link_erhaltene Liste kopieren_Auftrge filtern"><path d="M334,101.201 C334,111.692 334,125.463 334,136.818 " fill="none" id="erhaltene Liste kopieren-to-Auftrge filtern" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="334,141.844,338,132.844,334,136.844,330,132.844,334,141.844" style="stroke:#181818;stroke-width:1.0;"/></g><!--link Auftr?ge filtern to #7--><g id="link_Auftrge filtern_#7"><path d="M326.416,176.115 C320.711,188.24 313.009,204.607 307.792,215.692 " fill="none" id="Auftrge filtern-to-#7" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="305.586,220.379,313.0369,213.9381,307.7146,215.8547,305.798,210.5324,305.586,220.379" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="183" x="321.9289" y="216.1456">passender auftrag verbleibend?</text></g><!--link #7 to besten Auftrag w?hlen--><g id="link_#7_besten Auftrag whlen"><path d="M295.091,234.587 C278.823,245.388 237.335,272.933 208.885,291.822 " fill="none" id="#7-to-besten Auftrag whlen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="204.436,294.776,214.1464,293.1304,208.6015,292.0104,209.7215,286.4655,204.436,294.776" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="10" x="253" y="272.2104">ja</text></g><!--link besten Auftrag w?hlen to gew?hlten Auftrag geplanten Auftr?gen hinzuf?gen--><g id="link_besten Auftrag whlen_gewhlten Auftrag geplanten Auftrgen hinzufgen"><path d="M177.559,329.201 C175.978,339.692 173.903,353.463 172.192,364.818 " fill="none" id="besten Auftrag whlen-to-gewhlten Auftrag geplanten Auftrgen hinzufgen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="171.434,369.844,176.7315,361.5412,172.1797,364.8999,168.821,360.3481,171.434,369.844" style="stroke:#181818;stroke-width:1.0;"/></g><!--link gew?hlten Auftrag geplanten Auftr?gen hinzuf?gen to gew?hlten Auftrag aus Liste der zu planenden Auftr?ge entfernen--><g id="link_gewhlten Auftrag geplanten Auftrgen hinzufgen_gewhlten Auftrag aus Liste der zu planenden Auftrge entfernen"><path d="M199.285,404.0202 C220.617,415.3049 249.25,430.4512 271.633,442.2912 " fill="none" id="gewhlten Auftrag geplanten Auftrgen hinzufgen-to-gewhlten Auftrag aus Liste der zu planenden Auftrge entfernen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="276.309,444.7649,270.2247,437.0201,271.8895,442.4265,266.4832,444.0913,276.309,444.7649" style="stroke:#181818;stroke-width:1.0;"/></g><!--link gew?hlten Auftrag aus Liste der zu planenden Auftr?ge entfernen to Auftr?ge filtern--><g id="link_gewhlten Auftrag aus Liste der zu planenden Auftrge entfernen_Auftrge filtern"><path d="M328.737,444.9808 C344.111,431.6532 362,411.1674 362,388 C362,228 362,228 362,228 C362,211.171 354.577,193.645 347.375,180.601 " fill="none" id="gewhlten Auftrag aus Liste der zu planenden Auftrge entfernen-to-Auftrge filtern" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="344.745,176.007,345.746,185.8049,347.2295,180.346,352.6884,181.8296,344.745,176.007" style="stroke:#181818;stroke-width:1.0;"/></g><!--link #7 to end--><g id="link_#7_end"><path d="M302,241.263 C302,255.665 302,280.629 302,296.455 " fill="none" id="#7-to-end" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="302,301.836,306,292.836,302,296.836,298,292.836,302,301.836" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="25" x="303" y="272.2104">nein</text></g><!--SRC=[TOzB3e9044JtdgB32acuWeQzDo0iXbZpqKbBvgC9v-4OxhYOCq0C2rrsLVNhhh8wrlK9JWiRmA2ByG5qVmm63dn8NXDbSFEaGDAaZ5j48waOXFVWAno9716Add2zXUcJUYuew1NGtaH7FHANgTcIhtdIDitPLrYclQqmMC5V9LzdqeR7AEUtMh4_raJqMu7yrHWfK_ABEmw1Wqmj_fM3zSWEjGp37PNLyGC0]--></g></svg>
\ No newline at end of file
<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="432px" preserveAspectRatio="none" style="width:620px;height:432px;background:#FFFFFF;" version="1.1" viewBox="0 0 620 432" width="620px" zoomAndPan="magnify"><defs/><g><ellipse cx="321.2658" cy="16" fill="#222222" rx="10" ry="10" style="stroke:none;stroke-width:1.0;"/><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="236" x="203.2658" y="67"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="216" x="213.2658" y="88.1387">verbleibende Planungszeit ermitteln</text><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="134" x="254.2658" y="142"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="114" x="264.2658" y="163.1387">neue Liste anlegen</text><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="152" x="245.2658" y="217"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="132" x="255.2658" y="238.1387">erhaltene Liste prfen</text><g id="elem_#9"><polygon fill="#F1F1F1" points="429.2658,222,441.2658,234,429.2658,246,417.2658,234,429.2658,222" style="stroke:#181818;stroke-width:0.5;"/></g><g id="elem_#12"><polygon fill="#F1F1F1" points="356.2658,310,368.2658,322,356.2658,334,344.2658,322,356.2658,310" style="stroke:#181818;stroke-width:0.5;"/></g><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="238" x="199.2658" y="393"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="218" x="209.2658" y="414.1387">Auftrag der neuen Liste hinzufuegen</text><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="165" x="388.7658" y="305"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="145" x="398.7658" y="326.1387">neue Liste zurckgeben</text><ellipse cx="471.2658" cy="410" fill="none" rx="10" ry="10" style="stroke:#222222;stroke-width:1.0;"/><ellipse cx="471.7658" cy="410.5" fill="#222222" rx="6" ry="6" style="stroke:none;stroke-width:1.0;"/><!--link start to verbleibende Planungszeit ermitteln--><g id="link_start_verbleibende Planungszeit ermitteln"><path d="M321.2658,26.177 C321.2658,35.269 321.2658,49.527 321.2658,61.485 " fill="none" id="start-to-verbleibende Planungszeit ermitteln" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="321.2658,66.791,325.2658,57.791,321.2658,61.791,317.2658,57.791,321.2658,66.791" style="stroke:#181818;stroke-width:1.0;"/></g><!--link verbleibende Planungszeit ermitteln to neue Liste anlegen--><g id="link_verbleibende Planungszeit ermitteln_neue Liste anlegen"><path d="M321.2658,101.201 C321.2658,111.692 321.2658,125.463 321.2658,136.818 " fill="none" id="verbleibende Planungszeit ermitteln-to-neue Liste anlegen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="321.2658,141.844,325.2658,132.844,321.2658,136.844,317.2658,132.844,321.2658,141.844" style="stroke:#181818;stroke-width:1.0;"/></g><!--link neue Liste anlegen to erhaltene Liste pr?fen--><g id="link_neue Liste anlegen_erhaltene Liste prfen"><path d="M321.2658,176.201 C321.2658,186.692 321.2658,200.463 321.2658,211.818 " fill="none" id="neue Liste anlegen-to-erhaltene Liste prfen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="321.2658,216.844,325.2658,207.844,321.2658,211.844,317.2658,207.844,321.2658,216.844" style="stroke:#181818;stroke-width:1.0;"/></g><!--link erhaltene Liste pr?fen to #9--><g id="link_erhaltene Liste prfen_#9"><path d="M397.6248,234 C402.3448,234 407.0648,234 411.7838,234 " fill="none" id="erhaltene Liste prfen-to-#9" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="416.9058,234,407.9058,230,411.9058,234,407.9058,238,416.9058,234" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="164" x="449.1143" y="229.6215">weiterer Auftrag vorhanden?</text></g><!--link #9 to #12--><g id="link_#9_#12"><path d="M424.0158,241.185 C411.5988,255.813 380.3208,292.66 364.9988,310.712 " fill="none" id="#9-to-#12" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="361.4678,314.871,370.3418,310.5987,364.7037,311.0593,364.2431,305.4213,361.4678,314.871" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="10" x="398.2658" y="282.2104">ja</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="330" x="6" y="311.0531">Auftrag ist kurz genug fr die verbleibende Planungszeit?</text></g><!--link #12 to Auftrag der neuen Liste hinzufuegen--><g id="link_#12_Auftrag der neuen Liste hinzufuegen"><path d="M352.8928,330.6319 C347.2808,343.3324 335.8338,369.2408 327.6358,387.7926 " fill="none" id="#12-to-Auftrag der neuen Liste hinzufuegen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="325.4178,392.813,332.7136,386.197,327.4383,388.2394,325.3959,382.9642,325.4178,392.813" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="10" x="341.2658" y="370.2104">ja</text></g><!--link Auftrag der neuen Liste hinzufuegen to erhaltene Liste pr?fen--><g id="link_Auftrag der neuen Liste hinzufuegen_erhaltene Liste prfen"><path d="M318.5418,392.9812 C319.0838,361.5483 320.2868,291.78 320.8958,256.425 " fill="none" id="Auftrag der neuen Liste hinzufuegen-to-erhaltene Liste prfen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="320.9888,251.058,316.8351,259.9881,320.9031,256.0573,324.8339,260.1253,320.9888,251.058" style="stroke:#181818;stroke-width:1.0;"/></g><!--link #12 to erhaltene Liste pr?fen--><g id="link_#12_erhaltene Liste prfen"><path d="M353.0738,313.157 C347.8708,300.373 337.3908,274.622 329.8808,256.17 " fill="none" id="#12-to-erhaltene Liste prfen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="327.8488,251.176,327.538,261.02,329.7343,255.8069,334.9474,258.0032,327.8488,251.176" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="25" x="342.2658" y="282.2104">nein</text></g><!--link #9 to neue Liste zur?ckgeben--><g id="link_#9_neue Liste zurckgeben"><path d="M432.9928,242.632 C439.2478,255.441 452.0648,281.685 461.1398,300.267 " fill="none" id="#9-to-neue Liste zurckgeben" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="463.3598,304.813,463.0044,294.9706,461.1655,300.3202,455.8159,298.4814,463.3598,304.813" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="25" x="453.2658" y="282.2104">nein</text></g><!--link neue Liste zur?ckgeben to end--><g id="link_neue Liste zurckgeben_end"><path d="M471.2658,339.1759 C471.2658,355.1231 471.2658,379.2657 471.2658,394.5766 " fill="none" id="neue Liste zurckgeben-to-end" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="471.2658,399.7863,475.2658,390.7863,471.2658,394.7863,467.2658,390.7863,471.2658,399.7863" style="stroke:#181818;stroke-width:1.0;"/></g><!--SRC=[XP2nRi9044Hxlc941KZy0YXzYlGHnHdFdHSk6xI-0ydVHiUFvOpj224XsfsdDwDTh9RhzUPCgoAbejR4LtIQDRGT9O7s8oanwgnWoanyIfi8fv61zokjSJ5Hf-Xajwlleurup2_5GgFX8_jaBk3yM_ZIezivKZCelWzkXvwUe2B2CLk7qf43_Ergg8LuEVHPDedgqjpFrd5S8zfbdzzjPsnvTob5TtY9QIt-7yP8FxofouNS7mEheG-BrV8F]--></g></svg>
\ No newline at end of file
<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="357px" preserveAspectRatio="none" style="width:637px;height:357px;background:#FFFFFF;" version="1.1" viewBox="0 0 637 357" width="637px" zoomAndPan="magnify"><defs/><g><ellipse cx="282.8776" cy="16" fill="#222222" rx="10" ry="10" style="stroke:none;stroke-width:1.0;"/><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="295" x="135.3776" y="67"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="275" x="145.3776" y="88.1387">ersten Auftrag der erhaltenen Liste speichern</text><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="152" x="206.8776" y="142"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="132" x="216.8776" y="163.1387">erhaltene Liste prfen</text><g id="elem_#7"><polygon fill="#F1F1F1" points="390.8776,147,402.8776,159,390.8776,171,378.8776,159,390.8776,147" style="stroke:#181818;stroke-width:0.5;"/></g><g id="elem_#10"><polygon fill="#F1F1F1" points="317.8776,235,329.8776,247,317.8776,259,305.8776,247,317.8776,235" style="stroke:#181818;stroke-width:0.5;"/></g><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="256" x="166.8776" y="318"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="236" x="176.8776" y="339.1387">aktuell gespeicherten Auftrag ersetzen</text><rect fill="#F1F1F1" height="33.9688" rx="12.5" ry="12.5" style="stroke:#181818;stroke-width:0.5;" width="281" x="350.3776" y="230"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="261" x="360.3776" y="251.1387">aktuell gespeicherten Auftrag zurckgeben</text><ellipse cx="490.8776" cy="335" fill="none" rx="10" ry="10" style="stroke:#222222;stroke-width:1.0;"/><ellipse cx="491.3776" cy="335.5" fill="#222222" rx="6" ry="6" style="stroke:none;stroke-width:1.0;"/><!--link start to ersten Auftrag der erhaltenen Liste speichern--><g id="link_start_ersten Auftrag der erhaltenen Liste speichern"><path d="M282.8776,26.177 C282.8776,35.269 282.8776,49.527 282.8776,61.485 " fill="none" id="start-to-ersten Auftrag der erhaltenen Liste speichern" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="282.8776,66.791,286.8776,57.791,282.8776,61.791,278.8776,57.791,282.8776,66.791" style="stroke:#181818;stroke-width:1.0;"/></g><!--link ersten Auftrag der erhaltenen Liste speichern to erhaltene Liste pr?fen--><g id="link_ersten Auftrag der erhaltenen Liste speichern_erhaltene Liste prfen"><path d="M282.8776,101.201 C282.8776,111.692 282.8776,125.463 282.8776,136.818 " fill="none" id="ersten Auftrag der erhaltenen Liste speichern-to-erhaltene Liste prfen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="282.8776,141.844,286.8776,132.844,282.8776,136.844,278.8776,132.844,282.8776,141.844" style="stroke:#181818;stroke-width:1.0;"/></g><!--link erhaltene Liste pr?fen to #7--><g id="link_erhaltene Liste prfen_#7"><path d="M359.2366,159 C363.9566,159 368.6766,159 373.3956,159 " fill="none" id="erhaltene Liste prfen-to-#7" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="378.5176,159,369.5176,155,373.5176,159,369.5176,163,378.5176,159" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="164" x="410.7261" y="154.6215">weiterer Auftrag vorhanden?</text></g><!--link #7 to #10--><g id="link_#7_#10"><path d="M385.6276,166.185 C373.2106,180.813 341.9326,217.66 326.6106,235.712 " fill="none" id="#7-to-#10" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="323.0796,239.871,331.9536,235.5987,326.3156,236.0593,325.855,230.4213,323.0796,239.871" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="10" x="359.8776" y="207.2104">ja</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="292" x="6" y="235.8145">Auftrag ist besser als aktuell gespeicherter Auftrag</text></g><!--link #10 to aktuell gespeicherten Auftrag ersetzen--><g id="link_#10_aktuell gespeicherten Auftrag ersetzen"><path d="M315.5026,256.8796 C311.9986,269.9816 305.3396,294.879 300.5346,312.8466 " fill="none" id="#10-to-aktuell gespeicherten Auftrag ersetzen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="299.2326,317.715,305.4225,310.0543,300.5247,312.8848,297.6942,307.987,299.2326,317.715" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="10" x="308.8776" y="295.2104">ja</text></g><!--link aktuell gespeicherten Auftrag ersetzen to erhaltene Liste pr?fen--><g id="link_aktuell gespeicherten Auftrag ersetzen_erhaltene Liste prfen"><path d="M293.7726,317.9812 C291.6046,286.5483 286.7926,216.78 284.3546,181.425 " fill="none" id="aktuell gespeicherten Auftrag ersetzen-to-erhaltene Liste prfen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="283.9846,176.058,280.6138,185.312,284.3289,181.0461,288.5948,184.7612,283.9846,176.058" style="stroke:#181818;stroke-width:1.0;"/></g><!--link #10 to erhaltene Liste pr?fen--><g id="link_#10_erhaltene Liste prfen"><path d="M314.6856,238.157 C309.4826,225.373 299.0026,199.622 291.4926,181.17 " fill="none" id="#10-to-erhaltene Liste prfen" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="289.4606,176.176,289.1498,186.02,291.3461,180.8069,296.5592,183.0032,289.4606,176.176" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="25" x="303.8776" y="207.2104">nein</text></g><!--link #7 to aktuell gespeicherten Auftrag zur?ckgeben--><g id="link_#7_aktuell gespeicherten Auftrag zurckgeben"><path d="M396.8336,165.122 C410.5856,176.949 445.1466,206.672 468.3176,226.599 " fill="none" id="#7-to-aktuell gespeicherten Auftrag zurckgeben" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="472.2186,229.953,468.0023,221.0523,468.4274,226.6932,462.7865,227.1183,472.2186,229.953" style="stroke:#181818;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacing" textLength="25" x="446.8776" y="207.2104">nein</text></g><!--link aktuell gespeicherten Auftrag zur?ckgeben to end--><g id="link_aktuell gespeicherten Auftrag zurckgeben_end"><path d="M490.8776,264.1759 C490.8776,280.1231 490.8776,304.2657 490.8776,319.5766 " fill="none" id="aktuell gespeicherten Auftrag zurckgeben-to-end" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="490.8776,324.7863,494.8776,315.7863,490.8776,319.7863,486.8776,315.7863,490.8776,324.7863" style="stroke:#181818;stroke-width:1.0;"/></g><!--SRC=[VOz13e8m44NtdcB22aYu0iQzDp0i2ln2fQca7JJXREwyc2E294RPpd__pKoS9bcMmmU6eyEWsQk6QdY2RvMLeOoFHb8AFKpLmhlTL9ZJEUpzuwuXKMuqHJSOXXV98hnUX7Srt3uYRZ4fJcTLq8jU815HYH2afsmWrV40Qwd1ifbNuvVc5xk-8z-1HsmU3XimwHoCA-WlvcgZFp3DzFRwSP1orJKetoTGd2PF]--></g></svg>
\ No newline at end of file
Semester_2/Einheit_03/Pics/Komplexitaetsklassen.png

78.4 KiB

%% Cell type:markdown id:622edf27 tags:
# <font color='blue'>**Übung 3 - Greedy-Algorithmus**</font>
## <font color='blue'>**Problemstellung: Belegungsplan für eine Fertigungsmaschine**</font>
### <font color='blue'>**Problembeschreibung**</font>
Es soll eine Software für eine Fertigungsmaschine entwickelt werden, die aus einer Liste von Aufträgen eine möglichst gewinnbringende Auswahl zusammenstellt. Diese Auswahl muss in einem gegebenen Zeitraum abgearbeitet werden können. Die Aufträge sollen folgende Informationen enthalten:
* Name
* Wert
* Dauer
Die Software muss nicht zwingend die beste Auswahl finden.
### <font color='blue'>**Modellbildung**</font>
Diese Problemstellung lässt sich auf das typische "Rucksackproblem" zurückführen. Dabei entspricht der Belegungsplan mit begrenzter Zeit dem Rucksack mit begrenztem Gewicht. Die Aufträge entsprechen den Gegenständen und haben ebenfalls einen Wert. Statt Gewicht haben sie eine Dauer.
Da nicht zwingend die beste Auswahl gefunden werden muss, kann der schnelle Greedy-Algorithmus eingesetzt werden, bei dem der Belegungsplan immer um den nächstbesten zeitlich noch passenden Auftrag erweitert wird. Das Kriterium für den "besten" Auftrag muss dabei definiert werden. Für die Problemstellung ist der Wert pro Zeit ein vielversprechendes Kriterium.
### <font color='blue'>**Algorithmierung**</font>
Die Aufträge werden als einfache Klasse mit den o.g. Attributen umgesetzt. Dabei erhalten sie die `__init__()`-Methode. Die Klasse Auftrag erhält außerdem eine Implementierung der `__repr__()`-Methode. Wenn diese Methode definiert ist, können Objekte der entsprechenden Klasse mit `print(objekt)` verwendet werden, wobei der in der Methode zusammengestellte String ausgegeben wird.
Eine weitere Klasse `Maschinenbelegungsplan` verwaltet die Auswahl der Aufträge. Als Attribut hat sie die maximale Planungsdauer `planungsdauer` und eine Liste mit den geplanten Aufträgen. Diese Liste wird von zwei Methoden verwaltet: `zurücksetzen()` (leert die Liste) und `hinzufuegen()`, die der Liste den übergebenen Auftrag hinzufügt, aber nur, wenn dieser zeitlich noch in die verbleibende Zeit passt. Die `__init__()`-Methode setzt die maximale Plandauer. Auch diese Klasse soll eine implementierung von `__repr__()` erhalten, die alle geplanten Aufträge, sowie die Gesamtdauer und Gesamtzeit ausgibt. Die Methoden `get_gesamtwert()` und `get_gesamtdauer()` stellen die entsprechenden Informationen zur Verfügung, die dadurch ermittelt werden, dass über die geplante Liste iteriert und das entsprechende Attribut aller Aufträge zusammengezählt wird.
Die zentrale Methode `greedy_planen()` erhält eine Liste mit möglichen Aufträgen. Diese Liste wird zunächst kopiert, damit Änderungen in der Liste keine Auswirkungen außerhalb der Methode haben. Nun muss beim Greedy-Algorithmus immer ein Auftrag den geplanten Aufträgen hinzugefügt werden, solange noch Aufträge verfügbar sind, die in die verbleibende Zeit passen. Dazu wird die kopierte Liste gefiltert, sodass sie nur noch Aufträge enthält, die eine kürzere Auftragsdauer als die verbleibende Zeit haben. Dies wird an eine Hilfmethode `_auftraege_filtern()` (wird später beschrieben) ausgelagert. Das vorangestellt `_` signalisiert, dass diese Methode nur von der Klasse selbst, nicht aber "von außen" verwendet werden soll. Anschließend beginnt eine Schleife, solange noch Aufträge in der gefilterten Liste vorhanden sind. Der beste Auftrag wird ausgewählt (ausgelagert an die Methode `_waehlen()`, die später beschrieben wird). Der ausgewählte Auftrag wird der Liste der geplanten Aufträge hinzugefügt, und aus der Liste zu planender Aufträge entfernt (dazu steht die Listenmethode `remove(element)`zur Verfügung). Anschließend wird die Liste wieder gefiltert, da sich die verbleibende Zeit geändert hat. Sobald kein Auftrag mehr in der Liste zu planender Aufträge vorhanden ist, ist der Algorithmus beendet. Die Auswahl ist im Attribut `geplante_auftraege` gespeichert und verfügbar. Die Methode `greedy_planen()` ist hier in einem Aktivitätsdiagramm skizziert:
%% Cell type:markdown id:07ceadb0 tags:
![](Pics/greedy_algo.svg)
%% Cell type:markdown id:a6e4c8cd tags:
In der internen Hilfmethode `_filter_auftraege()` wird eine leere Liste angelegt. Anschließend wird jeder Auftrag in der übergebenen Liste darauf geprüft, ob die Dauer kürzer als die verbleibende Zeit (maximale Zeit abzüglich der bereits geplanten Aufträge) ist. Falls ja, wird der Auftrag an der neuen Liste hinzugefügt. Zum Schluss wird die gefüllte Liste zurückgegeben. Die Methode `_filter_auftraege()` ist hier in einem Aktivitätsdiagramm skizziert:
%% Cell type:markdown id:e5c67335 tags:
![](Pics/Greedy_filter.svg)
%% Cell type:markdown id:a96beeb6 tags:
In der internen Hilfsmethode `_waehle()` wird der erste Auftrag aus der übergebenen Liste zwischengespeichert. Anschließend wird jeder weitere Auftrag der Liste daraufhin geprüft, ob er "besser" als der aktuell gespeicherte Auftrag ist. Bei unserem gewählten Kriterium wird dazu der Quotient aus Wert und Dauer verglichen. Falls der neue Auftrag "besser" ist, dann wird der neue Auftrag anstelle des gespeicherten Auftrags gespeichert. Sind alle Aufträge geprüft ist der "beste" Auftrag gespeichert und kann zurückgegeben werden. Die Methode `_waehle()` ist hier in einem Aktivitätsdiagramm skizziert:
%% Cell type:markdown id:2c705209 tags:
![](Pics/Greedy_waehlen.svg)
%% Cell type:markdown id:54a0eed7 tags:
Die gesamte Klassenstruktur in einem UML-Diagramm:
%% Cell type:markdown id:f3742ac0 tags:
![](Pics/Greedy.svg)
%% Cell type:markdown id:cc7329cb tags:
### <font color='blue'>**Umsetzung**</font>
Auftrag:
%% Cell type:code id:30263737 tags:
``` python
class Auftrag:
def __init__(self, "?"):
"?"
def __repr__(self):
return self.name + ", Wert: " + "?"
```
%% Cell type:markdown id:0f2aa2d6 tags:
Maschinenbelegungsplan:
%% Cell type:code id:694c2e0b tags:
``` python
class Maschinenbelegungsplan:
def __init__(self, planungsdauer):
"?"
def get_gesamtwert(self):
"?"
def get_gesamtdauer(self):
"?"
def zuruecksetzen(self):
"?"
def hinzufuegen(self, auftrag):
"?"
def _filter_auftraege(self, auftraege):
"?"
def _waehle(self, auftraege):
"?"
def greedy_planen(self, ext_auftraege):
"?"
def __repr__(self):
ausgabe = "Der Maschinenbelegungsplan enthaelt:\n"
for auftrag in self.geplante_auftraege:
ausgabe += str(auftrag)
ausgabe += "Gesamtwert: " + str(self.get_gesamtwert()) + "\nGesamtdauer: " + str(self.get_gesamtdauer()) + "\n"
return ausgabe
```
%% Cell type:markdown id:188af0d7 tags:
### <font color='blue'>**Anwendung**</font>
In diesem Test kann die Implementierung ohne den Greedy-Algorithmus getestet werden. Die Methoden `greedy_planen()`, `_filter_auftraege()` und `_waehle()` werden noch nicht verwendet. Erweitere den Test gerne um mehreren Aufträgen.
%% Cell type:code id:b528354b tags:
``` python
A1 = Auftrag("Beispielauftrag", 50, 20)
print(A1)
masch1 = Maschinenbelegungsplan(100)
masch1.hinzufuegen(A1)
print(masch1)
masch1.zuruecksetzen()
print(masch1)
```
%% Cell type:markdown id:5bb0b4ff tags:
In diesem Test wird der Greedy Algorithmus mit einer Reihe von Aufträgen geprüft. Füge gerne weitere Aufträge hinzu odere ändere die Daten, um verschiedene Ergebnisse zu ermitteln.
%% Cell type:code id:649ac8f6 tags:
``` python
# Bei dem folgenden Test und dem Kriterium Wert/Zeit sollte das Ergebnis die Auftraege 2,4,5,6 enthalten.
A1 = Auftrag("Auftrag 1", 40, 100)
A2 = Auftrag("Auftrag 2", 35, 50)
A3 = Auftrag("Auftrag 3", 18, 45)
A4 = Auftrag("Auftrag 4", 4, 20)
A5 = Auftrag("Auftrag 5", 10, 10)
A6 = Auftrag("Auftrag 6", 2, 5)
a_liste = [A1, A2, A3, A4, A5, A6]
masch1.zuruecksetzen()
masch1.greedy_planen(a_liste)
print(masch1)
```
%% Cell type:markdown id:c0846c79 tags:
### <font color='blue'>**Anregungen zum selbst Programmieren:**</font>
* Beim Greedy-Algorithmus können verschiedene Bewertungskriterien zum Einsatz kommen, z.B. der höchste Wert und die kleinste Dauer (wir verwenden bisher Wert/Dauer). Füge mehrere Abwandlungen der `_waehle()` Methode hinzu, die nach diesen anderen Kriterien sortieren. Das zu verwendende Kriterium soll der Methode `greedy_planen()` als zusätzliches Argument übergeben werden. Abhängig von diesem Argument soll eine entsprechende `_waehle()`-Methode verwendet werden. Vergleiche die erhaltenen Auswahlen mit dem "Wert pro Dauer"-Kriterium.
* Verbinde das Ergebnis dieser Übung mit der letzten Übung, sodass die Maschine die Warteschlange entsprechend der Ergebnisse des Greedy-Algorithmus plant. Überlege dir dazu eine Programmarchitektur (z.B. ob der Belegungsplan innerhalb der Maschine gespeichert sein soll). Hier gibt es viele verschiedene Möglichkeiten. Teilweise sind Anpassungen erforderlich (z.B. da wir in dieser Übung den Aufträgen nur die für den Algorithmus relevanten Informationen gegeben haben. In der anderen Übung waren mehr Daten erforderlich).
%% Cell type:markdown id:622edf27 tags:
# <font color='blue'>**Übung 3 - Greedy-Algorithmus**</font>
## <font color='blue'>**Problemstellung: Belegungsplan für eine Fertigungsmaschine**</font>
### <font color='blue'>**Problembeschreibung**</font>
Es soll eine Software für eine Fertigungsmaschine entwickelt werden, die aus einer Liste von Aufträgen eine möglichst gewinnbringende Auswahl zusammenstellt. Diese Auswahl muss in einem gegebenen Zeitraum abgearbeitet werden können. Die Aufträge sollen folgende Informationen enthalten:
* Name
* Wert
* Dauer
Die Software muss nicht zwingend die beste Auswahl finden.
### <font color='blue'>**Modellbildung**</font>
Diese Problemstellung lässt sich auf das typische "Rucksackproblem" zurückführen. Dabei entspricht der Belegungsplan mit begrenzter Zeit dem Rucksack mit begrenztem Gewicht. Die Aufträge entsprechen den Gegenständen und haben ebenfalls einen Wert. Statt Gewicht haben sie eine Dauer.
Da nicht zwingend die beste Auswahl gefunden werden muss, kann der schnelle Greedy-Algorithmus eingesetzt werden, bei dem der Belegungsplan immer um den nächstbesten zeitlich noch passenden Auftrag erweitert wird. Das Kriterium für den "besten" Auftrag muss dabei definiert werden. Für die Problemstellung ist der Wert pro Zeit ein vielversprechendes Kriterium.
### <font color='blue'>**Algorithmierung**</font>
Die Aufträge werden als einfache Klasse mit den o.g. Attributen umgesetzt. Dabei erhalten sie die `__init__()`-Methode. Die Klasse Auftrag erhält außerdem eine Implementierung der `__repr__()`-Methode. Wenn diese Methode definiert ist, können Objekte der entsprechenden Klasse mit `print(objekt)` verwendet werden, wobei der in der Methode zusammengestellte String ausgegeben wird.
Eine weitere Klasse `Maschinenbelegungsplan` verwaltet die Auswahl der Aufträge. Als Attribut hat sie die maximale Planungsdauer `planungsdauer` und eine Liste mit den geplanten Aufträgen. Diese Liste wird von zwei Methoden verwaltet: `zurücksetzen()` (leert die Liste) und `hinzufuegen()`, die der Liste den übergebenen Auftrag hinzufügt, aber nur, wenn dieser zeitlich noch in die verbleibende Zeit passt. Die `__init__()`-Methode setzt die maximale Plandauer. Auch diese Klasse soll eine implementierung von `__repr__()` erhalten, die alle geplanten Aufträge, sowie die Gesamtdauer und Gesamtzeit ausgibt. Die Methoden `get_gesamtwert()` und `get_gesamtdauer()` stellen die entsprechenden Informationen zur Verfügung, die dadurch ermittelt werden, dass über die geplante Liste iteriert und das entsprechende Attribut aller Aufträge zusammengezählt wird.
Die zentrale Methode `greedy_planen()` erhält eine Liste mit möglichen Aufträgen. Diese Liste wird zunächst kopiert, damit Änderungen in der Liste keine Auswirkungen außerhalb der Methode haben. Nun muss beim Greedy-Algorithmus immer ein Auftrag den geplanten Aufträgen hinzugefügt werden, solange noch Aufträge verfügbar sind, die in die verbleibende Zeit passen. Dazu wird die kopierte Liste gefiltert, sodass sie nur noch Aufträge enthält, die eine kürzere Auftragsdauer als die verbleibende Zeit haben. Dies wird an eine Hilfmethode `_auftraege_filtern()` (wird später beschrieben) ausgelagert. Das vorangestellt `_` signalisiert, dass diese Methode nur von der Klasse selbst, nicht aber "von außen" verwendet werden soll. Anschließend beginnt eine Schleife, solange noch Aufträge in der gefilterten Liste vorhanden sind. Der beste Auftrag wird ausgewählt (ausgelagert an die Methode `_waehlen()`, die später beschrieben wird). Der ausgewählte Auftrag wird der Liste der geplanten Aufträge hinzugefügt, und aus der Liste zu planender Aufträge entfernt (dazu steht die Listenmethode `remove(element)`zur Verfügung). Anschließend wird die Liste wieder gefiltert, da sich die verbleibende Zeit geändert hat. Sobald kein Auftrag mehr in der Liste zu planender Aufträge vorhanden ist, ist der Algorithmus beendet. Die Auswahl ist im Attribut `geplante_auftraege` gespeichert und verfügbar. Die Methode `greedy_planen()` ist hier in einem Aktivitätsdiagramm skizziert:
%% Cell type:markdown id:07ceadb0 tags:
![](Pics/greedy_algo.svg)
%% Cell type:markdown id:a6e4c8cd tags:
In der internen Hilfmethode `_filter_auftraege()` wird eine leere Liste angelegt. Anschließend wird jeder Auftrag in der übergebenen Liste darauf geprüft, ob die Dauer kürzer als die verbleibende Zeit (maximale Zeit abzüglich der bereits geplanten Aufträge) ist. Falls ja, wird der Auftrag an der neuen Liste hinzugefügt. Zum Schluss wird die gefüllte Liste zurückgegeben. Die Methode `_filter_auftraege()` ist hier in einem Aktivitätsdiagramm skizziert:
%% Cell type:markdown id:e5c67335 tags:
![](Pics/Greedy_filter.svg)
%% Cell type:markdown id:a96beeb6 tags:
In der internen Hilfsmethode `_waehle()` wird der erste Auftrag aus der übergebenen Liste zwischengespeichert. Anschließend wird jeder weitere Auftrag der Liste daraufhin geprüft, ob er "besser" als der aktuell gespeicherte Auftrag ist. Bei unserem gewählten Kriterium wird dazu der Quotient aus Wert und Dauer verglichen. Falls der neue Auftrag "besser" ist, dann wird der neue Auftrag anstelle des gespeicherten Auftrags gespeichert. Sind alle Aufträge geprüft ist der "beste" Auftrag gespeichert und kann zurückgegeben werden. Die Methode `_waehle()` ist hier in einem Aktivitätsdiagramm skizziert:
%% Cell type:markdown id:2c705209 tags:
![](Pics/Greedy_waehlen.svg)
%% Cell type:markdown id:54a0eed7 tags:
Die gesamte Klassenstruktur in einem UML-Diagramm:
%% Cell type:markdown id:f3742ac0 tags:
![](Pics/Greedy.svg)
%% Cell type:markdown id:cc7329cb tags:
### <font color='blue'>**Umsetzung**</font>
Auftrag:
%% Cell type:code id:30263737 tags:
``` python
class Auftrag:
def __init__(self, name, wert, dauer):
self.name = name
self.wert = wert
self.dauer = dauer
def __repr__(self):
return self.name + ", Wert: " + str(self.wert) + " Dauer: " + str(self.dauer) +"\n"
```
%% Cell type:markdown id:0f2aa2d6 tags:
Maschinenbelegungsplan:
%% Cell type:code id:694c2e0b tags:
``` python
class Maschinenbelegungsplan:
def __init__(self, planungsdauer):
self.planungsdauer = planungsdauer
self.geplante_auftraege = []
def get_gesamtwert(self):
w = 0
for auftrag in self.geplante_auftraege:
w += auftrag.wert
return w
def get_gesamtdauer(self):
t = 0
for auftrag in self.geplante_auftraege:
t += auftrag.dauer
return t
def zuruecksetzen(self):
self.geplante_auftraege = []
def hinzufuegen(self, auftrag):
if self.planungsdauer - self.get_gesamtdauer() >= auftrag.dauer:
self.geplante_auftraege.append(auftrag)
else:
print("Der Auftrag dauert zu lange für die verbleibende Zeit")
def _filter_auftraege(self, auftraege):
restzeit = self.planungsdauer - self.get_gesamtdauer()
temp = []
for auftrag in auftraege:
if auftrag.dauer <= restzeit:
temp.append(auftrag)
return temp
# Alternative zu temp und expliziter Schleife mit list-comprehension
# return [auftrag for auftrag in auftraege if auftrag.dauer <= restzeit]
def _waehle(self, auftraege):
temp_auswahl = auftraege[0]
for auftrag in auftraege[1:]:
if auftrag.wert / auftrag.dauer > temp_auswahl.wert / temp_auswahl.dauer:
temp_auswahl = auftrag
return temp_auswahl
def greedy_planen(self, ext_auftraege):
auftraege = ext_auftraege.copy()
auftraege = self._filter_auftraege(auftraege)
while len(auftraege)>0:
auswahl = self._waehle(auftraege)
self.hinzufuegen(auswahl)
auftraege.remove(auswahl)
auftraege = self._filter_auftraege(auftraege)
def __repr__(self):
ausgabe = "Der Maschinenbelegungsplan enthaelt:\n"
for auftrag in self.geplante_auftraege:
ausgabe += str(auftrag)
ausgabe += "Gesamtwert: " + str(self.get_gesamtwert()) + "\nGesamtdauer: " + str(self.get_gesamtdauer()) + "\n"
return ausgabe
```
%% Cell type:markdown id:188af0d7 tags:
### <font color='blue'>**Anwendung**</font>
In diesem Test kann die Implementierung ohne den Greedy-Algorithmus getestet werden. Die Methoden `greedy_planen()`, `_filter_auftraege()` und `_waehle()` werden noch nicht verwendet. Erweitere den Test gerne um mehreren Aufträgen.
%% Cell type:code id:b528354b tags:
``` python
A1 = Auftrag("Beispielauftrag", 50, 20)
print(A1)
masch1 = Maschinenbelegungsplan(100)
masch1.hinzufuegen(A1)
print(masch1)
masch1.zuruecksetzen()
print(masch1)
```
%% Output
Beispielauftrag, Wert: 50 Dauer: 20
Der Maschinenbelegungsplan enthaelt:
Beispielauftrag, Wert: 50 Dauer: 20
Gesamtwert: 50
Gesamtdauer: 20
Der Maschinenbelegungsplan enthaelt:
Gesamtwert: 0
Gesamtdauer: 0
%% Cell type:markdown id:5bb0b4ff tags:
In diesem Test wird der Greedy Algorithmus mit einer Reihe von Aufträgen geprüft. Füge gerne weitere Aufträge hinzu odere ändere die Daten, um verschiedene Ergebnisse zu ermitteln.
%% Cell type:code id:649ac8f6 tags:
``` python
# Bei dem folgenden Test und dem Kriterium Wert/Zeit sollte das Ergebnis die Auftraege 2,4,5,6 enthalten.
A1 = Auftrag("Auftrag 1", 40, 100)
A2 = Auftrag("Auftrag 2", 35, 50)
A3 = Auftrag("Auftrag 3", 18, 45)
A4 = Auftrag("Auftrag 4", 4, 20)
A5 = Auftrag("Auftrag 5", 10, 10)
A6 = Auftrag("Auftrag 6", 2, 5)
a_liste = [A1, A2, A3, A4, A5, A6]
masch1.zuruecksetzen()
masch1.greedy_planen(a_liste)
print(masch1)
```
%% Output
Der Maschinenbelegungsplan enthaelt:
Auftrag 5, Wert: 10 Dauer: 10
Auftrag 2, Wert: 35 Dauer: 50
Auftrag 6, Wert: 2 Dauer: 5
Auftrag 4, Wert: 4 Dauer: 20
Gesamtwert: 51
Gesamtdauer: 85
%% Cell type:markdown id:c0846c79 tags:
### <font color='blue'>**Anregungen zum selbst Programmieren:**</font>
* Beim Greedy-Algorithmus können verschiedene Bewertungskriterien zum Einsatz kommen, z.B. der höchste Wert und die kleinste Dauer (wir verwenden bisher Wert/Dauer). Füge mehrere Abwandlungen der `_waehle()` Methode hinzu, die nach diesen anderen Kriterien sortieren. Das zu verwendende Kriterium soll der Methode `greedy_planen()` als zusätzliches Argument übergeben werden. Abhängig von diesem Argument soll eine entsprechende `_waehle()`-Methode verwendet werden. Vergleiche die erhaltenen Auswahlen mit dem "Wert pro Dauer"-Kriterium.
* Verbinde das Ergebnis dieser Übung mit der letzten Übung, sodass die Maschine die Warteschlange entsprechend der Ergebnisse des Greedy-Algorithmus plant. Überlege dir dazu eine Programmarchitektur (z.B. ob der Belegungsplan innerhalb der Maschine gespeichert sein soll). Hier gibt es viele verschiedene Möglichkeiten. Teilweise sind Anpassungen erforderlich (z.B. da wir in dieser Übung den Aufträgen nur die für den Algorithmus relevanten Informationen gegeben haben. In der anderen Übung waren mehr Daten erforderlich).
This diff is collapsed.
Semester_2/Einheit_04/Pics/.ipynb_checkpoints/Mutation-1-checkpoint.gif

1.29 MiB

Semester_2/Einheit_04/Pics/.ipynb_checkpoints/Mutation-2-checkpoint.gif

1.16 MiB

Semester_2/Einheit_04/Pics/.ipynb_checkpoints/Mutation-3-checkpoint.gif

744 KiB

<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="550px" preserveAspectRatio="none" style="width:417px;height:550px;" version="1.1" viewBox="0 0 417 550" width="417px" zoomAndPan="magnify"><defs><filter height="300%" id="fgrty9rvwu9y2" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><ellipse cx="211.5" cy="20" fill="#000000" filter="url(#fgrty9rvwu9y2)" rx="10" ry="10" style="stroke: none; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#fgrty9rvwu9y2)" height="39.0679" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="171" x="126" y="50"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="151" x="136" y="74.9659">initialisiere Population</text><rect fill="#FEFECE" filter="url(#fgrty9rvwu9y2)" height="39.0679" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="296" x="63.5" y="176.1358"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="276" x="73.5" y="201.1018">bestimme Fitnesswert für Elternselektion</text><rect fill="#FEFECE" filter="url(#fgrty9rvwu9y2)" height="39.0679" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="292" x="65.5" y="235.2038"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="272" x="75.5" y="260.1697">selektiere Individuen/Eltern für Paarung</text><rect fill="#FEFECE" filter="url(#fgrty9rvwu9y2)" height="39.0679" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="197" x="113" y="294.2717"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="177" x="123" y="319.2376">erzeuge Rekombinationen</text><rect fill="#FEFECE" filter="url(#fgrty9rvwu9y2)" height="39.0679" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="157" x="133" y="359.3056"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="137" x="143" y="384.2716">erzeuge Mutationen</text><rect fill="#FEFECE" filter="url(#fgrty9rvwu9y2)" height="39.0679" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="335" x="44" y="418.3735"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="315" x="54" y="443.3395">bestimme Fitnesswert für Populationsselektion</text><rect fill="#FEFECE" filter="url(#fgrty9rvwu9y2)" height="39.0679" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="300" x="61.5" y="477.4415"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="280" x="71.5" y="502.4074">selektiere Individuen für neue Population</text><polygon fill="#FEFECE" filter="url(#fgrty9rvwu9y2)" points="141,109.0679,282,109.0679,294,121.0679,282,133.0679,141,133.0679,129,121.0679,141,109.0679" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="30" x="215.5" y="148.0339">nein</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="141" x="141" y="126.4999">Stopkriteria erreicht?</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="12" x="117" y="116.9659">ja</text><ellipse cx="24" cy="167.0679" fill="none" filter="url(#fgrty9rvwu9y2)" rx="10" ry="10" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="24.5" cy="167.5679" fill="#000000" filter="url(#fgrty9rvwu9y2)" rx="6" ry="6" style="stroke: none; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="211.5" y1="30" y2="50"/><polygon fill="#A80036" points="207.5,40,211.5,50,215.5,40,211.5,44" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="211.5" y1="215.2038" y2="235.2038"/><polygon fill="#A80036" points="207.5,225.2038,211.5,235.2038,215.5,225.2038,211.5,229.2038" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="211.5" y1="274.2717" y2="294.2717"/><polygon fill="#A80036" points="207.5,284.2717,211.5,294.2717,215.5,284.2717,211.5,288.2717" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="211.5" y1="333.3396" y2="359.3056"/><polygon fill="#A80036" points="207.5,349.3056,211.5,359.3056,215.5,349.3056,211.5,353.3056" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="211.5" y1="398.3735" y2="418.3735"/><polygon fill="#A80036" points="207.5,408.3735,211.5,418.3735,215.5,408.3735,211.5,412.3735" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="211.5" y1="457.4415" y2="477.4415"/><polygon fill="#A80036" points="207.5,467.4415,211.5,477.4415,215.5,467.4415,211.5,471.4415" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="211.5" y1="133.0679" y2="176.1358"/><polygon fill="#A80036" points="207.5,166.1358,211.5,176.1358,215.5,166.1358,211.5,170.1358" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="211.5" y1="516.5094" y2="526.5094"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="391" y1="526.5094" y2="526.5094"/><polygon fill="#A80036" points="387,339.3056,391,329.3056,395,339.3056,391,335.3056" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="391" x2="391" y1="121.0679" y2="526.5094"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="391" x2="294" y1="121.0679" y2="121.0679"/><polygon fill="#A80036" points="304,117.0679,294,121.0679,304,125.0679,300,121.0679" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="129" x2="24" y1="121.0679" y2="121.0679"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="24" x2="24" y1="121.0679" y2="157.0679"/><polygon fill="#A80036" points="20,147.0679,24,157.0679,28,147.0679,24,151.0679" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="211.5" x2="211.5" y1="89.0679" y2="109.0679"/><polygon fill="#A80036" points="207.5,99.0679,211.5,109.0679,215.5,99.0679,211.5,103.0679" style="stroke: #A80036; stroke-width: 1.0;"/><!--
@startuml
skinparam defaultFontSize 14
skinparam classAttributeIconSize 0
scale max 1024 width
start
:initialisiere Population;
while (Stopkriteria erreicht?) is (nein)
:bestimme Fitnesswert für Elternselektion;
:selektiere Individuen/Eltern für Paarung;
:erzeuge Rekombinationen;
:erzeuge Mutationen;
:bestimme Fitnesswert für Populationsselektion;
:selektiere Individuen für neue Population;
endwhile (ja)
stop
@enduml
PlantUML version 1.2018.13(Mon Nov 26 18:11:51 CET 2018)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 11.0.18+10-post-Ubuntu-0ubuntu120.04.1
Operating System: Linux
OS Version: 5.15.0-71-generic
Default Encoding: UTF-8
Language: de
Country: DE
--></g></svg>
\ No newline at end of file
This diff is collapsed.
Semester_2/Einheit_04/Pics/Chromosom.png

29.6 KiB

Semester_2/Einheit_04/Pics/Codierung.png

80.1 KiB

Semester_2/Einheit_04/Pics/Cross-Over-1.gif

1.81 MiB