Professional Documents
Culture Documents
L26 DPKnapsack
L26 DPKnapsack
(Dιscrete Knapsack)
Input: | X |= n c i , ai , b integers
Output: Y ⊆ X s.t. ∑ ai ≤ b
x i ∈Y
and MAX profit
Instance:
c: 10, 5, 8
a: 33, 2
2, 2
b=4, n=3
0-1 Knapsack
xi ∈ { 1,0 }
n n
Max ∑ ci xi ∑ ai xi ≤ b
i =1 i =1
Instance:
max 10 x1 + 5 x2 + 8 x3
3 x1 + 2 x2 + 2 x3≤ 4
G d K
Greedy Knapsackk ((n, c, a, b)
c j1 c j2 c jjn
ci
i n n o n -i n c r e a s i n g o r d e r ≥ ≥ ... ≥
ai a j1 a j2 a jn
= ∅
Y ::=
fo r i := 1 to n d o
if b ≥ a i th e n
b e g in
Y := Y ∪ { x i }
b := b - a i
end
r e tu r n Y
Dynamic Programming
Ορισμός υπο-προβλημάτων
b-an b
0
an
fn (b) =max
max fn-1
n 1 (b), fn-1 (b- an))+ cn
n 1 (b
Δυναμικός Προγραμματισμός/0-1 Knapsack/ n x (b+1)
υποπροβλήματα
fκ (y):
( ) τιμή
ή βέλτιστης
βέλ λύσης
λύ με το πολύ
λύ κ αντικείμενα
ί
fκ-1 (y): τιμή βέλτιστης λύσης με το πολύ κ-1 αντικείμενα
0 y- ak y fκ (y) =fκ-1
κ 1 (y
(y- ak))+ ck
ak
0 y fκ-1 (y)
ak
fκ (y) =max
max fκ-1
κ 1 (y), fκ-1 (y- ak))+ ck
κ 1 (y
Δυναμικός Προγραμματισμός/0-1
K
Knapsackk
Αρχική συνθήκη
f1 (y): τιμή βέλτιστης λύσης με ένα αντικείμενο
0 y
f1 (y)= c1 if a1 ≤ y a1
f1 (y)= 0 if a1 > y
0 y
a1
Δυναμικός Προγραμματισμός (παράδειγμα) / υποπροβλήματα
0 1 2 . . b- an . . . b
1
2
.
i
.
n-1
+cn
n
max z = 20 x1 + 16 x2 + 11x3 + 9 x4 + 7 x5 + x6
9x1 + 8 x2 + 6 x3 + 5 x4 + 4 x5 + x6 ≤ 12
x j ∈{0,1}
0 1 2 3 4 5 6 7 8 9 10 11 12
1 0 0 0 0 0 0 0 0 0 20 20 20 20
Δυναμικός Προγραμματισμός (παράδειγμα)/ εύρεση της τιμής
max z = 20 x1 + 16 x2 + 11x3 + 9 x4 + 7 x5 + x6
9x1 + 8 x2 + 6 x3 + 5 x4 + 4 x5 + x6 ≤ 12
x j ∈{0,1}
0 1 2 3 4 5 6 7 8 9 10 11 12
1 0 0 0 0 0 0 0 0 0 20 20 20 20
+16
+16
2 0 0 0 0 0 0 0 0 16 20 20 20 20
Δυναμικός Προγραμματισμός (παράδειγμα)/ εύρεση της τιμής
Knapsack
max z = 20 x1 + 16 x2 + 11x3 + 9 x4 + 7 x5 + x6
9x1 + 8 x2 + 6 x3 + 5 x4 + 4 x5 + x6 ≤ 12
x j ∈{0,1}
0 1 2 3 4 5 6 7 8 9 10 11 12
1 0 0 0 0 0 0 0 0 0 20 20 20 20
2 0 0 0 0 0 0 0 0 16 20 20 20 20
+11
+11
3 0 0 0 0 0 0 11 11 16 20 20 20 20
Δυναμικός Προγραμματισμός (παράδειγμα)/ εύρεση της τιμής
Knapsack
max z = 20 x1 + 16 x2 + 11x3 + 9 x4 + 7 x5 + x6
9x1 + 8 x2 + 6 x3 + 5 x4 + 4 x5 + x6 ≤ 12
x j ∈{0,1}
0 1 2 3 4 5 6 7 8 9 10 11 12
1 0 0 0 0 0 0 0 0 0 20 20 20 20
2 0 0 0 0 0 0 0 0 16 20 20 20 20
3 0 0 0 0 0 0 11 11 16 20 20 20 20
+9
+9
4 0 0 0 0 0 9 11 11 16 20 20 20 20
Knapsack
Δυναμικός Προγραμματισμός (παράδειγμα) / εύρεση της τιμής
max z = 20 x1 + 16 x2 + 11x3 + 9 x4 + 7 x5 + x6
9x1 + 8 x2 + 6 x3 + 5 x4 + 4 x5 + x6 ≤ 12
x j ∈{0,1}
0 1 2 3 4 5 6 7 8 9 10 11 12
1 0 0 0 0 0 0 0 0 0 20 20 20 20
2 0 0 0 0 0 0 0 0 16 20 20 20 20
3 0 0 0 0 0 0 11 11 16 20 20 20 20
4 0 0 0 0 0 9 11 11 16 20 20 20 20
+7 +7
5 0 0 0 0 7 9 11 11 16 20 20 20 23
Δυναμικός Προγραμματισμός (παράδειγμα) / εύρεση της τιμής
Knapsack
max z = 20 x1 + 16 x2 + 11x3 + 9 x4 + 7 x5 + x6
9x1 + 8 x2 + 6 x3 + 5 x4 + 4 x5 + x6 ≤ 12
x j ∈{0,1}
0 1 2 3 4 5 6 7 8 9 10 11 12
1 0 0 0 0 0 0 0 0 0 20 20 20 20
2 0 0 0 0 0 0 0 0 16 20 20 20 20
3 0 0 0 0 0 0 11 11 16 20 20 20 20
4 0 0 0 0 0 9 11 11 16 20 20 20 20
5 0 0 0 0 7 9 11 11 16 20 20 20 23
6 0 1 1 1 7 9 11 12 16 20 21 21 23
Δυναμικός Προγραμματισμός / αλγόριθμος σακιδίου
initialization;
f1 (y)
for κ=2 to n do
for y=0 to b do
fκ (y) =max fκ-1 (y), fκ-1 (y- ak)+ ck
Απομνημόνευσε αν το κ αντικείμενο επελέγη (στο πίνακα
xκ(y) (1 αν ναι / 0 αν όχι))
endfor
endfor
Δυναμικός Προγραμματισμός (παράδειγμα) / εύρεση της δομής
Knapsack
max z = 20 x1 + 16 x2 + 11x3 + 9 x4 + 7 x5 + x6
9x1 + 8 x2 + 6 x3 + 5 x4 + 4 x5 + x6 ≤ 12
x j ∈{0,1}
0 1 2 3 4 5 6 7 8 9 10 11 12
1 0 0 0 0 0 0 0 0 0 1 1 1 1
2 0 0 0 0 0 0 0 0 1 0 0 0 0
3 0 0 0 0 0 0 1 1 0 0 0 0 0
x6 (12) = 0
4 0 0 0 0 0 1 0 0 0 0 0 0 0
x5 (12) = 1
x4 (8) = 0
5 0 0 0 0 1 0 0 0 0 0 0 0 1
x2 (8) = 1 6 0 1 1 1 0 0 0 1 0 0 1 1 0
Δυναμικός Προγραμματισμός (παράδειγμα)/εύρεση της δομής
Knapsack
max z = 20 x1 + 16 x2 + 11x3 + 9 x4 + 7 x5 + x6
9x1 + 8 x2 + 6 x3 + 5 x4 + 4 x5 + x6 ≤ 12
x j ∈{0,1}
0 1 2 3 4 5 6 7 8 9 10 11 12
1 0 0 0 0 0 0 0 0 0 1 1 1 1
2 0 0 0 0 0 0 0 0 1 0 0 0 0
3 0 0 0 0 0 0 1 1 0 0 0 0 0
4 0 0 0 0 0 1 0 0 0 0 0 0 0
5 0 0 0 0 1 0 0 0 0 0 0 0 1
6 0 1 1 1 0 0 0 1 0 0 1 1 0
Δυναμικός Προγραμματισμός / αλγόριθμος σακιδίου/εύρεση δομής
k=n, y=b
while k>0 do y=y-a2 y=y-a5 y=b
if xκ(y) = 1 then
print (k)
yy=yy - aκ 0 1 2 3 4 5 6 7 8 9 10 11 12
endif
1 0 0 0 0 0 0 0 0 0 1 1 1 1
k=k-1
2 0 0 0 0 0 0 0 0 1 0 0 0 0
endwhile
3 0 0 0 0 0 0 1 1 0 0 0 0 0
4 0 0 0 0 0 1 0 0 0 0 0 0 0
k-1 5 0 0 0 0 1 0 0 0 0 0 0 0 1
k=n 6 0 1 1 1 0 0 0 1 0 0 1 1 0
Δυναμικός Προγραμματισμός / 0-1 knapsack