Zum Inhalt springen

Dynamische Programmierung - Spezielles Problem


rohamis7

Empfohlene Beiträge

Hallo zusammen und guten Tag,

ich schreibe nun zum ersten Mal hier (gerade registriert, wusste gar nicht dass es dieses Forum gibt. Richtig schön!).

Was mich dazu gebracht hat, mich hier zu registrieren (aber ich denke ich werde dieses Forum so oder so auch für andere Themen benutzen ab jetzt) ist die Dynamische Programmierung.

Ich soll eine Aufgabe bewältigen, bei der ich ein paar Sachen nicht verstehen kann.

Ich habe einen Startpunkt, und einen Endpunkt, wo eine Fertigung eines Produktes statt findet.

Es gibt allerdings 2 Wege von Start nach Ende, A und B.

Auf jedem Weg gibt es i Stationen. Bei jeder Station benötigt die Fertigung eine bestimmte Zeit, bis das Produkt zur nächsten rüber geht. Es kann auch von Station SA(i) nach SB(i+1) gehen, dass heist zB. von SA(1) nach SB(2) (also kreuzweise) der Schritt erfolgen, allerdings braucht das auch Zeit (tA ist die Zeit von eine Station A(i) nach B(i+1) und tB ist die Zeit von eine Station B(i) nach A(i+1)).

Gesucht ist der Weg, von Start nach Ende, wo ein Produkt mit der kürzeste Zeit fertiggestellt wird.

Im Anhang ein Bild davon.

Mein Problem ist, ich kann nicht begreifen, wie genau es rekursiv laufen soll, da ich schon ein Rahmenprogramm habe, wo ich halt den Algorithmus implementieren soll.

Hier die Funktion:


void loesen( Zeiten sA, Zeiten sB, Zeiten tA, Zeiten tB, Lauf optA, Lauf optB, Zeit *sumA, Zeit *sumB, int i, int n )

Dabei sind:

- sA, sB : die Zeiten, die eine Station braucht

- tA, tB : die Zeiten, die das Produkt braucht um von A nach B zu kommen

- optA, optB : Felder mit 0 oder 1 bzw. 'A' oder 'B'.. Das wird dann am Ende für die Ausgabe des Weges benutzt

- sumA und sumB : dienen wohl als die bis dahin gespeicherte Zeit

- i : Laufindex von 0 bis n-1

- n : die Länge der Fertigung

Ich stecke schon seit 4 Tagen, kann aber keine richtige Lösung bzw. keine richtig Logik dazu finden.

Ich frage hier nicht nach eine fertige Lösung, nein, das soll ich ja selbst machen.

Aber ich brauche nur einen "Schupser" um halt richtig das ganze zu lösen. Und das, weil ich halt hier 2 Summen der bis dahin erstellten min. Zeiten habe, und 2 optimalen Wege. Das irritiert mich ein bisschen.

Danke

post-82060-14430449002712_thumb.png

Bearbeitet von rohamis7
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo und danke für deine Antwort.

Ich habe das verstanden was du meinst, soweit war ich auch.

Schnellster Weg bis einschliesslich SA entweder

- schnellster Weg durch SA[i-1], danach direkt zu SA, oder

- schnellster Weg durch SB[i-1], danach Strassenwechsel zu SA

und natürlich analog bei Vertauschung von A und B.

Nur ich weiss nicht so recht wie ich das in dem Code (in C) eintragen soll, und das auch noch als rekursion. Und vor allem, in genau dieser Funktion mit diesen Parametern



void loesen( Zeiten sA, Zeiten sB, Zeiten tA, Zeiten tB, Lauf optA, Lauf optB, Zeit *sumA, Zeit *sumB, int i, int n )

Muss ich die erste Station extra an sich alleine betrachten? Wenn ich eine Überprüfung mache wie diese hier:


if((optA[i-1]+sA[i]) <= (optB[i-1]+tB[i-1]+sA[i]))

{

  optA[i] = optA[i-1]+sA[i];

  // rekursion hier

}

else

{

  optA[i] = optB[i-1]+tB[i-1]+sA[i];

  // rekurion hier

}

weiss ich nicht so genau was ich mit sumA bzw. sumB machen soll, bzw. wie ich die Rekursion aufrufe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ganze via Rekursion zu lösen, ist ein denkbar schlechter Weg. Dieses Problem kann man als Netzflussproblem (minimum-cost flow problem) auffassen, das man mit Hilfe eines leicht veränderten Simplexverfahren lösen kann. Bei größeren Netzen ist die Laufzeit der Rekursion nicht mehr gut.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja ich weiss dass die Rekursion in dem Fall nicht geeignet ist.

Aber so lautet ja meine Aufgabe. Da geht kein Weg dran vorbei.

Daher auch meine ganze Problematik an der Sache.

Ich muss das also so lösen, wie vorgegeben. Mit Rekursion und mit der oben stehenden Funktion und auch mit dessen Parameter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...