c language - 11 เทคนิคอัลกอริทึมแบบ greedy
TRANSCRIPT
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 1
เทคนิคอัลกอริทึมแบบ
Greedy
Advance Computer Programming
รหัสวิชา 32090207
อ. กิตตินนัท์ น้1อยมณี 1
เนื้อหา
1. Introduction
2. Shortest Path (Dijkstra)
3. Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 2
Introduction
อ. กิตตินนัท์ น้3อยมณี 3
Introduction
• Greedy แปลว่า ละโมบ หรือ ความละโมบ
• Greedy Algorithm เป็นอัลกอริทึมที่ง่ายๆ ไม่มี
ความซับซ้อนอะไร แค่เลือกทางที่ดูดีที่สุดใน
ขณะนั้นๆ ก็พอ
• เช่น ได้กําไรมากที่สุดโดยที่เสียหายน้อยที่สุด
• เช่น ใช้เวลาน้อยที่สุดแต่ได้ผลลัพธ์มากที่สุด
อ. กิตตินนัท์ น้1อยมณี 4
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 2
Introduction
ตัวอย่างยังคงมีมากกว่านั้น เช่น
• ปัญหาการทอนเหรียญ
• การเลือกกิจกรรม (Activity Select Problem)
• การเลือกของ Knapsack Problem
• ปัญหาการบริการลูกค้าให้มีเวลาในการรอน้อยที่สดุ
• ปัญหาการจัดการตารางงานเมื่อมี Deadline
อ. กิตตินนัท์ น้1อยมณี 5
Introduction
ตัวอย่างยังคงมีมากกว่านั้น เช่น
• ปัญหา Minimum Spanning Tree
• Huffman Code
• Prefix Code
• ฯลฯ
อ. กิตตินนัท์ น้1อยมณี 6
อ้างอิงข้อมลูดีๆ จาก อาจารย์กรงุ สินอภิรมย์สราญhttp://pioneer.netserv.chula.ac.th/~skrung/2301365/Lecture009.html
Shortest Path (Dijkstra)
อ. กิตตินนัท์ น้7อยมณี 7
Shortest Path (Dijkstra)
• Dijkstra อ่านว่า ไดค์สตรา
• Shortest Path หรือ วิถีสั้นที่สุด
• มันก็คือกราฟแบบมีน้ําหนักและมีทิศทาง
• หลักการคล้ายๆ ปัญหาของนักท่องเที่ยวที่
ต้องการไปเที่ยวให้ครบทุกเมืองโดยใช้ระยะทางที่
สั้นที่สุด
อ. กิตตินนัท์ น้1อยมณี 8
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 3
Shortest Path (Dijkstra)
อ. กิตตินนัท์ น้1อยมณี 9
12
34
510 100
20
40
1030
20
80
Shortest Path (Dijkstra)
อ. กิตตินนัท์ น้1อยมณี 10
1
100
แทนเมืองต่างๆ
แทนระยะห่างระหว่างเมืองและเส้นทางที่ต้องเดิน
Shortest Path (Dijkstra)
• ตาม Greedy Algorithm คือการเลือกทางที่ดีที่สุด
สั้นที่สุดโดยพิจารณาเฉพาะเหตุการณ์เฉพาะหน้า
เท่านั้น
อ. กิตตินนัท์ น้1อยมณี 11
Shortest Path (Dijkstra)
LOOP V
0 {1} 0
อ. กิตตินนัท์ น้1อยมณี 12
1 2 3 4 5
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 4
Shortest Path (Dijkstra)
LOOP V
0 {1} 0
อ. กิตตินนัท์ น้1อยมณี 13
1 2 3 4 5Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100 0+80 0+30 0+10
อ. กิตตินนัท์ น้1อยมณี 14
1 2 3 4 5
Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
อ. กิตตินนัท์ น้1อยมณี 15
1 2 3 4 5Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 10
อ. กิตตินนัท์ น้1อยมณี 16
1 2 3 4 5
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 5
Shortest Path (Dijkstra)
อ. กิตตินนัท์ น้1อยมณี 17
12
34
510 100
20
40
1030
20
80
ระยะทางรวม = 10 Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 10
อ. กิตตินนัท์ น้1อยมณี 18
1 2 3 4 5
Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 10
อ. กิตตินนัท์ น้1อยมณี 19
1 2 3 4 5Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10
อ. กิตตินนัท์ น้1อยมณี 20
1 2 3 4 5
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 6
Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+10 10
อ. กิตตินนัท์ น้1อยมณี 21
1 2 3 4 5Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
อ. กิตตินนัท์ น้1อยมณี 22
1 2 3 4 5
Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
2 {4} 20
อ. กิตตินนัท์ น้1อยมณี 23
1 2 3 4 5Shortest Path (Dijkstra)
อ. กิตตินนัท์ น้1อยมณี 24
12
34
510 100
20
40
1030
20
80
ระยะทางรวม = 20
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 7
Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
2 {4} 20
อ. กิตตินนัท์ น้1อยมณี 25
1 2 3 4 5Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
2 {4} 20+20 20+40 20
อ. กิตตินนัท์ น้1อยมณี 26
1 2 3 4 5
Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
2 {4} 20+2040
20+4060 20
อ. กิตตินนัท์ น้1อยมณี 27
1 2 3 4 5Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
2 {4} 20+2040
20+4060 20
3 {2} 40
อ. กิตตินนัท์ น้1อยมณี 28
1 2 3 4 5
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 8
Shortest Path (Dijkstra)
อ. กิตตินนัท์ น้1อยมณี 29
12
34
510 100
20
40
1030
20
80
ระยะทางรวม = 40 Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
2 {4} 20+2040
20+4060 20
3 {2} 40
อ. กิตตินนัท์ น้1อยมณี 30
1 2 3 4 5
Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
2 {4} 20+2040
20+4060 20
3 {2} 40 40+20
อ. กิตตินนัท์ น้1อยมณี 31
1 2 3 4 5Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
2 {4} 20+2040
20+4060 20
3 {2} 40 40+2060
อ. กิตตินนัท์ น้1อยมณี 32
1 2 3 4 5
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 9
Shortest Path (Dijkstra)
LOOP V
0 {1} 0 0+100100
0+8080
0+3030
0+1010
1 {5} 100 80 10+1020 10
2 {4} 20+2040
20+4060 20
3 {2} 40 40+2060
4 {3} 60อ. กิตตินนัท์ น้1อยมณี 33
1 2 3 4 5Shortest Path (Dijkstra)
LOOP C
0 {2, 3, 4, 5} 0 0+100100
0+8080
0+3030
0+1010
1 {2, 3, 4} 100 80 10+1020 10
2 {2, 3} 20+2040
20+4060 20
3 {3} 40 40+2060
4 60อ. กิตตินนัท์ น้1อยมณี 34
1 2 3 4 5
Shortest Path (Dijkstra)
อ. กิตตินนัท์ น้1อยมณี 35
12
34
510 100
20
40
1030
20
80
ระยะทางรวม = 60 Shortest Path (Dijkstra)
• เมื่อเข้าใจวิธีคิดแล้ว ลองมาดู Pseudo Code กัน
อ. กิตตินนัท์ น้1อยมณี 36
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 10
Shortest Path (Dijkstra)Algorithm Dijkstra ( L[1…n, 1…n] ) : array[2…n]
C := {2, 3, 4, …, n}for i := 2 to n
D[i] := L[1, i]repeat n-2 times
v := some element of C minimizing D[v]C := C – {v}for each w ∈ C do
D[w] := min( D[w], D[v]+L[v, m] )return D
End Algorithmอ. กิตตินนัท์ น้1อยมณี 37
Shortest Path (Dijkstra)Algorithm Dijkstra ( L[1…n, 1…n] ) : array[2…n]
C := {2, 3, 4, …, n}for i := 2 to n
D[i] := L[1, i]repeat n-2 times
v := some element of C minimizing D[v]C := C – {v}for each w ∈ C do
D[w] := min( D[w], D[v]+L[v, m] )return D
End Algorithmอ. กิตตินนัท์ น้1อยมณี 38
เซ็ตของเมืองที่เหลือให้ D เก็บระยะทางของเมือง 1 กับเมืองทั้งหมด
เลือกเสร็จก็ลบเมืองนั้นไป
หาระยะทางที่นอ้ยที่สุด
Shortest Path (Dijkstra)
โดย
• v คือ เมืองที่เลือกไป (ที่ระยะสั้นที่สุด)
• C คือ เซ็ตของเมืองที่ยังไม่ได้ไป
• D คือ ค่าของการประมวลผลระยะทาง
อ. กิตตินนัท์ น้1อยมณี 39
Shortest Path (Dijkstra)
อ. กิตตินนัท์ น้1อยมณี 40
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 11
Shortest Path (Dijkstra)
อ. กิตตินนัท์ น้1อยมณี 41
ลองทําด้วยตัวเองดูนะครับ???Knapsack Problem
with Greedy Algorithm
อ. กิตตินนัท์ น้42อยมณี 42
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 43
• Knapsack อ่านว่า แน๊บ-แซ่ก (Knapsack)
• แปลว่า เป้ หรือ กระเป๋าสายพายหลัง
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 44
• Knapsack Problem คือปัญหาในการเลือกของเพื่อ
หยิบใส่กระเป๋า โดยกระเป๋ามีความจุจํากัด (ไม่งั้น
ขาด)
• เหมือนกับการเดินเข้าไปในถ้าํแล้วเจอเพชรเม็ดโต
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 12
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 45
• ตามหลักการของ Greedy Algorithm แล้ว คือการ
หยิบเพชรออกจากถ้ําโดยให้ได้มูลค่าเยอะที่สุด
• สิ่งที่ต้องระวังมากที่สุดก็คือ จะต้องระวังกระเป๋า
ขาด เพราะหยิบเพชรหนักเกินความจุของกระเป๋า
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 46
• สมมติว่ามีเพชรอยู่ทั้งหมด 5 ก้อน (n = 5)
• มูลค่าของเพชรทั้งหมดเรียงกันดังนี้
• น้ําหนักของเพชรทั้งหมดเรียงกันดังนี้
0 1 2 3 4
Vi 1 6 18 22 24
0 1 2 3 4
Wi 1 2 5 6 7
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 47
• และให้ความจุของกระเป๋าเท่ากับ 11 (wx=11)
• อัตราส่วนระหว่าง Value ต่อ Weight ได้ดังนี้
0 1 2 3 4
Vi / Wi 1 3 3.6 3.67 3.43
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 48
• สรุปได้ข้อมูลดังนี้
0 1 2 3 4
Vi / Wi 1 3 3.6 3.67 3.43
0 1 2 3 4
Vi 1 6 18 22 24
0 1 2 3 4
Wi 1 2 5 6 7
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 13
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 49
ดังนั้น การหยิบของใส่กระเป๋าก็มีวิธีการอยู่ดังนี้
(Select Function)
1. Min(Wi)
2. Max(Vi)
3. Max(Vi/Wi)
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 50
0 1 2 3 4
Vi / Wi 1 3 3.6 3.67 3.43
0 1 2 3 4
Vi 1 6 18 22 24
0 1 2 3 4
Wi 1 2 5 6 7
0 1 2 3 4 Value1 1 1 0 0 25Min(Wi)
1
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 51
0 1 2 3 4
Vi / Wi 1 3 3.6 3.67 3.43
0 1 2 3 4
Vi 1 6 18 22 24
0 1 2 3 4
Wi 1 2 5 6 7
0 1 2 3 4 Value1 1 0 0 1 31Max(Vi)
2Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 52
0 1 2 3 4
Vi / Wi 1 3 3.6 3.67 3.43
0 1 2 3 4
Vi 1 6 18 22 24
0 1 2 3 4
Wi 1 2 5 6 7
0 1 2 3 4 Value0 0 1 1 0 40Max(Vi/Wi)
3
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 14
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 53
0 1 2 3 4 Value0 0 1 1 0 40Max(Vi/Wi)
3
0 1 2 3 4 Value1 1 0 0 1 31Max(Vi)
2
0 1 2 3 4 Value1 1 1 0 0 25Min(Wi)
1
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 54
• ดังนั้นหากเลือก Max(Vi/Wi) จะทําให้ได้มูลค่ามาก
ที่สุดคือ 40 โดยที่น้ําหนักพอดีกับความจุของ
กระเป๋าพอดี
• แต่ทว่า !! Greedy Algorithm ยังไม่ใช่กระบวนการคิดที่เหมาะกับ Knapsack Problem
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 55
0 1 2 3 4
Vi / Wi 1 3 3.6 3.67 4
0 1 2 3 4
Vi 1 6 18 22 28
0 1 2 3 4
Wi 1 2 5 6 7
0 1 2 3 4 ValueMax(Vi/Wi)
3
หากเปลี่ยน V4 เป็น 28 แล้วลองใช้ Greedy Algorithm ดูอีกรอบ
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 56
0 1 2 3 4
Vi / Wi 1 3 3.6 3.67 4
0 1 2 3 4
Vi 1 6 18 22 28
0 1 2 3 4
Wi 1 2 5 6 7
0 1 2 3 4 Value1 1 0 0 1 35Max(Vi/Wi)
3
ทําให้ Max(Vi/Wi) เลือก V4 เป็นอันดับแรก จึงได้ Xi = 1 1 0 0 1
04/01/57
Advance Computer Programming: อ.กิตตนินัท์ น้อยมณี 15
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 57
• ด้วยเหตุนี้จึงทําให้ Greedy Algorithm อาจจะยังไม่เหมาะสมในการแก้ปัญหา Knapsack Problem
• โดยยังคงต้องการฟังก์ชันในการเลือกวัตถุที่ดีที่สุดในแต่ละรอบก่อน จึงจะทําให้ได้คําตอบโดยรวมที่ดีที่สุด
• Greedy จะไม่สนใจภาพรวมของปัญหา จะสนใจแต่เหตุการณ์เฉพาะหน้าเท่านั้น
อ. กิตตินนัท์ น้1อยมณี 58
Algorithm KnapsackGD( w[n], v[n], wx ) : array[n]for i := 0 to n-1
x[i] := 0weight := 0y := {0, 1, 2, …, n-1}while weight < wx and y ≠ 0
i := the best remaining Object in yif weight + w[i] ≤ wx then
x[i] := 1weight := weight + w[i]
y := y – {i}return x
End Algorithm
Select Function
Knapsack Problem with Greedy Algorithm
อ. กิตตินนัท์ น้1อยมณี 59
ลองทําด้วยตัวเองดูนะครับ???