บทที่ 12 กราฟ

Download Report

Transcript บทที่ 12 กราฟ

บทที ่ 12 กราฟ (Graph)
1
บทที่ 12 กราฟ (Graph)
•
•
•
•
•
•
กล่าวนากราฟ
โครงสร้างของกราฟ
การสร้างกราฟ
การท่องเข้าไปในกราฟ (Graph Traversals)
การนากราฟไปใช้งาน
สรุปเนื้อหาบทที่ 12
2
กล่าวนากราฟ
• กราฟ (Graph) เป็ นโครงสร้างการเก็บข้อมูลแบบไม่เป็ นเชิงเส้น ซึง่ แตกต่างจากการเก็บ
ข้อมูลแบบทรี
• กราฟเป็ นโครงสร้างระหว่างโหนดสองโหนดและเชือ่ มความสัมพันธ์ระหว่างสองโหนดด้วย
เส้นเชือ่ มโยง
3
โครงสร้างของกราฟ
• กราฟทีม่ กี ารใช้งานกันทัวไปคื
่ อ กราฟเส้น กราฟแท่ง และ กราฟเป็ นช่วงเป็ นต้น
• ส่วนประกอบของกราฟประกอบด้วยเซตสองเซต (Set) คือ
o เซต V เป็ นเซตของข้อมูลทีเ่ รียกว่า โหนด (Node) ในกราฟ
o เซต E เป็ นเซตของ เส้นเชื่อม (Edge) ซึง่ ทาหน้าทีเ่ ชื่อมโหนดให้มคี วามสัมพันธ์กนั
ดังโครงสร้างส่วนประกอบของกราฟในรูป (a) ซึง่ แสดงการเชื่อมโยงโหนดในแผนที่
โดยประกอบด้วย สถานที่ และในแต่ละสถานทีถ่ กู เชือ่ มโยงด้วยเส้นเชือ่ มคือ ถนน
(a) แสดงการเชือ่ มโยงสถานทีใ่ นแผ่นที่
(b) กราฟย่อย
• กราฟย่อย (Subgraph) ประกอบด้วยเซตย่อยของโหนดในกราฟ และเซตย่อยของเส้น
เชือ่ ม ดังแสดงกราฟย่อยในรูป (b) ซึง่ กราฟย่อย คือ กราฟทีม่ ขี อ้ มูลส่วนหนึ่งของกราฟใน
รูป (a)
4
โครงสร้างของกราฟ
(a) แสดงการเชือ่ มโยงสถานทีใ่ นแผ่นที่
(b) กราฟย่อย
• ส่วนประกอบในกราฟประกอบด้วยความสัมพันธ์ระหว่างโหนดสองโหนดเรียกว่า โหนด
ประชิด (Adjacent node) โดยทัง้ สองโหนดจะถูกเชือ่ มความสัมพันธ์ดว้ ยจุดหรือเส้น
จากรูป (a) โหนดห้องสมุดกับโหนดสวนสาธารณะเป็ นโหนดประชิดกัน
• เส้นทาง (Path) ระหว่างสองโหนด ซึง่ ก็คอื ความสัมพันธ์ของเส้นเชือ่ มความสัมพันธ์
ระหว่างโหนดต้นและโหนดปลาย
5
โครงสร้างของกราฟ
(a) แสดงการเชือ่ มโยงสถานทีใ่ นแผ่นที่
(b) กราฟย่อย
• ประเภทของเส้นทาง
o เส้นทางเดียว (Simple path) คือเส้นทางในการเดินจากบ้านพัก ไปห้องสมุด ผ่าน
สวนสาธารณะ เป็ นต้น
o เส้นทางแบบรอบ (Cycle path) คือเส้นทางที่มจี ุดเริม่ ต้นและจุดสุดท้ายอยู่ท่ี
ตาแหน่ งเดียวกัน เช่น เดินทางจากบ้านพัก ห้องสมุด สวนสาธารณะ โรงยิม และ
กลับไปบ้านพัก ซึง่ เป็ นเส้นทางแบบรอบ
6
โครงสร้างของกราฟ
• รูปแบบการเชือ่ มโยงระหว่างโหนด
o
o
o
o
แบบเชื่อมโยง (Connected) คือ เส้นเชือ่ มโยงทุกโหนดภายในกราฟดังแสดงในรูป (a)
แบบไม่เชื่อมโยง (Disconnected) คือ มีบา้ งโหนดไม่ได้ถูกเชือ่ มโยงภายในกราฟดังแสดงในรูป (b)
แบบสมบรูณ์ (Complete) คือ ในหนึ่งโหนดจะมีเส้นเชือ่ มโยงไปยังทุกโหนดภายในกราฟดังแสดงในรูป (c)
แบบเส้นเชื่อมโยงเดียว รูปแบบการเชือ่ มโยง(Self edge) หรือ ลูป (Loop) คือ เส้นทีม่ กี ารเชื่อมโยของ
จุดเริม่ ต้นและจุดสิ้นสุดอยู่ทต่ี วั เองโดยไม่เชื่อมโยงไปยัง โหนดอื่นดังแสดงในรูป (d) ซึ่งเป็ นรูปแบบที่ไม่
อนุญาตให้ใช้ในกราฟ
7
โครงสร้างของกราฟ
• เส้นเชือ่ มโยงภายในกราฟยังสามารถใช้เส้นเชือ่ มโยงแบบมีทศิ ทางและแบบไม่ทศิ ทางใน
การเชือ่ มโยงได้ดงั นี้
o การเชื่อมโยงแบบไม่มีทิศทาง (Undirected) จากรูป (a) อธิบายการเชื่อมโยงแบบไม่ทศิ ทางคือ
โหนด A สามารถไปหาโหนด B ได้และโหนด B ก็สามารถไปหาโหนด A ได้
o แบบเชื่อมโยงแบบมีทิศทาง (Directed) จากรูป (b) อธิบายการเชือ่ มโยงแบบมีทศิ ทาง คือ โหนด B
ไม่สามารถไปหาโหนด D ได้ แต่โหนด D สามารถมาหาโหนด B ได้
8
การสร้างกราฟ
เมทริกประชิด
• เมทริกประชิด คือ จานวนโหนดทีม่ คี วามสัมพันธ์กนั ในกราฟจานวน n โหนด และนาโหนดทีม่ คี วามสัมพันธ์
กันในกราฟไปสร้างอาร์เรย์ขนาดเท่ากับ n x n ข้อมูล
• ใช้สาหรับเก็บข้อมูลความสัมพันธ์ของโหนด
• ถ้ากาหนดให้ i และ j แทนตาแหน่ งของโหนด และนากราฟในรูป (a) เป็ นกราฟแบบมีทศิ ทางมาเก็บ
ความสัมพันธ์ระหว่างโหนดในอาร์เรย์ซง่ึ จะมีรปู ในการเก็บข้อมูลดังแสดงในรูป (b)
• กาหนดให้ขอ้ มูลในอาร์เรย์ในตาแหน่งที่ matrix[ i ][ j ] มีค่าเท่ากับ “1” หมายถึงโหนด i มีการเชือ่ มโยงกับ
โหนด j แต่ถา้ กาหนดให้ matrix[ i ][ j ] มีคา่ เท่ากับ “0” หมายถึงโหนด i ไม่มกี ารเชือ่ มโยงกับโหนด j
(a) กราฟแบบมีทศิ ทาง
(b) อาร์เรย์แสดงความความสัมพันธ์ระหว่างโหนด
9
การสร้างกราฟ
เมทริกประชิด
• ถ้ากราฟเป็ นกราฟแบบน้าหนัก คือ มีน้ าหนักของเส้นเชือ่ มโยงดังแสดงในรูป (a) ข้อมูลในอาร์เรย์จะเปลีย่ น
จาก 1 ซึง่ เป็ นโหนดทีม่ คี วามสัมพันธ์กนั เป็ นค่าน้าหนักในการเชือ่ มโยงระหว่างโหนดแทน และโหนดไหนไม่
มีความสัมพันธ์ระหว่างโหนดจะแทนตัว ∞
(a) กราฟไม่มที ศิ ทางและมีน้าหนักกราฟ (b) อาร์เรย์แสดงความสัมพันธ์ระหว่างโหนด
10
การสร้างกราฟ
รายการประชิด
• รายการประชิด คือ การเก็บรายละเอียดของความเชือ่ มโยงในกราฟทัง้ แบบมีทศิ ทางและไม่มที ศิ ทาง
• ใช้โครงสร้างของลิงค์ลสิ ต์มาเก็บข้อมูลความสัมพันธ์ของกราฟ
• ถ้ากราฟมีจานวนโหนดเท่ากับ n โหนด จะมีโหนดในลิงค์ลสิ ต์เท่ากับจานวนโหนดของกราฟ ดังแสดงการเก็บ
รายการประชิดในรูป (b) เป็ นการเก็บความสัมพันธ์ของกราฟแบบมีทศิ ทางในรูป (a)
(a) กราฟแบบทิศทาง
(b) รายการประชิดของกราฟแบบมีทศิ ทาง
11
การสร้างกราฟ
รายการประชิด
• การเก็บรายการประชิดของกราฟแบบไม่มที ศิ ทางและเป็ นกราฟแบบมีน้าหนักกราฟ โดยข้อมูลภายใน
รายการประชิดจะเก็บน้ าหนักของโหนดไว้ในลิงค์ลสิ ต์ ดังแสดงในรูป (b)
(a) กราฟไม่มที ศิ ทางและมีน้าหนักกราฟ (b) รายการประชิดของกราฟไม่มที ศิ ทางและมีน้าหนักกราฟ
12
การท่องเข้าไปในกราฟ (Graph Traversals)
•
•
•
•
การท่องเข้าไปในกราฟจะท่องเข้าไปทุกโหนดและจะหยุดเมือ่ ถึงโหนดสุดท้ายในกราฟ
ท่องเข้าไปเฉพาะโหนดทีม่ กี ารเชือ่ มโยงกันเท่านัน้
ถ้าในกราฟประกอบด้วยกราฟแบบลูป จะท่องเข้าไปในโหนดทีเ่ ป็ นแบบลูปนี้เพียงครัง้ เดียว
การท่องเข้าไปในกราฟสามารถท่องเข้าไปได้ทงั ้ ในกราฟแบบมีทศิ ทางและไม่มที ศิ ทาง
Depth-first Search
• การท่องเข้าไปในกราฟแบบ Depth-first Search (DFS) จะใช้แสตกมาช่วยในการจัดการ
ตัวอย่างที่ 12.1 โค้ดรหัสเทียมในการท่องเข้าไปกราฟแบบ DFS
1
2
3
4
5
6
7
8
9
10
11
12
13
+dfs(in v:Vertex)
s.createStack( )
s.push(v)
Mark v as visited
while(!s.isEmpty())){
if(no unvisited vertices are adjacent to the vertex on the top of the stack)
s.pop( )
else{
Select an unvisited vertex u adjacent to the vertex on the top of the stack
s.push(u)
Mark u as visited
}//end if
}//end while
13
การท่องเข้าไปในกราฟ (Graph Traversals)
Depth-first Search
• จากโค้ดรหัสเทียมการท่องเข้าไปในกราฟแบบ DFS นาไปท่องเข้าไปในกราฟในรูป (a)
• แสดงลาดับการทางานในการเก็บข้อมูลลงในแสตกตามขันตอนวิ
้
ธี DFS ในรูป (b)
• มีลาดับในการท่องเข้าไปในกราฟคือ a, b, c, d, g, e, f, h และ i
14
การท่องเข้าไปในกราฟ (Graph Traversals)
Breadth-first Search
• การท่องเข้าไปในกราฟแบบ Breadth-First Search (BFS) ได้ใช้ควิ มาช่วยในการจัดการการท่องเข้าไปในกราฟ
ตัวอย่างที่ 12.2 โค้ดรหัสเทียมในการท่องเข้าไปกราฟแบบ BFS
1
2
3
4
5
6
7
8
9
10
+bfs(in v:Vertex)
q.enqueue(v)
Mark v as visited
while (!q.isEmpty( )){
w = q.dequeue( )
while (each unvisited vertex u adjacent to w){
Mark u as visited
q.enqueue(u)
}//end while
}//end while
15
การท่องเข้าไปในกราฟ (Graph Traversals)
Breadth-first Search
• จากหลักการท่องเข้าไปในกราฟแบบ BFS นาไปท่องเข้าไปในกราฟในรูป (a)
• มีลาดับการทางานในการเก็บข้อมูลลงในคิวดังแสดงในรูป (b)
• ลาดับการท่องเข้าไปในกราฟคือ a, b, f, i, c, e, g, d และ h
16
การท่องเข้าไปในกราฟ (Graph Traversals)
• จากหลักการในการท่องเข้าไปในกราฟคือ DFS และ BFS นาไปท่องเข้าไปในกราฟในรูปที่ (a)
• แสดงลาดับการท่องเข้าไปในกราฟแบบ DFS ได้ในรูป (b)
• แสดงลาดับการท่องเข้าไปในกราฟแบบ BFS ได้ในรูป (c)
(a) ภาพต้นแบบ
(b) ท่องเข้าไปในกราฟแบบ DFS
(c) ท่องเข้าไปในกราฟแบบ BFS
17
การนากราฟไปใช้งาน
• กราฟแบบมีทศิ ทางทีไ่ ม่ใช้กราฟแบบลูป ดังแสดงในรูป มีลาดับของโหนดในกราฟ คือ โหนด a มาก่อน b และ c
เป็ นต้น เราจะเรียกกราฟทีม่ อี นั ดับของโหนดว่า ลาดับโทโปโลยี (Topological order) และถ้ากาหนดให้โหนด
x มาก่อนโหนด y ทิศทางของเส้นเชือ่ มจะมีทศิ ทางจาก x ไปยัง y
18
การนากราฟไปใช้งาน
Topological sorting
• จากกราฟที่ม ีล ัก ษณะแบบล าดับ โทโปโลยี มีข ัน้ ตอนวิธีใ นการท่ อ งเข้า ไปในกราฟในรู ป แบบนี้ คื อ
Topological sorting
• ใช้แสตกมาช่วยในการจัดการท่องเข้าไปในกราฟ
ตัวอย่างที่ 12.3 โค้ดรหัสเทียมในการท่องเข้าไปกราฟแบบ Topological sorting
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+toplogicalSort(in theGraph:Graph):List
s.createStack()
for(all vertices v in the graph theGraph){
if(v has no predecessors){
s.push(v)
Mark v as visited
}//end if
}//end for
while (!s.isEmpty()) {
if(all vertices adjacent to the vertex on the top of the stack have been visited){
v = s.pop();
aList.add(1,v)
}else{
Select an unvisited vertex u adjacent to the vertex on the top of the stack
s.push(u)
Mark u as visited
}//end if-else
}//end while
return aList
19
การนากราฟไปใช้งาน
Topological sorting
• จากอัลกอริทมึ การท่องเข้าไปในกราฟแบบ Topological sorting นาไปท่องเข้าไปในกราฟในรูป (a)
• มีลาดับในการท่องเข้าไปในกราฟดังแสดงในรูป (b)
• มีลาดับการท่องเข้าไปกราฟคือ a, b, g, d, e, f, c
(a)
(b)
20
การนากราฟไปใช้งาน
Possible Spanning Tree
• กราฟเป็ นแบบไม่มที ศิ ทางและไม่มกี ารเชือ่ มต่อเป็ นแบบลูป ดังแสดงในรูป (a) สามารถใช้หลักการ Possible
Spanning tree ในการเลือกเส้นทางเชือ่ งโยง
• การเลือกเส้นทางเชือ่ มโยงโหนดภายในกราฟแบบไม่มที ศิ ทางให้ครบทุกโหนดและให้มเี ส้นการเชือ่ มโยงน้อย
ทีส่ ดุ ดังแสดงการเชือ่ มโยงโหนดภายในกราฟด้วยหลักการ Possible Spanning Tree ในรูป (b)
• เส้นปะ หมายถึง เส้นเชือ่ มโยงทีไ่ ม่ตอ้ งมีในกราฟก็ได้ เพราะใน Spanning tree ถือว่าทุกโหนดถูกเชือ่ มโยง
กันครบทุกโหนดแล้ว
(a) การเชือ่ มโยงโหนดภายในกราฟแบบครบทุกโหนด (b) การเชือ่ มต่อโหนดแบบ Possible Spanning tree
21
การนากราฟไปใช้งาน
Possible Spanning Tree
ข้อสังเกตกราฟแบบไม่มีทิศทาง
1. กราฟไม่มีทิศทางมีโหนด n โหนด และมีการเชื่อมต่อระหว่างโหนดน้ อยกว่า n - 1 ถ้าในกราฟไม่มกี าร
เชื่อมต่อแบบลูป และจานวนเส้นเชื่อมโยงระหว่างโหนดน้อยกว่าจานวนโหนดแสดงว่ามีบ้างโหนดไม่ได้ถูก
เชือ่ มโยง ดังแสดงในรูป (a)
2. กราฟไม่มีทิศทางมีโหนด n โหนดและมีการเชื่อมต่อระหว่างโหนดเท่ากับ n - 1 และไม่มีการเชื่อมต่อ
แบบลูป เป็ นรูปแบบการเชือ่ มต่อทีเ่ หมาะสมเนื่องจากมีทุกโหนดถูกเชือ่ มโยง ดังแสดงในรูป (b)
3. กราฟไม่มีทิศทางมีโหนด n โหนดและมีการเชื่อมต่อระหว่างโหนดมากกว่า n – 1 และไม่มีการเชื่อมต่อ
แบบลูป เป็ นรูปแบบทีม่ เี ส้นการเชือ่ มโยงระหว่างโหนดเกินกว่าจานวนของโหนด ดังแสดงในรูป (c)
22
การนากราฟไปใช้งาน
Possible Spanning Tree
• จากหลักการท่องเข้าไปในกราฟของ Possible Spanning tree สามารถนาหลักการท่องเข้าไปกราฟทีก่ ล่าวมา
ก่อนหน้านี้คอื DFS และ BFS นามาใช้รว่ มกับ Spanning tree ได้ดงั แสดงในขัน้ ตอนต่อไป
23
การนากราฟไปใช้งาน
DFS Spanning tree
• การท่องเข้าไปในกราฟด้วยหลักการ Spanning tree โดยการใช้เทคนิค Depth-first search
ตัวอย่างที่ 12.4 โค้ดรหัสเทียมในการท่องเข้าไปกราฟแบบ DFS Spanning tree
1
2
3
4
5
6
•
•
•
•
+dfsSpanningtree(in v:Vertex)
Mark v as visited
for(each unvisited vertex u adjacent to v){
Mark the edge from u to v
dfsSpanningtree(u)
}//end for
จากโค้ดรหัสเทียมในการท่องเข้าในกราฟแบบ DFS Spanning tree นาไปท่องในกราฟรูป (a)
มีลาดับการท่องเข้าไปในกราฟแสดงในรูป (b)
มีลาดับการท่องเข้าไปในกราฟคือ a, b, c, d, g, e, f, h, i
ตัวเลขทีก่ ากับบนเส้นเชือ่ มโยงคือลาดับ ทีอ่ ลั กอลิทมึ DFS Spanning tree ได้ท่องเข้าไปในกราฟ ส่วน
เส้นปะ คือ เส้นเชือ่ มโยงทีไ่ ม่ได้ใช้ในท่องเข้าไปในกราฟ
(a)
(b)
24
การนากราฟไปใช้งาน
BFS Spanning tree
• การท่องเข้าไปในกราฟด้วยหลักการ Spanning tree โดยการใช้เทคนิค Breadth -first search
ตัวอย่างที่ 12.5 โค้ดรหัสเทียมในการท่องเข้าไปกราฟแบบ BFS Spanning tree
1
+bfsSpanningtree(in v:Vertex)
2
q.enqueue(v)
3
Mark v as visited
4
while (!q.isEmpty()){
5
w = q.dequeue()
6
for(each unvisited vertex u adjacent to w){
7
Mark u as visited
8
Mark edge between w and u
9
q.enqueue(u)
10
}//end for
11
}//end while
• ได้นาขัน้ ตอนวิธี BFS Spanning tree ท่องเข้าไปในกราฟตามรูป (a)
• ได้ผลการท่องเข้าไปในกราฟแสดงในรูป (b)
• มีลาดับการท่องเข้าถึงในโหนดคือ a, b, f, i, c, e, g, d, h
(a)
(b)
25
การนากราฟไปใช้งาน
Minimum Spanning Tree
• ลองนึกถึงในกรณีทต่ี อ้ งการเดินสายใยแก้วนาแสงระหว่างเมือง ให้มรี ะยะของสายทีส่ นั ้ ทีส่ ดุ และต้องครอบคลุมทุก
เมืองทีจ่ ะเชือ่ มโยงเครือข่าย
• ก่อนทีจ่ ะเดินสายใยแก้วนาแสงได้มที มี สารวจกาหนดน้ าหนักในแต่ละเส้นทางทีจ่ ะเชือ่ มโยงสายดังแสดงในรูป ซึง่
เป็ นหลักการของ Spanning tree และค่าในการเดินสายใยแก้วนาแสงจะเป็ นไปตามน้ าหนักของแต่ละเส้น การ
เชือ่ มโยง
• ผลรวมของค่าในการเดินสายจะเรียกว่า Cost of the spanning tree ซึง่ เป็ นผลรวมของน้ าหนักของทุกเส้นการ
เชือ่ มโยง
• เพือ่ ให้การเดินสายใยแก้วนาแสงมีความคุมค่ามากทีส่ ดุ คือ การเดินสายให้ได้สนั ้ ทีส่ ดุ และครอบคลุมทุกเมือง
จะต้องมีผลรวมของน้ าหนักของเส้นการเชือ่ มโยงน้อยทีส่ ดุ ด้วยเช่นกัน
• เรียกขัน้ ตอนวิธนี ้วี า่ Minimum Spanning tree ดังแสดงตัวอย่างในการหาเส้นทางตามน้าหนักให้มคี า่ น้อยทีส่ ดุ
คือ ขัน้ ตอนวิธีแบบ Prim
26
การนากราฟไปใช้งาน
Minimum Spanning Tree
ตัวอย่างที่ 12.6 โค้ดรหัสเทียมในการท่องเข้าไปกราฟแบบ Prim
1
2
3
4
5
6
7
8
+PrimAlgorithm(in v:Vertex)
Mark vertex v as visited and include it in the minimum spanning tree
while(there are unvisited vertices){
Find the least-cost edge(v,u) from a visited vertex v to some unvisited
vertex u
Mark u as visited
Add the vertex u and the edge(v,u) to the minimum spanning tree
}//end while
27
การนากราฟไปใช้งาน
Minimum Spanning Tree
• แสดงการท่องเข้าไปในกราฟด้วยหลักการของ Prim
28
การนากราฟไปใช้งาน
Shortest Paths
• การหาเส้นทางทีส่ นั ้ ทีส่ ุด (Shortest Paths) คือ การหาเส้นทางระหว่างโหนดสองโหนดทีม่ เี ส้นทางทีส่ นั ้ ทีส่ ุด
ตามน้ าหนักของเส้นทางทีจ่ ะผ่าน และต้องมีผลรวมของน้ าหนักน้อยทีส่ ดุ ด้วย
• ตัวอย่างในการหาเส้นทางทีด่ งั แสดงในรูป (a)
o จะหาเส้นทางทีส่ นั ้ ทีส่ ดุ จากโหนด 0 ไปยังโหนด 1 แต่จากรูป (a) ไม่สามารถเลือกเส้นทางจาก 0 ไป 1
ได้เนื่องจากมีค่าน้ าหนักเท่ากับ 8 ซึง่ มีค่าน้ าหนักมากกว่าเส้นทางจาก 0 ไป 4 ไป 2 และไป 1 โดยมี
ผลร่วมของน้ าหนักเท่ากับ 7
• แสดงอาร์เรย์ของโหนดประชิดของรูป (a) ในรูป 1(b) โดยโหนดทีเ่ ป็ นโหนดประชิดกันจะมีน้ าหนักกากับไว้ใน
เมทริกแต่ถา้ ไม่ใช่โหนดประชิดกันจะมีคา่ เท่ากับ
(a) กราฟมีทศิ ทางและมีน้าหนักกราฟ (b) อาร์เรย์แสดงความสัมพันธ์ระหว่างโหนด
29
การนากราฟไปใช้งาน
Shortest Paths
ตัวอย่างที่ 12.7 โค้ดรหัสเทียมในการหาเส้นทางทีส่ นั ้ ทีส่ ดุ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+shortedPath(in theGraph:Graph,in weight:WeightArray)
//Step 1: initialization
Create a set vertexSet that contain only vertex 0
n = number of vertices in theGraph
for(v = 0 through n-1){
weight[v] = matrix[0][v]
}//end for
//Steps 2
for(step = 2 through n){
Find the smallest weight[v] such that v is not in vertexSet
Add v to vertexSet
//Check weight[u] for all u not in vertexSet
for(all vertices u not in vertexSet){
if(weight[u] > weight[v] + matrix[v][u]){
weight[u] = weight[v] + matrix[v][u]
}//end if
}//end for
}//end for
30
การนากราฟไปใช้งาน
Shortest Paths
จากขัน้ ตอนทีก่ ล่าวมาข้างต้นนาไปหาเส้นทางทีส่ นั ้ ทีส่ ดุ ในกราฟรูปต้นแบบ โดยมีลาดับการทางานดังนี้
ขัน้ ตอนที่ 1 กาหนดให้ vertexSet เก็บโหนด 0 และกาหนดให้ม ี weight ในแถวแรกของรูปตารางน้ าหนัก
ขัน้ ตอนที่ 2 น้ าหนักทีโ่ หนด 4 (weight[4]) มีค่าเท่ากับ 4 ซึง่ เป็ นค่าน้ าหนักทีน่ ้อยทีส่ ุด โดยยกเว้นน้ าหนักที่
โหนด 0 เพราะโหนด 0 ถูกเก็บไว้ใน vertexSet แล้ว ดังนัน้ v = 4 จะเพิม่ 4 ในvertexSet และมี
โหนดทีย่ งั ไม่มใี น vertexSet คือ u = 1, 2 และ 3 จะเปรียบเทียบเส้นทางทีส่ นั ้ ทีส่ ุดจากโหนด 0
ไปโหนด 4 กับโหนด 0 ไปยังโหนด u เมือ่ เปรียบเทียบเส้นทางโหนด 0 ไปโหนด 1 และ 3 มี
น้ าหนักมากกว่า 0 ไป 4 ต่อไปเปรียบเทียบโหนด 0 ไปโหนด 2 คือ weight[2] = ∞ > weight[4]
+ matrix[4][2] = 4 + 1 = 5 ดังนัน้ weight[2] = 5 ดังแสดงตัวอย่างทิศทางของกราฟในรูป (a)
31
การนากราฟไปใช้งาน
Shortest Paths
ขัน้ ตอนที่ 3 น้ าหนักทีโ่ หนด 2 (weight[2]) มีคา่ เท่ากับ 5 ซึง่ เป็ นน้ าหนักน้อยทีส่ ุด ยกเว้นโหนด 0 และ 4 ซึง่ เป็ นข้อมูลทีม่ อี ยูใ่ น
vertexSet แล้ว ดังนัน้ v = 2 เพิม่ 2 ใน vertexSet และมีโหนดทีย่ งั ไม่มใี น vertexSet คือ u = 1 และ 3 ตรวจสอบ
เส้นทางทีส่ นั ้ ทีส่ ุดจากโหนด 0 ไปโหนด 2 กับโหนด 0 ไปโหนด u จึงเปรียบเทียบโหนด 0 ไป 1 คือ weight[1] = 8
>weight[2] + matrix[2][1] = 5 + 2 = 7 ดังนัน้ weight[1]=7 ดังแสดงทิศทางของกราฟในรูป (b) ต่อไปเปรียบเทียบ
โหนด 0 ไป 3 คือ weight[3] = 9 >weight[2] + matrix [2][3] = 5 + 3 = 8 ดังนัน้ weight[3] = 8 ดังแสดงทิศทาง
ของกราฟในรูป (c)
32
การนากราฟไปใช้งาน
Shortest Paths
ขัน้ ตอนที่ 4 น้ าหนักโหนด 1 (weight[1]) มีค่าเท่ากับ 7 ซึง่ เป็ นน้ าหนักทีน่ ้อยทีส่ ุด ยกเว้น โหนด 0, 2 และ 4 ซึง่ เป็ น
ข้อมูลทีม่ อี ยูใ่ น vertexSet แล้วดังนัน้ v = 1 เพิม่ โหนด 1 ใน vertexSet สาหรับโหนด 3 เหลือเพียง
โหนดเดียวทีย่ งั ไม่มใี น vertexSet เปรียบเทียบโหนด 0 ไปโหนด 1 กับโหนด 0 ไป 3 คือ
weight[3] = 9 <weight[1] + matrix[1][3] = 7 + ∞ ดังแสดงทิศทางของกราฟในรูป (d) ซึง่ ของเส้นทาง
การสารวจจากสมการมีคา่ มากกว่าจึงไม่เพิม่ โหนด 3 ใน vertexSet
ขัน้ ตอนที่ 5 เหลือโหนดทีย่ งั ไม่มใี น vertexSet เพียงโหนดเดียวคือ 3 ดังนัน้ เพิม่ โหนด 3 ใน vertexSet และหยุด
การทางาน
33
การนากราฟไปใช้งาน
Kruskal’s Algorithm
• Kruskal’s Algorithm เป็ นอัลกอลิทมึ เกีย่ วกับการหาเส้นทางทีส่ นั ้ ทีส่ ดุ ในกราฟทีม่ นี ้าหนัก
• Kruskal’s Algorithm จะหาเซตย่อยของเส้นเชือ่ มโยงโหนดภายในกราฟทีเ่ ชือ่ มโยงไปยังทุกโหนดภายในกราฟ
• ผลรวมของน้ าหนักเส้นโยงภายในกราฟจะค่าทีน่ ้อยทีส่ ดุ
ตัวอย่างที่ 12.8 โค้ดรหัสเทียมในการหาเส้นทางทีส่ นั ้ ทีส่ ดุ ด้วย Kruskal’s Algorithm
1
2
3
4
5
6
7
8
9
10
+Kruskal(in theGraph:Graph):Graph
Initialize a priority queue Q to contain all edge in theGraph,
using the weights key.
Define T contain the edges of the minimum edges.
for(i = 0 to n-1 edges){
if(edge u,v is the minimum weighted route from u to v in the Q)
Q.removeMin();
Add u,v only if T does not alredy contain a path between u to v.
}//end if
}//end for
return T;
34
การนากราฟไปใช้งาน
Kruskal’s Algorithm
35
การนากราฟไปใช้งาน
Dijkstra’s Algorithm
•
•
•
•
Dijkstra’s Algorithm ใช้ในการหาเส้นทางทีส่ นั ้ ทีส่ ดุ ระหว่างสองเมืองในแผนที่
เริม่ จากจุดเริม่ ต้นมีคา่ เป็ น 0 ส่วนเมืองต่างให้มคี า่ เป็ นอินฟีนติ ้ี (Infinity:∞)
ต่อไปเริม่ หาเส้นทางไปทีละเมืองทีย่ งั ไม่เคยท่องเข้าไป
ค่าผลรวมเส้นทางระหว่างเมืองทีย่ งั เคยท่องเข้าไปกับเส้นทางเดิม ให้เลือกเส้นทางทีส่ นั ้ ที่ สุดไปยังเมืองทีไ่ ม่เคย
ท่องเข้าไป ซึง่ เป็ นเส้นทางทีส่ นั ้ ทีส่ ดุ พร้อมทัง้ กาหนดให้เมืองทีไ่ ม่ทอ่ งเข้าไปนี้เป็ นเมืองทีถ่ ูกท่องเข้าไปแล้ว
• ทาอย่างนี้จนถึงเมืองปลายทางทีต่ อ้ งการไปถึง ซึง่ เป็ นเส้นทางทีส่ นั ้ ทีส่ ดุ จากเมืองต้น ทางไปถึงเมืองปลายทาง
36
การนากราฟไปใช้งาน
Dijkstra’s Algorithm
ตัวอย่างที่ 12.9 โค้ดรหัสเทียมในการหาเส้นทางทีส่ นั ้ ทีส่ ดุ ด้วย Dijkstral’s Algorithm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
+Dijkstral(in theGraph:Graph,in source:GraphNode):arrayDistance
for(v = 0 to vertex v in theGraph){
distance[v] = infinity;
previous[v] = 0;
}//end for
distance[source] = 0;
Q = the set of all node in theGraph;
while(Q is not empty){
u = vertex in Q with smallest distance[];
if(distance[u] = infinity){
break;
}//end if
remove u from Q;
for(neighbor v of u){
alt = distance[u] + distance_between(u,v);
if(alt < distance[v]){
distance[v] = alt;
previous[v] = u;
Decrease key v in Q;
}//end if
}//end for
}//end while
return distance[]
37
การนากราฟไปใช้งาน
Dijkstra’s Algorithm
Node
A
B
C
D
E
F
G
distance[v]
0
infinity
infinity
infinity
infinity
infinity
infinity
previous[v]
0
0
0
0
0
0
0
U
(u,v)
B
(A,B)
7
1
A
D
(A,D)
5
Node
distance[v] previous[v]
A
0
0
B
infinity
0
C
infinity
0
D
5
A
E
infinity
0
F
infinity
0
G
infinity
0
U
(u,v)
2
Node
A
B
C
D
E
F
G
A,D
B
(D,B)
9
E
(D,E)
15
F
(D,F)
6
distance[v] previous[v]
0
0
infinity
0
infinity
0
5
A
infinity
0
6
D
infinity
0
(u,v) +
distance[u]
distance [v]
0+7 = 7
0+5 = 5
7
5
(u,v) +
distance[u]
distance [v]
5+9 = 14
5+15 = 20
5+6 = 11
14
20
11
38
การนากราฟไปใช้งาน
Dijkstra’s Algorithm
u
(u,v)
E
(F,E)
8
3
A,D,F
G
(F,G)
11
Node
distance[v] previous[v]
A
0
0
B
infinity
0
C
infinity
0
D
5
A
E
8
F
F
6
D
G
infinity
0
u
(u,v)
(E,C)
5
4 A,D,F,E GC
(E,G)
9
Node
distance[v] previous[v]
A
0
0
B
infinity
0
C
5
E
D
5
A
E
8
F
F
6
D
G
infinity
0
(u,v) +
distance[u]
distance [v]
11+8 = 19
11+11 = 22
19
22
(u,v) +
distance[u]
distance [v]
19+5 = 24
19+9 = 28
24
28
39
การนากราฟไปใช้งาน
Dijkstra’s Algorithm
u
(u,v)
A,D,F,E, B
(C,B)
8
C
Node
distance[v] previous[v]
A
0
0
B
8
C
C
5
E
D
5
A
E
8
F
F
6
D
G
infinity
0
4
u
(u,v)
4 A,D,F,E G
(E,G)
9
Node
distance[v] previous[v]
A
0
0
B
8
C
C
5
E
D
5
A
E
8
F
F
6
D
G
9
E
(u,v) +
distance[u]
distance [v]
24+8 = 32
32
(u,v) +
distance[u]
distance [v]
19+9 = 28
28
40
การนากราฟไปใช้งาน
• กราฟ (Graph) เป็ นโครงสร้างในการเก็บข้อมูลแบบไม่เป็ นเชิงเส้น ซึ่ งแตกต่างจากการเก็บ
ข้อมูลแบบทรี กราฟเป็ นโครงสร้างแบบระหว่างสองโหนดและเชื่อมความสัมพันธ์ระหว่าง
สองโหนดด้วยเส้นเชื่อมโยง
• โครงสร้างการเก็บข้อมูลแบบกราฟพัฒนาขึน้ มาเพื่อหาเส้นทางทีส่ นั ้ ทีส่ ุ ดในการเดินทาง
หรือการใช้ทรัพยากรทีเ่ หมาะสมทีส่ ุดทีอ่ า้ งอิงได้ทุกเมือง
41