ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
1
บทที่ 12 กราฟ (Graph)
2
บทที่ 12 กราฟ (Graph) กล่าวนำกราฟ โครงสร้างของกราฟ การสร้างกราฟ
การท่องเข้าไปในกราฟ (Graph Traversals) การนำกราฟไปใช้งาน สรุปเนื้อหาบทที่ 12
3
กล่าวนำกราฟ กราฟ (Graph) เป็นโครงสร้างการเก็บข้อมูลแบบไม่เป็นเชิงเส้น ซึ่งแตกต่างจากการเก็บข้อมูลแบบทรี กราฟเป็นโครงสร้างระหว่างโหนดสองโหนดและเชื่อมความสัมพันธ์ระหว่างสองโหนดด้วยเส้นเชื่อมโยง
4
โครงสร้างของกราฟ กราฟที่มีการใช้งานกันทั่วไปคือ กราฟเส้น กราฟแท่ง และ กราฟเป็นช่วงเป็นต้น ส่วนประกอบของกราฟประกอบด้วยเซตสองเซต (Set) คือ เซต V เป็นเซตของข้อมูลที่เรียกว่า โหนด (Node) ในกราฟ เซต E เป็นเซตของ เส้นเชื่อม (Edge) ซึ่งทำหน้าที่เชื่อมโหนดให้มีความสัมพันธ์กัน ดังโครงสร้างส่วนประกอบของกราฟในรูป (a) ซึ่งแสดงการเชื่อมโยงโหนดในแผนที่ โดยประกอบด้วย สถานที่ และในแต่ละสถานที่ถูกเชื่อมโยงด้วยเส้นเชื่อมคือ ถนน (a) แสดงการเชื่อมโยงสถานที่ในแผนที่ (b) กราฟย่อย กราฟย่อย (Subgraph) ประกอบด้วยเซตย่อยของโหนดในกราฟ และเซตย่อยของเส้นเชื่อม ดังแสดงกราฟย่อยในรูป (b) ซึ่งกราฟย่อย คือ กราฟที่มีข้อมูลส่วนหนึ่งของกราฟในรูป (a)
5
โครงสร้างของกราฟ (a) แสดงการเชื่อมโยงสถานที่ในแผนที่ (b) กราฟย่อย ส่วนประกอบในกราฟประกอบด้วยความสัมพันธ์ระหว่างโหนดสองโหนดเรียกว่า โหนดประชิด (Adjacent node) โดยทั้งสองโหนดจะถูกเชื่อมความสัมพันธ์ด้วยจุดหรือเส้น จากรูป (a) โหนดห้องสมุดกับโหนดสวนสาธารณะเป็นโหนดประชิดกัน เส้นทาง (Path) ระหว่างสองโหนด ซึ่งก็คือ ความสัมพันธ์ของเส้นเชื่อมความสัมพันธ์ระหว่างโหนดต้นและโหนดปลาย
6
โครงสร้างของกราฟ ประเภทของเส้นทาง
(a) แสดงการเชื่อมโยงสถานที่ในแผนที่ (b) กราฟย่อย ประเภทของเส้นทาง เส้นทางเดียว (Simple path) คือเส้นทางในการเดินจากบ้านพัก ไปห้องสมุด ผ่าน สวนสาธารณะ เป็นต้น เส้นทางแบบรอบ (Cycle path) คือเส้นทางที่มีจุดเริ่มต้นและจุดสุดท้ายอยู่ที่ตำแหน่งเดียวกัน เช่น เดินทางจากบ้านพัก ห้องสมุด สวนสาธารณะ โรงยิม และกลับไปบ้านพัก ซึ่งเป็นเส้นทางแบบรอบ
7
โครงสร้างของกราฟ รูปแบบการเชื่อมโยงระหว่างโหนด
แบบเชื่อมโยง (Connected) คือ เส้นเชื่อมโยงทุกโหนดภายในกราฟดังรูป (a) แบบไม่เชื่อมโยง (Disconnected) คือ มีบ้างโหนดไม่ได้ถูกเชื่อมโยงภายในกราฟดังรูป (b) แบบสมบรูณ์ (Complete) คือ ในหนึ่งโหนดจะมีเส้นเชื่อมโยงไปยังทุกโหนดภายในกราฟดังรูป (c) แบบเส้นเชื่อมโยงเดียว รูปแบบการเชื่อมโยง(Self edge) หรือ ลูป (Loop) คือ เส้นที่มีการเชื่อมโยของจุดเริ่มต้นและจุดสิ้นสุดอยู่ที่ตัวเองโดยไม่เชื่อมโยงไปยังโหนดอื่นดังรูป (d) ซึ่งเป็นรูปแบบที่ไม่อนุญาตให้ใช้ในกราฟ
8
โครงสร้างของกราฟ เส้นเชื่อมโยงภายในกราฟยังสามารถใช้เส้นเชื่อมโยงแบบมีทิศทางและแบบไม่มีทิศทางในการเชื่อมโยงได้ดังนี้ การเชื่อมโยงแบบไม่มีทิศทาง (Undirected) จากรูป (a) อธิบายการเชื่อมโยงแบบไม่มีทิศทางคือ โหนด A สามารถไปหาโหนด B ได้และโหนด B ก็สามารถไปหาโหนด A ได้ แบบเชื่อมโยงแบบมีทิศทาง (Directed) จากรูป (b) อธิบายการเชื่อมโยงแบบมีทิศทาง คือ โหนด B ไม่สามารถไปหาโหนด D ได้ แต่โหนด D สามารถมาหาโหนด B ได้
9
การสร้างกราฟ เมทริกประชิด
เมทริกประชิด คือ จำนวนโหนดที่มีความสัมพันธ์กันในกราฟจำนวน n โหนด และนำโหนดที่มีความสัมพันธ์กันในกราฟไปสร้างอาร์เรย์ขนาดเท่ากับ n x n ข้อมูล ใช้สำหรับเก็บข้อมูลความสัมพันธ์ของโหนด ถ้ากำหนดให้ i และ j แทนตำแหน่งของโหนด และนำกราฟในรูป (a) เป็นกราฟแบบมีทิศทางมาเก็บความสัมพันธ์ระหว่างโหนดในอาร์เรย์ซึ่งจะมีรูปในการเก็บข้อมูลดังรูป (b) กำหนดให้ข้อมูลในอาร์เรย์ในตำแหน่งที่ matrix[ i ][ j ] มีค่าเท่ากับ “1” หมายถึงโหนด i มีการเชื่อมโยงกับโหนด j แต่ถ้ากำหนดให้ matrix[ i ][ j ] มีค่าเท่ากับ “0” หมายถึงโหนด i ไม่มีการเชื่อมโยงกับโหนด j
10
การสร้างกราฟ เมทริกประชิด
(a) กราฟแบบมีทิศทาง (b) อาร์เรย์แสดงความความสัมพันธ์ระหว่างโหนด
11
การสร้างกราฟ เมทริกประชิด
ถ้ากราฟเป็นกราฟแบบน้ำหนัก คือ มีน้ำหนักของเส้นเชื่อมโยงดังแสดงในรูป (a) ข้อมูลในอาร์เรย์จะเปลี่ยนจาก 1 ซึ่งเป็นโหนดที่มีความสัมพันธ์กันเป็นค่าน้ำหนักในการเชื่อมโยงระหว่างโหนดแทน และโหนดไหนไม่มีความสัมพันธ์ระหว่างโหนดจะแทนตัว ∞ (a) กราฟไม่มีทิศทางและมีน้ำหนักกราฟ (b) อาร์เรย์แสดงความสัมพันธ์ระหว่างโหนด
12
การสร้างกราฟ รายการประชิด
รายการประชิด คือ การเก็บรายละเอียดของความเชื่อมโยงในกราฟทั้งแบบมีทิศทางและไม่มีทิศทาง ใช้โครงสร้างของลิงค์ลิสต์มาเก็บข้อมูลความสัมพันธ์ของกราฟ ถ้ากราฟมีจำนวนโหนดเท่ากับ n โหนด จะมีโหนดในลิงค์ลิสต์เท่ากับจำนวนโหนดของกราฟ ดังแสดงการเก็บรายการประชิดในรูป (b) เป็นการเก็บความสัมพันธ์ของกราฟแบบมีทิศทางในรูป (a) (a) กราฟแบบทิศทาง (b) รายการประชิดของกราฟแบบมีทิศทาง
13
การสร้างกราฟ รายการประชิด
การเก็บรายการประชิดของกราฟแบบไม่มีทิศทางและเป็นกราฟแบบมีน้ำหนักกราฟ โดยข้อมูลภายในรายการประชิดจะเก็บน้ำหนักของโหนดไว้ในลิงค์ลิสต์ ดังแสดงในรูป (b) (a) กราฟไม่มีทิศทางและมีน้ำหนักกราฟ (b) รายการประชิดของกราฟไม่มีทิศทางและมีน้ำหนักกราฟ
14
การท่องเข้าไปในกราฟ (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
15
การท่องเข้าไปในกราฟ (Graph Traversals)
Depth-first Search อธิบายการทำงานของโปรแกรม บรรทัดที่ 1 ประกาศฟังก์ชัน/เมธอด dfs และกำหนดให้มีการรับค่าโหนดเริ่มต้นในการท่องเข้าไปใน กราฟไว้ในตัวแปร v บรรทัดที่ 2 สร้างสแตกเพื่อใช้สำหรับเก็บข้อมูลโหนดในการท่องเข้าไปในกราฟ บรรทัดที่ 3 เก็บโหนด v ลงในสแตก (หลักการของสแตกคือ FILO) บรรทัดที่ 4 กำหนดให้โหนด v เป็นโหนดที่ถูกท่องเข้าไปแล้วเพื่อที่จะได้ไม่ต้องท่องเข้าไปอีก บรรทัดที่ 5 ตรวจสอบว่ามีโหนดในสแตกอีกหรือไม่ ถ้ายังมีข้อมูลอยู่ให้ทำในบรรทัดที่ 6-12 บรรทัดที่6-7 ถ้าข้อมูลในตำแหน่งบนสุดของสแตกไม่มีโหนดประชิด ที่ยังไม่ได้ท่องเข้าไปในโหนด จะนำข้อมูลของโหนดบนสุดนี้ออกจากสแตก ดังบรรทัดที่ 7 บรรทัดที่ 8 ถ้าโหนดบนสุดของสแตกมีโหนดประชิด ที่ยังไม่ได้ท่องเข้าไปในโหนด จะทำบรรทัด 9-11 บรรทัดที่ 9 เลือกโหนดประชิดของข้อมูลบนสุดของสแตก ในที่นี้คือ โหนด u บรรทัดที่ 10 นำโหนด u มาเก็บไว้ในสแตก เพื่อที่จะใช้สำหรับท่องเข้าไปยังโหนดถัดไป บรรทัดที่ 11 กำหนดให้โหนด u เป็นโหนดที่ถูกท่องเข้าไปในโหนดแล้ว
16
การท่องเข้าไปในกราฟ (Graph Traversals)
Depth-first Search จากโค้ดรหัสเทียมการท่องเข้าไปในกราฟแบบ DFS นำไปท่องเข้าไปในกราฟในรูป (a) แสดงลำดับการทำงานในการเก็บข้อมูลลงในแสตกตามขั้นตอนวิธี DFS ในรูป (b) มีลำดับในการท่องเข้าไปในกราฟคือ a, b, c, d, g, e, f, h และ i
17
การท่องเข้าไปในกราฟ (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
18
การท่องเข้าไปในกราฟ (Graph Traversals)
Breadth-first Search อธิบายการทำงานของโปรแกรม บรรทัดที่ 1 ประกาศฟังก์ชัน/เมธอด bfs และกำหนดให้มีการรับค่าโหนดเริ่มต้นในการท่องเข้าไปใน กราฟไว้ในตัวแปร v บรรทัดที่ 2 เก็บ v ไว้ในคิว (หลักการของคิวคือ FIFO) บรรทัดที่ 3 กำหนดให้โหนด v เป็นโหนดที่ถูกท่องเข้าไปในโหนดแล้ว บรรทัดที่ 4 ถ้าคิวไม่ว่างเปล่าให้ทำในบรรทัดที่ 5-10 บรรทัดที่ 5 กำหนดตัวแปร w เท่ากับตำแหน่งแรกในคิว บรรทัดที่ 6 ถ้าโหนด u ซึ่งเป็นโหนดประชิดของ w ยังไม่ได้ท่องเข้าไปในโหนดให้ทำในบรรทัด 7-9 บรรทัดที่ 7 กำหนดให้โหนด u เป็นโหนดที่ถูกท่องเข้าไปในโหนดแล้ว บรรทัดที่ 8 เก็บโหนด u ไว้ในคิว
19
การท่องเข้าไปในกราฟ (Graph Traversals)
Breadth-first Search จากหลักการท่องเข้าไปในกราฟแบบ BFS นำไปท่องเข้าไปในกราฟในรูป (a) มีลำดับการทำงานในการเก็บข้อมูลลงในคิวดังแสดงในรูป (b) ลำดับการท่องเข้าไปในกราฟคือ a, b, f, i, c, e, g, d และ h
20
การท่องเข้าไปในกราฟ (Graph Traversals)
จากหลักการในการท่องเข้าไปในกราฟคือ DFS และ BFS นำไปท่องเข้าไปในกราฟในรูปที่ (a) แสดงลำดับการท่องเข้าไปในกราฟแบบ DFS ได้ในรูป (b) แสดงลำดับการท่องเข้าไปในกราฟแบบ BFS ได้ในรูป (c) (a) ภาพต้นแบบ (b) ท่องเข้าไปในกราฟแบบ DFS (c) ท่องเข้าไปในกราฟแบบ BFS
21
การนำกราฟไปใช้งาน กราฟแบบมีทิศทางที่ไม่ใช้กราฟแบบลูป ดังแสดงในรูป มีลำดับของโหนดในกราฟ คือ โหนด a มาก่อน b และ c เป็นต้น เราจะเรียกกราฟที่มีอันดับของโหนดว่า ลำดับโทโปโลยี (Topological order) และถ้ากำหนดให้โหนด x มาก่อนโหนด y ทิศทางของเส้นเชื่อมจะมีทิศทางจาก x ไปยัง y
22
การนำกราฟไปใช้งาน 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
23
การนำกราฟไปใช้งาน Topological sorting
เพื่อใช้สำหรับท่องเข้าไปในกราฟ และให้มีการคืนค่าที่ได้จากการท่องเข้าไปในกราฟ บรรทัดที่ 2 สร้างสแตกเพื่อใช้เก็บข้อมูลของโหนดในกราฟ บรรทัดที่ 3 วนลูปเท่าจำนวนโหนดในกราฟ บรรทัดที่ 4-6 ถ้าโหนดไหนที่ไม่มีโหนดนำหน้า ให้เก็บข้อมูลโหนด v ที่ไม่มีโหนดนำหน้าไว้ในคิว ดังบรรทัดที่ 5 และกำหนดให้โหนด v เป็นโหนดที่ถูกท่องเข้าไปในโหนดแล้ว ดังบรรทัด6 บรรทัดที่ 9 ถ้าข้อมูลในสแตกไม่ว่างเปล่าให้ทำในบรรทัดที่ 10-17 บรรทัดที่ 10 ถ้าโหนดประชิดของข้อมูลบนสุดของสแตก เป็นโหนดที่ถูกท่องเข้าไปทุกโหนดแล้ว ให้ทำบรรทัดที่ บรรทัดที่ 11 อ่านข้อมูลตำแหน่งบนสุดของสแตกไว้ในตัวแปร v บรรทัดที่ 12 เพิ่มข้อมูล v ใน list ในตำแหน่งที่ 1 (ตัวแปร aList เก็บข้อมูลโหนดที่ถูกท่องเข้าไปแล้ว)
24
การนำกราฟไปใช้งาน Topological sorting
อธิบายการทำงานของโปรแกรม บรรทัดที่ 13 ถ้ามีโหนดประชิดของข้อมูลบนสุดของสแตก ที่ยังไม่ได้ถูกท่องเข้าไปในกราฟ ให้ทำ บรรทัดที่ 14-17 บรรทัดที่ 14 เลือกโหนดประชิดของข้อมูลบนสุดของสแตก ที่ยังไม่ได้ถูกท่องเข้าไปในโหมดให้เก็บ ไว้ที่ u บรรทัดที่ 15 เก็บตัวแปร u ไว้ในสแตก บรรทัดที่ 16 กำหนดให้ u เป็นโหนดที่ถูกท่องเข้าไปในโหนดแล้ว
25
การนำกราฟไปใช้งาน Topological sorting
จากอัลกอริทึมการท่องเข้าไปในกราฟแบบ Topological sorting นำไปท่องเข้าไปในกราฟในรูป (a) มีลำดับในการท่องเข้าไปในกราฟดังแสดงในรูป (b) มีลำดับการท่องเข้าไปกราฟคือ a, b, g, d, e, f, c (a) (b)
26
การนำกราฟไปใช้งาน Possible Spanning Tree
กราฟเป็นแบบไม่มีทิศทางและไม่มีการเชื่อมต่อเป็นแบบลูป ดังแสดงในรูป (a) สามารถใช้หลักการ Possible Spanning tree ในการเลือกเส้นทางเชื่องโยง การเลือกเส้นทางเชื่อมโยงโหนดภายในกราฟแบบไม่มีทิศทางให้ครบทุกโหนดและให้มีเส้นการเชื่อมโยงน้อยที่สุด ดังแสดงการเชื่อมโยงโหนดภายในกราฟด้วยหลักการ Possible Spanning Tree ในรูป (b) เส้นปะ หมายถึง เส้นเชื่อมโยงที่ไม่ต้องมีในกราฟก็ได้ เพราะใน Spanning tree ถือว่าทุกโหนดถูกเชื่อมโยงกันครบทุกโหนดแล้ว (a) การเชื่อมโยงโหนดภายในกราฟแบบครบทุกโหนด (b) การเชื่อมต่อโหนดแบบ Possible Spanning tree
27
การนำกราฟไปใช้งาน Possible Spanning Tree ข้อสังเกตกราฟแบบไม่มีทิศทาง
กราฟไม่มีทิศทางมีโหนด n โหนด และมีการเชื่อมต่อระหว่างโหนดน้อยกว่า n - 1 ถ้าในกราฟไม่มีการเชื่อมต่อแบบลูป และจำนวนเส้นเชื่อมโยงระหว่างโหนดน้อยกว่าจำนวนโหนดแสดงว่ามีบ้างโหนดไม่ได้ถูกเชื่อมโยง ดังแสดงในรูป (a) กราฟไม่มีทิศทางมีโหนด n โหนดและมีการเชื่อมต่อระหว่างโหนดเท่ากับ n - 1 และไม่มีการเชื่อมต่อแบบลูป เป็นรูปแบบการเชื่อมต่อที่เหมาะสมเนื่องจากมีทุกโหนดถูกเชื่อมโยง ดังรูป (b) กราฟไม่มีทิศทางมีโหนด n โหนดและมีการเชื่อมต่อระหว่างโหนดมากกว่า n – 1 และไม่มีการเชื่อมต่อแบบลูป เป็นรูปแบบที่มีเส้นการเชื่อมโยงระหว่างโหนดเกินกว่าจำนวนของโหนด ดังรูป (c)
28
การนำกราฟไปใช้งาน Possible Spanning Tree
จากหลักการท่องเข้าไปในกราฟของ Possible Spanning tree สามารถนำหลักการท่องเข้าไปกราฟที่กล่าวมาก่อนหน้านี้คือ DFS และ BFS นำมาใช้ร่วมกับ 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
29
การนำกราฟไปใช้งาน Possible Spanning Tree
อธิบายการทำงานของโปรแกรม บรรทัดที่ 1 ประกาศฟังก์ชัน/เมธอด dfsSpannigtree และรับค่าโหนด v เป็นโหนดเริ่มต้นในการ ท่องเข้าไปในกราฟ บรรทัดที่ 2 กำหนดให้โหนด v เป็นโหนดที่ถูกท่องเข้าไปแล้ว บรรทัดที่ 3 ถ้าโหนด u เป็นโหนดประชิดกับโหนด v และเป็นโหนดที่ยังไม่ถูกท่องเข้าไปในโหนด ให้ทำบรรทัดที่ 4-5 บรรทัดที่ 4 กำหนดเส้นการเชื่อมโยงระหว่างโหนด u ไปยังโหนด v บรรทัดที่ 5 เรียกใช้ฟังก์ชัน/เมธอด dfsSpannigtree อีกครั้ง โดยส่งโหนด u ให้เป็นโหนดเริ่มต้น ในการท่องเข้าไปในกราฟ
30
การนำกราฟไปใช้งาน DFS Spanning tree
จากโค้ดรหัสเทียมในการท่องเข้าในกราฟแบบ DFS Spanning tree นำไปท่องในกราฟรูป (a) มีลำดับการท่องเข้าไปในกราฟแสดงในรูป (b) มีลำดับการท่องเข้าไปในกราฟคือ a, b, c, d, g, e, f, h, i ตัวเลขที่กำกับบนเส้นเชื่อมโยงคือลำดับที่อัลกอลิทึม DFS Spanning tree ได้ท่องเข้าไปในกราฟ ส่วนเส้นปะ คือ เส้นเชื่อมโยงที่ไม่ได้ใช้ในท่องเข้าไปในกราฟ (a) (b)
31
การนำกราฟไปใช้งาน BFS Spanning tree
การท่องเข้าไปในกราฟด้วยหลักการ Spanning tree โดยการใช้เทคนิค Breadth -first search ตัวอย่างที่ 12.5 โค้ดรหัสเทียมในการท่องเข้าไปกราฟแบบ BFS Spanning tree 1 2 3 4 5 6 7 8 9 10 11 +bfsSpanningtree(in v:Vertex) q.enqueue(v) Mark v as visited while (!q.isEmpty()){ w = q.dequeue() for(each unvisited vertex u adjacent to w){ Mark u as visited Mark edge between w and u q.enqueue(u) }//end for }//end while
32
การนำกราฟไปใช้งาน BFS Spanning tree
ได้นำขั้นตอนวิธี BFS Spanning tree ท่องเข้าไปในกราฟตามรูป (a) ได้ผลการท่องเข้าไปในกราฟแสดงในรูป (b) มีลำดับการท่องเข้าถึงในโหนดคือ a, b, f, i, c, e, g, d, h (a) (b)
33
การนำกราฟไปใช้งาน Minimum Spanning Tree
ลองนึกถึงในกรณีที่ต้องการเดินสายใยแก้วนำแสงระหว่างเมือง ให้มีระยะของสายที่สั้นที่สุดและต้องครอบคลุมทุกเมืองที่จะเชื่อมโยงเครือข่าย ก่อนที่จะเดินสายใยแก้วนำแสงได้มีทีมสำรวจกำหนดน้ำหนักในแต่ละเส้นทางที่จะเชื่อมโยงสายดังแสดงในรูป ซึ่งเป็นหลักการของ Spanning tree และค่าในการเดินสายใยแก้วนำแสงจะเป็นไปตามน้ำหนักของแต่ละเส้นการเชื่อมโยง ผลรวมของค่าในการเดินสายจะเรียกว่า Cost of the spanning tree ซึ่งเป็นผลรวมของน้ำหนักของทุกเส้นการเชื่อมโยง เพื่อให้การเดินสายใยแก้วนำแสงมีความคุมค่ามากที่สุด คือ การเดินสายให้ได้สั้นที่สุดและครอบคลุมทุกเมืองจะต้องมีผลรวมของน้ำหนักของเส้นการเชื่อมโยงน้อยที่สุดด้วยเช่นกัน เรียกขั้นตอนวิธีนี้ว่า Minimum Spanning tree ดังแสดงตัวอย่างในการหาเส้นทางตามน้ำหนักให้มีค่าน้อยที่สุดคือ ขั้นตอนวิธีแบบ Prim
34
การนำกราฟไปใช้งาน Minimum Spanning Tree
35
การนำกราฟไปใช้งาน 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 อธิบายการทำงานของโปรแกรม บรรทัดที่ 1 ประกาศฟังก์ชัน/เมธอด PrimAlgorithm และกำหนดให้รับตำแหน่งโหนดเริ่มต้นที่จะ ท่องเข้าไปในกราฟไว้ใน v บรรทัดที่ 2 กำหนดให้ v เป็นโหนดที่ถูกท่องเข้าไปแล้ว และเพิ่มโหนดใน minimum spanning tree บรรทัดที่ 3 ถ้ามีโหนดที่ยังไม่ได้ถูกท่องเข้าไปในโหนด ให้ทำบรรทัดที่ 4-6 บรรทัดที่ 4 หาเส้นทางการเชื่อมต่อจากโหนด v ไปยังโหนด u ที่ยังไม่ได้ถูกท่องเข้าไปและมีน้ำหนัก ของเส้นการเชื่อมโยงน้อยที่สุด บรรทัดที่ 5 กำหนดให้โหนด u เป็นโหนดที่ถูกท่องเข้าไปในโหนดแล้ว บรรทัดที่ 6 เพิ่มโหนด u และเส้นทางการเชื่อมโยงระหว่าง v และ u ใน minimum spanning tree
36
การนำกราฟไปใช้งาน Minimum Spanning Tree
แสดงการท่องเข้าไปในกราฟด้วยหลักการของ Prim
37
การนำกราฟไปใช้งาน Minimum Spanning Tree
แสดงการท่องเข้าไปในกราฟด้วยหลักการของ Prim
38
การนำกราฟไปใช้งาน Shortest Paths
แสดงอาร์เรย์ของโหนดประชิดของรูป (a) ในรูป 1(b) โดยโหนดที่เป็นโหนดประชิดกันจะมีน้ำหนักกำกับไว้ในเมทริกแต่ถ้าไม่ใช่โหนดประชิดกันจะมีค่าเท่ากับ
39
การนำกราฟไปใช้งาน Shortest Paths
(a) กราฟมีทิศทางและมีน้ำหนักกราฟ (b) อาร์เรย์แสดงความสัมพันธ์ระหว่างโหนด
40
การนำกราฟไปใช้งาน 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
41
การนำกราฟไปใช้งาน Shortest Paths
อธิบายการทำงานของโปรแกรมขั้นตอนที่ 1 บรรทัดที่ 2 กำหนดให้เซต vertexSet เก็บค่าโหนด 0 ไว้ในเซตคือยังไม่มีโหนดของเส้นทางที่สั้นที่สุดในเซต บรรทัดที่ 3 กำหนดให้ n เท่ากับจำนวนโหนดในกราฟ บรรทัดที่ 4-5 วนลูปตั้งแต่ v เท่ากับ 0 จนถึงตำแหน่งที่โหนด n-1 ภายในลูปจะเก็บน้ำหนักของโหนด ที่เชื่อมต่อจากโหนด 0 ไปยังโหนดตำแหน่งที่ n ดังบรรทัดที่ 5 อธิบายการทำงานของโปรแกรมขั้นตอนที่ 2 บรรทัดที่ 7 วนลูปด้วยตัวแปร step ตั้งแต่ 2 จนถึง n บรรทัดที่ 8 หาค่าน้ำหนักที่น้อยที่สุดในอาร์เรย์ ถ้าน้ำหนักที่ weight[v] มีค่าน้ำหนักที่น้อยที่สุด และโหนด v ยังไม่ได้ถูกเก็บไว้ใน vertexSet บรรทัดที่ 9 เก็บโหนด v ไว้ใน vertexSet บรรทัดที่ 10 ตรวจสอบน้ำหนักของโหนดที่ไม่มีใน vertexSet โดยจะวนลูปเท่ากับโหนดที่ยังไม่มีใน vertexSet เช่น โหนด u บรรทัดที่ ตรวจสอบหาเส้นทางถัดไปที่สั้นที่สุด โดยจะตรวจสอบน้ำหนักของ u ว่ามากกว่าน้ำหนักของ v บวกกับข้อมูลในอาร์เรย์เส้นทางจาก v ไปหา u หรือไม่ ถ้าน้ำหนักของ u มากกว่าจะเก็บน้ำหนักใหม่นี้คือ นำน้ำหนักของ v บวกกับข้อมูลในอาร์เรย์เส้นทางจาก v ไปหา u ดังบรรทัดที่12
42
การนำกราฟไปใช้งาน Shortest Paths
จากขั้นตอนที่กล่าวมาข้างต้นนำไปหาเส้นทางที่สั้นที่สุดในกราฟรูปต้นแบบ โดยมีลำดับการทำงานดังนี้ ขั้นตอนที่ กำหนดให้ vertexSet เก็บโหนด 0 และกำหนดให้มี weight ในแถวแรกของรูปตาราง น้ำหนัก ขั้นตอนที่ น้ำหนักที่โหนด 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] = = 5 ดังนั้น weight[2] = 5 ดังแสดงตัวอย่างทิศทางของกราฟในรูป (a)
43
การนำกราฟไปใช้งาน Shortest Paths
44
การนำกราฟไปใช้งาน 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] = = 7 ดังนั้น weight[1]=7 ดังแสดงทิศทางของกราฟในรูป (b) ต่อไปเปรียบเทียบโหนด 0 ไป 3 คือ weight[3] = 9 >weight[2] + matrix [2][3] = = 8 ดังนั้น weight[3] = 8 ดังแสดงทิศทางของกราฟในรูป (c)
45
การนำกราฟไปใช้งาน 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 และหยุดการทำงาน
46
การนำกราฟไปใช้งาน 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;
47
การนำกราฟไปใช้งาน Kruskal’s Algorithm
อธิบายการทำงานของโปรแกรม บรรทัดที่ 2 กำหนดเส้นเชื่อมโยงภายในกราฟ theGraph ไปจัดลำดับความสำคัญของน้ำหนักเส้นกราฟ จากน้อยไปหามาก เก็บไว้ในตัวแปร Q บรรทัดที่ 3 สร้างตัวแปร T ทำหน้าที่เก็บลำดับโหนดที่มีเส้นเชื่อมโยงที่มีค่าน้ำหนักน้อย บรรทัดที่ 4 วนลูปเท่ากับจำนวนเส้นเชื่อมโยงในกราฟ บรรทัดที่ 5 ถ้าเส้นเชื่อมโยงจากโหนด u ไปโหนด v มีค่าน้ำหนักเส้นเชื่อมโยงน้อยที่สุดในตัวแปร Q บรรทัดที่ 6 ลบเส้นเชื่อมโยงออกจากกราฟ บรรทัดที่ 7 เพิ่มโหนด u และ v ใน T ถ้าโหนด u ไป v ยังไม่มีข้อมูลใน T
48
การนำกราฟไปใช้งาน Kruskal’s Algorithm
49
การนำกราฟไปใช้งาน Kruskal’s Algorithm
50
การนำกราฟไปใช้งาน Dijkstra’s Algorithm
เริ่มจากจุดเริ่มต้นมีค่าเป็น 0 ส่วนเมืองต่างให้มีค่าเป็นอินฟีนิตี้ (Infinity:∞) ต่อไปเริ่มหาเส้นทางไปทีละเมืองที่ยังไม่เคยท่องเข้าไป ค่าผลรวมเส้นทางระหว่างเมืองที่ยังเคยท่องเข้าไปกับเส้นทางเดิม ให้เลือกเส้นทางที่สั้นที่สุดไปยังเมืองที่ไม่เคยท่องเข้าไป ซึ่งเป็นเส้นทางที่สั้นที่สุดพร้อมทั้งกำหนดให้เมืองที่ไม่ท่องเข้าไปนี้เป็นเมืองที่ถูกท่องเข้าไปแล้ว ทำอย่างนี้จนถึงเมืองปลายทางที่ต้องการไปถึง ซึ่งเป็นเส้นทางที่สั้นที่สุดจากเมืองต้นทางไปถึงเมืองปลายทาง
51
การนำกราฟไปใช้งาน 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 while return distance[]
52
การนำกราฟไปใช้งาน Dijkstra’s Algorithm อธิบายการทำงานของโปรแกรม
บรรทัดที่ 1 ประกาศฟังก์ชัน/เมธอด Dijkstral ให้รับกราฟและตำแหน่งเมืองต้นทาง และคืนค่าในการหา เส้นทางจากเมืองต้นทางไปยังเมืองปลายทางว่ามีระยะเท่าไร บรรทัดที่ 2 วนลูปเท่ากับจำนวนโหนดทุกโหนดในกราฟ บรรทัดที่ 3 กำหนดค่าให้ทุกโหนดมีค่าเป็น infinity บรรทัดที่ 4 กำหนดให้ทุกโหนดยังไม่ถูกท่องเข้าไปในโหนด บรรทัดที่ 6 กำหนดให้ตำแหน่งโหนดต้นทางมีค่าเท่ากับ 0 บรรทัดที่ 7 ให้ตัวแปร Q เป็นเซตโหนดในตัวแปร theGraph บรรทัดที่ 8 วนลูปเท่ากับโหนดใน Q บรรทัดที่ 9 กำหนดให้ u เท่ากับโหนดที่มีน้ำหนักเส้นทางที่น้อยที่สุด บรรทัดที่ 10 ถ้าระยะของโหนด u มีค่าเท่ากับ infinity หมายถึงโหนดยังไม่ถูกท่องเข้าไป ให้เลือกโหนดนี้
53
การนำกราฟไปใช้งาน Dijkstra’s Algorithm อธิบายการทำงานของโปรแกรม
บรรทัดที่ 13 ลบโหนด u ออกจาก Q บรรทัดที่ 14 วนลูปเท่ากับโหนดประชิดของโหนด u คือ โหนด v บรรทัดที่ 15 หาระยะห่างโหนดจากโหนด u บวกกับระยะห่างระหว่างโหนด u กับโหนด v ไว้ใน ตัวแปร alt บรรทัด ถ้า alt น้อยกว่าระยะห่างของ v ให้เก็บค่า alt และกำหนดระยะห่างโหนด v เท่ากับ u และลบโหนด v ออกจาก Q
54
การนำกราฟไปใช้งาน Dijkstra’s Algorithm
55
การนำกราฟไปใช้งาน Dijkstra’s Algorithm
56
การนำกราฟไปใช้งาน Dijkstra’s Algorithm
57
การนำกราฟไปใช้งาน กราฟ (Graph) เป็นโครงสร้างในการเก็บข้อมูลแบบไม่เป็นเชิงเส้น ซึ่งแตกต่างจากการเก็บข้อมูลแบบทรี กราฟเป็นโครงสร้างแบบระหว่างสองโหนดและเชื่อมความสัมพันธ์ระหว่างสองโหนดด้วยเส้นเชื่อมโยง โครงสร้างการเก็บข้อมูลแบบกราฟพัฒนาขึ้นมาเพื่อหาเส้นทางที่สั้นที่สุดในการเดินทาง หรือการใช้ทรัพยากรที่เหมาะสมที่สุดที่อ้างอิงได้ทุกเมือง
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.