You are on page 1of 21

Διακριτό πρόβλημα σακιδίου

(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

„ Ορισμός υπο-προβλημάτων

„ Σύνδεση βέλτιστων λύσεων


(αναδρομική σχέση)

„ Κατασκευή του πίνακα βέλτιστων


λύσεων
Δυναμικός Προγραμματισμός/0-1 Knapsack

fn (b): τιμή βέλτιστης λύσης με το πολύ n


αντικείμενα
fn-1 (b): τιμή βέλτιστης λύσης με το πολύ n-1
αντικείμενα
ί f (b) =f (b- a )+ c
n n-1 n n

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

fn (b): τιμή βέλτιστης λύσης με το πολύ n αντικείμενα


fn-1 (b): τιμή
ι ή βέλτιστης
βέλ ι ης λύσης
λύ ης μεε τοο πολύ
ολύ n-1
n 1 αντικείμενα
αν ικεί ενα
Δυναμικός Προγραμματισμός/αναδρομική σχέση
Δυναμικός Προγραμματισμός
Δυναμικός Προγραμματισμός (παράδειγμα) / εύρεση της τιμής / κατασκευή πίνακα

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

You might also like