PDA

View Full Version : [Frage] 5.6


abumaster
25-05-2003, 15:41
mein Vorschlag,(hab noch nicht überprüft obs wirklich funzt):

Ich bilde mir zum besseren Verständnis einen Entscheidungsbaum mit den Pfaden EINPACKEN/NICHTEINPACKEN
folgedes gilt: wenn ich das Element hinzufüge und die Obere Schranke meines Unterbaumes kleiner ist als die Untere Schranke des gesamten Baumes kann ich diesen Unterbaum spritzen.

somit muss ich wesentlich weniger Pfade durchlaufen. Wenn ich an einem Blatt angekommen bin Speichere ich den Wert und vergleich ihn mit den anderen Blättern.

der Baum sieht folgendermassen aus

0
/ \
a !a
/ \ / \
ab a!b !ab !a!b


Um die globale obere,untere Schranken zu berechnen muss ich die Elemente nach ihrem Nutzen absteigend sortieren.
Nun packe ich so viele Elemente fraktional ein bis er voll ist (d.h. es darf auch noch ein Teil des letzten El. genommen werden). somit erhalte ich die obere Schranke O.
das selbe Verfahren nur nicht fraktional. (d.h. das Element das ich aufteilen müsste kommt nich mehr rein).
somit erhalte ich die obere schranke U.
Somit habe ich auf alle Fälle eine Lösung mit Wert U.
Alle Lösungen die darunter sind kann ich vergessen.
Nun konstruiere ich den Baum und suche noch die Optimallösung.


start{
sortiere Elemente nach dem Nutzen (c/w)
berechne O, U Schranke //wie oben beschrieben
init: x[1...n]=[0...0];
einpacken(x, aktpos=1); //befinde mich in der Wurzel, muss entscheiden ob 1.El dazukommt oder nich
vergleiche die Ergebnisse und nimm das Beste
}


//Entscheidet anhand der neu entstehenden Schranken ob ein Element eingepackt wird oder nicht(auch beides möglich)
//und springt dann rekursiv tiefer in den Baum hinein
einpacken (x, aktpos) {
gewählt=false;
Wenn(OSchr(x,aktpos) >= U){
einpacken(x,aktpos+1)
gewählt=true;
}
x[aktpos]=1; //setze das aktElement auf "eingepackt" und betrachte die Schranke
Wenn(OSchr(x,aktpos)>=U){
einpacken(x,aktpos+1)}
gewählt=true;
Wenn gewählt = false; //bin offensichtlich am Blatt angekommen
}

//berechnet die obere Schranke eines Teilbaumes
OSchr(x,aktpos){

Gewicht = Summe von 1 bis aktpos (w[i]*x[i]); //die Elemente von 1 bis aktpos stehen schon fest
aktoos++;
while(Gewicht + w[aktpos] <= K){ //solange ich noch was einpacken kann
Gewicht += w[aktpos];
}
Wenn Gewicht < K{
splitte Element[aktpos] sodass der Rucksack voll ist; //Wieder fraktional zur Berechnung der lokalen Oberen Schranke
}
}

Tiniiiii
28-05-2003, 00:11
Kommt das morgen nicht mehr??? Oder gibt es einen Grund warum hier niemand postet? Branch & bound ist doch noch Stoff, oder?

lg

wolti
01-06-2003, 17:19
Ich hätte folgenden Vorschlag dazu, welcher sich meiner Meinung eh noch relativ gut an das B&B Verfahren im Skriptum hält.


P = {X, k, L, U}

X ... Zugehörigkeitsfunktion (Als Feld dargestellt)
k ... Welcher Gegenstand noch kommen darf
L ... Untere Schranke für diesen Rucksack
U ... Obere Schranke für diesen Rucksack

RucksackBranchBound(){
P0 = {X, k, 0, inf}
BerechneLowerB(P0); BerechneUpperB(P0)
Lmin = P0.L
P = {P0}

wiederhole {
/* Sind alle unteren schranken gleich der oberen Schranke, so
* sind wir fertig */
falls Pj.L = Pj.U für alle Pj e P

/* Ein ungelöstes Problem wählen */
wähle Pi e P mit k != 4 x

/* Wir schauen uns an wohin das Problem führen könnte und
* verfeinern es etwas */
P = P \ {Pi}

/* Eine neue Möglichkeit ist mit Gegenstand k drinnen. Wir
* Packen diesen ein, schauen ob die Lösung interessant wäre.
* Falls ja schauen wir ob sie besser ist als die alten und
* verwerfen diese.*/
Pi1=P1
Pi1.X[Pi1.k]=1; Pi1.k=Pi1.k+1;
BerechneUpperB(Pi1); BerechneLowerB(Pi1)
falls Pi1.U > Lmin {
/* Dieses Teilproblem ist noch interessant */
P = P u {Pi1}
falls Pi1.L > Lmin {
Lmin = Pi1.L; Entferne alle Pj mit Pj.U < Lmin
}
}

/* Wie bei Gegenstand 1 */
Pi2=P1
Pi2.X[Pi2.k]=0; Pi2.k=Pi2.k+1;
BerechneUpperB(Pi2); BerechneLowerB(Pi2)
falls Pi2.U > Lmin {
P = P u {Pi2}
falls Pi2.L > Lmin {
Lmin = Pi2.L; Entferne alle Pj mit Pj.U < Lmin
}
}
}

Lösung in P drinnen.
}


Grüße,
Wolti

Kasper
03-06-2003, 21:46
hi, hot do ned wer an verständlichen algo?