(Big One) C Language - 12 เทคนิคอัลกอริทึมแบบ dynamic-algorithm-programming5. Introduction
• ปรกติแล้วจะใช้แก้ปัญหาเชิง Optimization
• ลักษณะการทํางานของ DAG จะคล้ายกับ Divide-
and-Conquer
อ. กิตตินันท์ น้1อยมณี 5
อ้างอิงข้อมูลดีๆ จาก อาจาย์กรุง สินอภิรมย์สราญ
(http://pioneer.netserv.chula.ac.th/~skrung/2301365/Lecture011.html)
หมายเหตุ: Divide-and-Conquer จะใช้ในกรณีที่การคํานวณของปัญหาย่อย
(Sub-problem) ไม่ขึ้นต่อกัน เรียกลักษณะการทํางานอย่างนี้ว่า Top-down
approach คือการซอยย่อยปัญหาต่างๆ ออกเป็นชิ้นเล็กๆ แล้วจัดการแก้ปัญหา
จากปัญหาเล็กๆ ก่อน แล้วค่อยรวมกันไปเพื่อไปหาคําตอบโดยรวม
6. Introduction
• แต่ DAG จะใช้ในกรณีที่การคํานวณของปัญหา
ย่อย (Sub-problem) ขึ้นต่อกัน ซึ่งมีลักษณะการ
ทํางานในเชิง (Bottom-up Approach) โดยจะเริ่ม
จากปัญหาขนาดเล็กก่อน แล้วค่อยรวมกันจนได้
ปัญหาหลัก
อ. กิตตินันท์ น้1อยมณี 6
อ้างอิงข้อมูลดีๆ จาก อาจาย์กรุง สินอภิรมย์สราญ
(http://pioneer.netserv.chula.ac.th/~skrung/2301365/Lecture011.html)
8. Knapsack problem with DAG
• จะต้องทําการเก็บคําตอบของแต่ละรอบการ
ทํางานเอาไว้ เพื่อเปรียบเทียบหาคําตอบที่ดีที่สุด
• ดังนั้นเราจะดูทุกกรณีที่น่าจะเกิดขึ้นได้
อ. กิตตินันท์ น้1อยมณี 8
9. 1 2 3 4 5 6 7 8 9 10 11
0
1
2
3
4
อ. กิตตินันท์ น้1อยมณี 9
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
10. 1 2 3 4 5 6 7 8 9 10 11
0
1
2
3
4
อ. กิตตินันท์ น้1อยมณี 10
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
มูลค่า
น้ําหนัก
วิเคราะห์ตั้งแต่น้ําหนัก 1 จนถึงค่า Wx
วิเคราะห์ของทีละชิ้น
ตารางนี้จะเก็บมูลค่าของกรณีต่างๆ ทุกๆ
กรณี เพื่อหามูลค่าที่มากที่สุด
11. 1 2 3 4 5 6 7 8 9 10 11
0 1
1
2
3
4
อ. กิตตินันท์ น้1อยมณี 11
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 0, w = 1
ใส่ w0 ลงไปได้ เพราะ wj = w0 พอดี
12. 1 2 3 4 5 6 7 8 9 10 11
0 1 1
1
2
3
4
อ. กิตตินันท์ น้1อยมณี 12
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 0, w = 2
ใส่ w0 ลงไปได้อันเดียว เพราะตอนนี้
วัตถุมีแค่อันเดียวให้ใส่
13. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1
2
3
4
อ. กิตตินันท์ น้1อยมณี 13
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 0, w = 3 … 11
ใส่ w0 ลงไปได้อันเดียว เพราะตอนนี้
วัตถุมีแค่อันเดียวให้ใส่
14. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1
2
3
4
อ. กิตตินันท์ น้1อยมณี 14
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 1, w = 1
ใส่ w0 ลงไปได้ เพราะ wj = w0 พอดี
15. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6
2
3
4
อ. กิตตินันท์ น้1อยมณี 15
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 1, w = 2
ใส่ w1 ลงไปได้ เพราะน้ําหนักพอดี
และมีมูลค่ามากกว่า w0 ด้วย
16. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7
2
3
4
อ. กิตตินันท์ น้1อยมณี 16
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 1, w = 3
ใส่ w0 ลงไปได้ และใส่ w1 ลงไปได้
เพราะน้ําหนักพอดีเลย
17. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2
3
4
อ. กิตตินันท์ น้1อยมณี 17
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 1, w = 4 … 11
ใส่ได้แค่ 2 อย่าง เพราะวัตถุมีแต่ 2
อย่างเท่านั้น มูลค่าจึงได้ 7 เท่าเดิม
18. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2 1
3
4
อ. กิตตินันท์ น้1อยมณี 18
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 2, w = 1
ใส่ได้แค่ w0 เพราะน้ําหนักพอดี
19. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2 1 6
3
4
อ. กิตตินันท์ น้1อยมณี 19
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 2, w = 2
ใส่ได้แค่ w1 เพราะน้ําหนักพอดี
20. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2 1 6 7 7
3
4
อ. กิตตินันท์ น้1อยมณี 20
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 2, w = 3, 4
ใส่ได้แค่ w0 กับ w1 เพราะน้ําหนัก
พอดีกระเป๋าเลย
21. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2 1 6 7 7 18
3
4
อ. กิตตินันท์ น้1อยมณี 21
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 2, w = 5
ใส่ w2 ได้ เพราะน้ําหนัก 5 เท่าความ
จุกระเป๋าตอนนี้เลย
22. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2 1 6 7 7 18 19
3
4
อ. กิตตินันท์ น้1อยมณี 22
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 2, w = 6
ใส่ w2 ได้ แถมใส่ w0 ได้ เพราะความ
จุเต็มพอดี
23. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2 1 6 7 7 18 19 24
3
4
อ. กิตตินันท์ น้1อยมณี 23
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 2, w = 7
ใส่ w2 ได้ แถมใส่ w1 ได้ เพราะมี
มูลค่ามากกว่า w0 และความจุพอดี
24. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2 1 6 7 7 18 19 24 25
3
4
อ. กิตตินันท์ น้1อยมณี 24
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 2, w = 8
ใส่ w2 ได้ แถมใส่ w1 ได้ และ w0 ได้
ด้วย เพราะความจุพอดีเลย
25. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2 1 6 7 7 18 19 24 25 25 25 25
3
4
อ. กิตตินันท์ น้1อยมณี 25
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 2, w = 9 … 11
ใส่ w2 ได้ แถมใส่ w1 ได้ และ w0 ได้
ซึ่งได้แค่นั้น เพราะวัตถุมีแค่ 3 ชิ้น
26. 1 2 3 4 5 6 7 8 9 10 11
0 1 1 1 1 1 1 1 1 1 1 1
1 1 6 7 7 7 7 7 7 7 7 7
2 1 6 7 7 18 19 24 25 25 25 25
3 1 6 7 7 18 22 24 28 29 29 40
4 1 6 7 7 18 22 28 29 34 35 40
อ. กิตตินันท์ น้1อยมณี 26
0 1 2 3 4
V 1 6 18 22 28
0 1 2 3 4
W 1 2 5 6 7
w
n
Processing
n = 3 … 4, w = 1 … 11
และทําอย่างนี้ไปเรื่อยๆ จนครบทุก
ช่อง ทําให้ได้ค่าดังตาราง
27. Knapsack problem with DAG
• จะเห็นได้ว่า DAG จะคิดทุกๆ กรณีที่น่าจะมีโอกาส
เกิดขึ้นได้
• ซึ่งข้อดีก็คือเราจะได้ค่าที่ถูกต้องที่สุดอย่างแน่นอน
• แต่ข้อเสียก็คือกระบวนการในการค้นหาอาจต้อง
ใช้เวลานานขึ้น หากมีข้อมูลที่มากขึ้น
อ. กิตตินันท์ น้1อยมณี 27
28. Algorithm KnapsackDP( w[n], v[n], wx ) : array[n]
for i := 0 to n-1
for j := 0 to wx
if i – 1 < 0 then a := 0, Sa :=
else a := u[i-1, j], Sa := y[i-1, j]
if j – w[i] < 0 then b := - , Sb :=
else if j – w[i] = 0 OR i – 1 < 0 then b := v[i], Sb := {i}
else
b := u[ i-1, j-w[i] ] + v[i]
Sb := {i} y[ i-1, j-w[i] ]
if a > b then u[i, j] := a, y[i, j] := Sa
else u[i, j] := b, y[i, j] := Sb
x := y[ n-1, wx ]
Return x
End Algorithm อ. กิตตินันท์ น้1อยมณี 28