!"#
แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา อนงคนาฏ ศรีวหิ ค ตอนที่ 15.1 อัลกอริทึมวิถีสั้นที่สุด (1 คาบ) เรือ่ งที่ 15.1.1
อัลกอริทมึ วิถสี น้ั ทีส่ ดุ
เรือ่ งที่ 15.1.2
การคํานวณวิถสี น้ั ทีส่ ดุ
ตอนที่ 15.2 การแทนกราฟดวยลิงกลิส (1 คาบ) เรือ่ งที่ 15.2.1
การแทนกราฟดวยลิงกลสิ ประชิด
เรือ่ งที่ 15.2.2
การแทนกราฟดวยลิงกลสิ หลายมิติ
ตอนที่ 15.3 การแวะผานกราฟ (1 คาบ) เรือ่ งที่ 15.3.1
การแวะผานกราฟแนวกวาง
เรือ่ งที่ 15.3.2
การแวะผานกราฟแนวลึก
แนวคิด 1. อัลกอริทึมที่ใชคํานวณวิถีที่สั้นที่สุดของกราฟนั้นมีแนวคิดมาจากอัลกอริทึมสของวอรแชลซึ่งใช หลักการของทราซิทฟี โคลสเชอร 2. การคํานวณวิถที ส่ี น้ั ทีส่ ดุ ของกราฟอาจทําไดโดยแทนกราฟดวยเมทริกซและนําอัลกอริทมึ สของ วอรแชลมาใช 3. การเก็บกราฟไวในลิงกลสิ แบบประชิดและลิงกลสิ หลายมิติ เปนการเก็บรายชือ่ บัพทุกบัพของ กราฟ และขอมูลของอารกที่เชื่อมระหวางบัพในกราฟ 4. สามารถแทนกราฟไวในลิงกลิสไดทั้งแบบระบุทิศทางและไมระบุทิศทาง 5. การเขาถึงขัอมูลที่เก็บอยูในกราฟสามารถทําไดโดยการแวะผานบัพที่อยูในกราฟ 6. การแวะผานกราฟสามารถทําได 2 วิธีคือ การแวะผานกราฟแนวกวาง และ การแวะผานกราฟ แนวลึก 7. การแวะผานกราฟแนวกวางกระทําไดโดยการแวะไปที่บัพทุกบัพในระดับเดียวกันจนครบทุกบัพ แลวจึงแวะผานไปที่บัพในระดับถัดไป 8. การแวะผานกราฟแนวลึกกระทําไดโดยการแวะไปทีบ่ พั ละระดับโดยกําหนดวิถแี รกจากรากลง ไปที่ใบและอีกวิถีหนึ่งจากรากไปที่ใบจนกระทั่งมีการแวะผานหมดทุกบัพ
!"$ วัตถุประสงค 1. เพื่อใหผูเรียนเขาใจถึงหลักการคํานวณหาวิถีสั้นที่สุดของกราฟ 2. เพือ่ ใหผูเรียนเขาใจถึงหลักการของอัลกอริทึมการแวะผานกราฟ กิจกรรมการเรียนการสอน กิจกรรมทีน่ กั ศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชุดวิชา/โฮมเพจชุดวิชา ตอนที่ 15.1 ตอนที่ 15.2 และตอนที่ 15.3 2. ทํากิจกรรมของบทเรียนที่ 15 3. ทําแบบประเมินผลของบทเรียนที่ 15 เอกสารประกอบการสอน 1. เอกสารชุดวิชา สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน
!"% ตอนที่ 15.1 วิถที ส่ี น้ั ทีส่ ดุ หัวเรื่อง เรือ่ งที่ 15.1.1
อัลกอริทมึ วิถที ส่ี น้ั ทีส่ ดุ
เรือ่ งที่ 15.1.2
การคํานวณวิถที ส่ี น้ั ทีส่ ดุ
แนวคิด 1. อัลกอริทึมที่ใชคํานวณวิถีที่สั้นที่สุดของกราฟนั้นมีแนวคิดมาจากอัลกอริทึมสของวอรแชลซึ่งใช หลักการของทราซิทฟี โคลสเชอร 2. การคํานวณวิถที ส่ี น้ั ทีส่ ดุ ของกราฟสามารถทําไดโดยแทนกราฟดวยเมทริกซและนําอัลกอริทมึ ส ของวอรแชลมาใช วัตถุประสงค หลังจากที่ศึกษาตอนที่ 15.1.1 แลว 1. นักศึกษาเขาใจหลักการทํางานของอัลกอริทมึ วิถที ส่ี น้ั ทีส่ ดุ 2. นักศึกษาสามารถเขียนอัลกอริทมึ วิถที ส่ี น้ั ทีส่ ดุ 3. นักศึกษาสามารถคํานวณวิถสี น้ั ทีส่ ดุ ของกราฟ เรื่องที่ 15.1.1 อัลกอริทึมของวิถีที่สั้นที่สุด ให G เปนกราฟระบุทศิ ทางประกอบดวย บัพ v1, v2, ... vm จํานวน m บัพ สมมติวา G เปนกราฟ น้าํ หนัก กําหนดใหอารกของกราฟ G ประกอบดวยน้าํ หนัก หรือ ความยาวของอารก เทากับ w(e) ซึง่ เปน จํานวนเต็มบวก ดังนัน้ สามารถเก็บ G ในหนวยความจําโดย เมทริกซนาํ้ หนัก W = (wij) ดังตอไปนี้ กําหนด wij =
w(e)
ถามี อารก e จาก vi ไปยัง vj
0
ถาไมมี อารกจาก vi ไปยัง vj
เมทริกซวถิ ี P ให รายละเอียดวามีวิถีระหวางบัพ ปจจุบนั สามารถเขียนเมทริกซ Q ซึ่งบอกความยาวของ วิถีที่สั้นที่สุดระหวางบัพในกราฟ G ซึง่ เมทริกซ Q = (qij) เมื่อ qij = ความยาววิถีสั้นที่สุดจาก vi ไปยัง vj ขัน้ ตอนตอไปคือการนําอัลกอริทมึ ของวอรแชลคํานวณเมทริกซ Q ในทีน่ ก้ี าํ หนดลําดับของเมทริกซคอื Q0, Q1, ..., Qm (คลายกับเมทริกซ P0, P1, ..., Pm) ซึง่
!"" Qk[i,j] = MIN (Qk-1[i,j],Qk-1[i,k]+Qk-1[k,j]) เมื่อ MIN เปนฟงกชันหาคาต่ําสุด เมทริกซเริ่มตน Q0 เหมือนกับเมทริกซน้ําหนัก W ยกเวนเลข 0 แตละตัวใน W ถูกแทนดวย ∞ ในทีส่ ดุ เมท ริกซสดุ ทาย Qm จะเปนเมทริกซทบ่ี อกระยะทางทีส่ น้ั ทีส่ ดุ ตามตองการ ให G เปนกราฟน้าํ หนักประกอบดวย n บัพ และมีน้ําหนัก w อัลกอริทมึ ในการคํานวณหา เมท ริกซ Q ซึง่ Q[I,J] คือความยาวของวิถีที่สั้นที่สุดจากบัพ vi ไปยังบัพ vj กําหนด INFINITY เปนจํานวนเต็ม ขนาดใหญมาก 1. Repeat for I,J = 1,2,…,M : [กําหนดคาเริ่มตน Q] If W[I,J] = 0, Then : Q[I,J] := INFINITY; Else : Q[I,J] := W[I,J] 2. วนซ้าํ ขัน้ ตอนที่ 3 และ 4 for K = 1,2,…,M : [เปลีย่ นแปลงQ] 3. วนซ้าํ ขัน้ ตอนที่ 4 for I = 1,2,…,M : 4. วนซ้าํ ขัน้ ตอนที่ 4 for J = 1,2,…,M Q[I,J] := MIN(Q[I,J],Q[I,K]+Q[K,J]) [จบวนซ้ําขั้นตอน 4] [จบวนซ้ําขั้นตอน 3] [จบวนซ้ําขั้นตอน 2] 5. จบ
กิจกรรม 15.1 กําหนดเมทริกซประชิด Q ใหจงเขียนกราฟ คํานวณหาวิถีของเมทริกซ Qและเขียนอัลกอริทมึ สําหรับหา วิถสี น้ั ทีส่ ดุ
Q=
1 1 0 1
0 0 1 0
0 0 0 1
0 1 0 0
เรื่องที่ 15.1.2 การคํานวณวิถีที่สั้นที่สุด การคํานวณวิถีที่สั้นที่สุดของกราฟมีแนวคิดจากอัลกอริทึมของวอรแชลดังที่ไดกลาวมาแลวในเรื่องที่ 15.1.1 การคํานวณวิถที ส่ี น้ั ทีส่ ดุ ของกราฟมีนาํ้ หนักและระบุทศิ ทางจากกราฟ G ที่กําหนดให
!"& 7 R
4
5
7 S
U 2
1
3
T
กราฟ G ให v1 = R, v2 = S, v3 = T และ v4 = U ดังนัน้ เมทริกซนาํ้ หนัก W ของ G เขียนได ดังนี้ 7 5 0 0 W=
7 0 0 2 0 3 0 0 4 0 1 0
Q0 =
Q1 =
7 5 ∞ ∞
RR
RS
-
-
7 ∞ ∞ 2
SR
-
-
SU
∞ 3 ∞ ∞
-
TS
-
-
4 ∞ 1 ∞
UR
-
UT
-
7 5 ∞ ∞
RR
RS
-
-
7 12 ∞ 2
SR
SRS
-
SU
-
TS
-
-
UR
URS
UT
-
7 5 ∞ 7
RR
RS
-
RSU
7 12 ∞ 2
SR
SRS
-
SU
10 3 ∞ 5
TSR
TS
-
TSU
URS
UT
URSU
∞ 3 ∞ ∞ 4
Q2 =
4
9 1
9
∞
1 11
UR
!&'
Q3 =
Q4 =
7 5 ∞ 7
RR
RS
-
RSU
7 12 ∞ 2
SR
SRS
-
SU
10 3 ∞ 5
TSR
TS
-
TSU
4
UR
UTS
UT
UTSU
7 5 8 7
RR
RS
RSUT RSU
7 11 3 2
SR
SURS SUT
9
3 6 5
TSUR TS
TSUT TSU
4
4 1 6
UR
UT
4
1 6
UTS
SU UTSU
Q1[4,2] = MIN(Q0[4,2], Q0 [4,1]+ Q0 [1,2]) = MIN (∞,4+5) =9 Q2[1,3] = MIN(Q1 [1,3], Q1 [1,2]+ Q1 [2,3]) = MIN (∞,5+∞) =∞ Q3[4,2] = MIN(Q2 [4,2], Q2 [4,3]+ Q2 [3,2]) = MIN (9,1+3) =4 Q4[3,1] = MIN(Q3 [3,1], Q3 [3,4]+Q3 [4,1]) = MIN (10,5+4) =9 จากการคํานวณขางตน ซึ่งใชอัลกอริทึมของวอรแชลที่ จะไดเมทริกซ Q0, Q1, Q2, Q3, และ Q4 ซึง่ Q4 เปน เมทริกซที่ตองการ กิจกรรม 5.2 กําหนดเมทริกซประชิด Q ใหจงหาวิถีสั้นที่สุดโดยใชอัลกอริทึมของวอรแชล
Q=
1 1 0 1
0 0 1 0
0 0 0 1
0 1 0 0
!&( ตอนที่ 15.2 การแทนกราฟดวยลิงกลิส หัวเรื่อง เรือ่ งที่ 15.2.1
การแทนกราฟดวยลิงกลสิ ประชิด
เรือ่ งที่ 15.2.2
การแทนกราฟดวยลิงกลสิ หลายมิติ
แนวคิด 1. การเก็บกราฟไวในลิงกลสิ แบบประชิด เปนการเก็บรายชือ่ บัพทุกบัพของกราฟ และอารกที่ เชื่อมระหวางบัพในกราฟ 2. สามารถแทนกราฟไวในลิงกลิสไดทั้งแบบระบุทิศทางและไมระบุทิศทาง วัตถุประสงค เมือ่ ศึกษาตอนที่ 15.2 จบแลวนักศึกษาสามารถ 1. วาดภาพการเก็บขอมูลของกราฟทั้งแบบระบุทิศทางและไมระบุทิศทางไวในลิงกลิสได 2. สามารถวาดภาพการเก็บขอมูลของกราฟมีนาํ้ หนักไวในลิงกลสิ ได 3. สามารถวาดภาพการเก็บขอมูลของกราฟไวในลิงกลสิ หลายมิติ เรื่องที่ 15.2.1 การแทนกราฟดวยลิงกลิส ประชิด การใชลงิ กลสิ เพือ่ ประหยัดเนือ้ ทีใ่ นการเก็บขอมูลของกราฟนัน้ มีผูนิยมใชกันแพรหลาย ตัวอยาง เชน โครงสรางเครือขายระบบคอมพิวเตอรเพือ่ ควบคุมการจราจรของเมืองหลวง การสรางโปรแกรมเพือ่ ควบ คุมปริมาณการจราจรบนถนนหลวง โดยบัพของกราฟใชแทนสี่แยก อารกใชแทนถนน น้ําหนักของอารกใช แทนปริมาณการจราจร อารกสําหรับถนนเดินทางเดียวนัน้ มีนาํ้ หนัก 1 ตัว อารกสําหรับถนนทีม่ รี ถวิง่ สวนทาง มีน้ําหนัก 2 ตัว ในกรณีนี้ถาใชเมทริกซประชิดแลว สําหรับกราฟทีม่ ี n บัพเขียนโดยใชเมทริกซขนาด N2 แต ถาใชลิงกลิส โปรแกรมใชบัพเทาที่จําเปนเทานั้น คือ ในกราฟประกอบดวยอารกที่ใชเก็บขอมูลเทานั้น โครงสรางพืน้ ฐานของลิงกลสิ ที่นํามาใชกับกราฟ มี 2 แบบ คือ การแทนโดยใชรายชื่อบัพ การแทนลิสหลายมิติ การแทนโดยใชรายชื่อบัพ วิธกี ารนีแ้ บงออกเปน 2 สวน คือ รายชื่อ เซตของลิงกลสิ
!&! เมื่อพิจารณากราฟแลวพบวา มีวิถีเขาไปยังรายชื่อบัพของแตละบัพในกราฟ การเขาไปที่บัพ i โดยชี้ไปที่ลิงก ลิส ซึ่งแทนบัพที่เชื่อมกับบัพ i ซึง่ อันทีจ่ ริงระเบียนทีน่ าํ มาประกอบเปนลิงกลสิ นั้นมี 2 เขต คือ 1. ชื่อบัพ 2. ตัวชี้ที่เชื่อมกับสมาชิกตัวตอไปในลิส
$
! )
(
*
#
ภาพประกอบ 15.1 กราฟไมระบุทศิ ทาง เมื่อเขียนรายชื่อบัพแทนกราฟไมระบุทิศทางของรูป 11-15 ไดดงั นี้ รายชื่อ ขอมูลเกีย่ วกับอารก (
!
!
(
!
)
)
!
*
#
*
)
+,--
#
)
+,--
$
)
+,--
+,-+,-$
+,--
ภาพประกอบ 15.2 2 ลิงกลิส ใชเก็บขอมูลของกราฟไมระบุทิศทาง กราฟไมระบุทิศทางขนาด N ที่มีจํานวน A อารก การเขาไปในรายชื่อ N ครัง้ และการเขาไปลิงกลสิ 2*A ครัง้ !
$ )
( *
#
!&) ภาพประกอบ 15.3 กราฟระบุทศิ ทาง รายชื่อ ขอมูลเกีย่ วกับอารก (
!
!
!
)
+,--
)
#
$
+,--
*
)
+,--
+,--
# +,-$ +,--
ภาพประกอบ 15.4 ลิงกลิสใชเก็บขอมูลของกราฟระบุทิศทาง จะเห็นไดวา กราฟระบุทิศทางขนาด N ที่มีจํานวน A อารก ดําเนินการเขาไปในรายชือ่ N ครัง้ และ เขาไปในลิงกลสิ จํานวน N ครัง้ ลิงกลิสสวนหัวประกอบดวยรายชื่อของบัพจํานวน i บัพที่สัมพันธกับเมทริกซประชิดจํานวน i แถว สําหรับการจัดรายชือ่ นัน้ มีการเรียงลําดับตามชื่อบัพ
กราฟแบบน้ําหนักและระบุทิศทาง การแทนกราฟซึง่ ประกอบดวยอารกมีนาํ้ หนักใชโครงสรางขอมูลทีส่ ามารถเก็บน้าํ หนักได (
*
"
!
! !
*
)
#
%
$
! (
)
)
&
$
ภาพประกอบ 15.5 กราฟแบบน้ําหนักและระบุทิศทาง รูปนีก้ ราฟระบุทศิ ทาง และอารกมีนาํ้ หนัก แตละบัพแทนเหตุการณทเ่ี กิดขึน้ และอารกแทนงานทีไ่ ด ทําไปเสร็จสมบูรณ จากเหตุการณหนึ่งไปยังเหตุการณหนึ่ง สําหรับน้ําหนักคือเวลาที่ใช การแทนรายชื่อบัพของกราฟนี้ โครงสรางขอมูลสําหรับอารกนัน้ ประกอบดวยชือ่ ของบัพปลายทาง น้าํ หนักของอารก และตัวชี้ที่ชี้ไปยังอารกเสนตอไปที่มีแหลงกําเนิดจากบัพเดียวกัน NODE WEIGHT NEXT
!&* รายชื่อบัพ
ขอมูลของอารก
1
2
6
3
3
NULL
2
4
2
5
4
NULL
3
6
9
NULL
8
1
NULL
5
7
3
NULL
6
7
2
NULL 8
2
NULL
4
7 8 NULL
ภาพประกอบ 15.6 ลิงกลิสเก็บขอมูลของกราฟแบบน้ําหนักและระบุทิศทาง
เมื่อตองการหาระดับของบัพในกราฟไมระบุทิศทางสามารถทําไดโดยนับจํานวนของการเขา ในลิงก ลิสสําหรับระดับนอกของบัพในกราฟระบุทศิ ทางนัน้ สามารถพิจารณาไดโดยนับจํานวนของการเขาลิงกลสิ การหาระดับในของบัพ i ซับซอนกวาการหาระดับนอกแตละสวนของลิงกลสิ นัน้ ไดรบั การนํามาใช เพื่อจะตรวจดูวามีบัพ i ที่ตองการหรือไม เพือ่ อํานวยความสะดวกในการคนหาบัพทีอ่ ยูก อ นหนาและพิจารณา ระดับใน จึงตองมีรายชื่อชวยของอารกที่เชื่อมกับบัพดวย เมื่อเปรียบเทียบขอดีขอเสียของการใชลิงกลิสกับการใชเมทริกซประชิด แลวจะพบวาการนําโครง สรางขอมูลชนิดใดไปใชงานใดนั้น ขึ้นกับลักษณะและเปาหมายของงานนั้น ๆ เชน เมื่อกําหนดใหเนื้อที่ในการ เก็บขอมูลนั้นเปนปจจัยหลักของการเลือกในโครงสรางขอมูล การใชลงิ กลสิ นั้นเหมาะสมกวา เพราะใชเนือ้ ที่ นอยกวาซึ่งมีขอยกเวนในกรณีที่กราฟนั้นมีการเชื่อมตอกันมาก กรณีทก่ี ราฟประกอบดวยโครงสรางทีเ่ ปลีย่ นแปลงไปไดงา ยคือ มีการเพิ่มหรือลดอารกมากซึ่งเหมาะ สมที่จะใชเมทริกซประชิดมากกวาใชรายชื่อบัพเพราะการเปลี่ยนการเขาเมทริกซนั้นงายกวาการเพิ่ม (หรือ ลด) การเขาไปยังลิงกลสิ กิจกรรม 15.3 จากกลิสแบบประชิดที่กําหนดใหจงวาดกราฟแบบระบุทิศทาง รายชื่อบัพขอมูลของอารก
!&# (
!
+,--
!
)
+,--
)
(
+,--
*
*
+,--
เรื่องที่ 15.2.2 การแทนกราฟดวยลิงกลิสหลายมิติ การใชลิงกลิสหลายมิติแทนกราฟนั้น มีอยู 2 สวน คือ รายชื่อของบัพ เซตลิงกลสิ ของอารก ขอมูลอารก การเขาไปที่แตละบัพในรายชื่อบัพมีเพียง 1 ชองทางเทานั้น ซึ่งการเขาไปที่รายชื่อของบัพ i นัน้ โดย ชี้ไปที่ลิงกลิสแบบประชิด สําหรับรายชื่อของบัพ i และระเบียนของลิงกลสิ นัน้ ปรากฎบน 2 ลิสทีเ่ ชือ่ มตอกัน NODE1 ID Vi
NODE2
ADJ NEXT1
ID Vj
ADJ NEXT2
ภาพประกอบ 15.7 การเก็บขอมูลของอารกโดยวิธีลิสหลายมิติ การแทนลิสหลายมิตินั้นไดจากกราฟไมระบุทิศทางรูป 15-1 ซึง่ การสราง ลิงกลสิ หลายมิตนิ น้ั ไดจาก เซตของอารก {(1,2), (2,2), (2,3), (4,3), (3,5), (3,6)}
!&$ รายชื่อ ขอมูลอารก (
(
'
!
.
!
!
.
!
'
)
!
'
)
.
*
*
'
)
.
#
)
.
#
'
$
)
'
$
'
ภาพประกอบ 15.8 ลิงกลิสเก็บขอมูลของกราฟไมระบุทิศทางวิธีที่ 1
รายชื่อ ขอมูลอารก (
!
.
(
'
!
!
.
!
'
)
!
'
)
.
*
)
.
*
'
#
#
'
)
'
$
)
'
$
'
ภาพประกอบ 15.9 ลิงกลิสเก็บขอมูลของกราฟไมระบุทิศทางวิธีที่ 2 การสรางลิสหลายมิตใิ นรูปที่ 15-1 ไดจากเซตจํากัดของอารก {(2,1), (2,2), (2,3), (3,4), (5,3), (3,6)} สําหรับน้าํ หนักของอารกนัน้ สามารถเก็บไวในระเบียนของอารก ซึ่งไดอธิบายในตัวอยางที่กลาวไป แลว การกําหนดกราฟน้ําหนักใหมีจํานวน 24 บัพ และประกอบดวยตัวแปรชนิดตัวชี้ สามารถทําได คือ
!&% type nodeid = 0..24; nodetype = ^arcinfo; arcptr = ^arcinfo; arcinfo = record node1 : nodeid; node2 : nodeid; adjlist1 : arcptr; adjlist2 : arcptr; weight : integer end; var graph : array[1..24] of nodetype;
กิจกรรม 15.4 กําหนดเมทริกซประชิด Q ใหจงเขียนกราฟ
Q=
1 1 0 1
0 0 1 0
0 0 0 1
0 1 0 0
และเขียนแทนกราฟของเมทริกซ Q ดวยลิงคลิสหลายมิติ
!&" ตอนที่ 15.3 การแวะผานกราฟ หัวเรื่อง เรือ่ งที่ 15.3.1
การแวะผานกราฟแนวกวาง
เรือ่ งที่ 15.3.2
การแวะผานกราฟแนวลึก
แนวคิด 1. การเขาถึงขัอมูลที่เก็บอยูในกราฟสามารถทําไดโดยการแวะผานบัพที่อยูในกราฟ 2. การแวะผานกราฟสามารถทําได 2 วิธีคือ การแวะผานกราฟแนวกวาง และ การแวะผานกราฟ แนวลึก 3. การแวะผานกราฟแนวกวางกระทําไดโดยการแวะไปที่บัพทุกบัพในระดับเดียวกันจนครบทุกบัพ แลวจึงแวะผานไปที่บัพในระดับถัดไป 4. การแวะผานกราฟแนวลึกกระทําไดโดยการแวะไปทีบ่ พั ละระดับโดยกําหนดวิถแี รกจากรากลง ไปที่ใบและอีกทางหนึ่งจากรากไปที่ใบจนกระทั่งมีการแวะผานหมดทุกบัพ วัตถุประสงค เมือ่ ศึกษาตอนที่ 15.3 จบแลวนักศึกษา 1. เขาใจหลักการของการแวะผานกราฟแนวลึกและการแวะผานกราฟแนวกวาง 2. สามารถบอกความแตกตางระหวางการแวะผานกราฟแนวลึกและการแวะผานกราฟแนวกวาง 3. สามารถเขียนโปรแกรมของการแวะผานกราฟแนวลึกและการแวะผานกราฟแนวกวาง เรื่องที่ 15.3.1 การแวะผานกราฟแนวกวาง การแวะผานกราฟ คือขบวนการที่แวะไปที่ทุกๆ บัพของกราฟ สําหรับเทคนิคในการการแวะผานมี 2 แบบ ดังนี้ 1. แนวกวาง (Breadth first traversal) 2. แนวลึก (Depth first traversal) หลักการทํางานของการแวะผานกราฟนัน้ คือ การไปที่แตละบัพเพียง 1 ครัง้ สําหรับการไปที่บัพใน ตนไมนั้นมีเพียง 1 วิถีจากรากไปยังบัพ แตสําหรับในกราฟนั้นมีหลายวิถีระหวางคูของบัพ ดังนัน้ เพือ่ ปองกัน การไปที่บัพซ้ําซอนจึงจําเปนตองทําเครื่องหมาย(มารคบิต) บริเวณบัพทีไ่ ดรบั การแวะผานเสร็จเรียบรอยแลว จึงไมสามารถไปแวะไดอีก นอกจากนี้ยังมีการทําเครื่องหมายใหกับอารกที่ตามหลังมา สําหรับอารกทีท่ าํ เครื่องหมายไปแลวไมสามารถใชเปนวิถีอีก ดังนัน้ มารค บิต จึงสามารถเก็บใชขอมูลของบัพ หรืออารกวาได รับการแวะผานแลว
!&& การแวะผานในแนวกวาง (Depth first traversal) วิธกี ารนีท้ าํ ขึน้ โดยเลือก 1 บัพ เปนจุดเริ่มตน หลังจากนั้นไป แวะผานและทําเครื่องหมายที่บัพนั้น ตอมาบัพอื่นที่เชื่อมกับบัพนั้นจะไดรับการแวะผาน และทําเครือ่ งตาม ลําดับ ในที่สุดบัพที่ยังไมไดแวะผานซึ่งประชิดกับบัพที่ไดแวะผานไปแลว ไดรับการแวะและทําเครื่องหมาย จนกระทั่งทุก ๆ บัพในกราฟไดรับการแวะผานครบถวน การแวะผานในแนวลึก ของกราฟในรูปที่ 15-5 นัน้ จะไปที่บัพแบบเรียงตามลําดับ ดังนีค้ อื 1, 2, 3, 4, 5, 6, 8, 7 หรือการไปที่บัพเรียงตามลําดับอีกแบบหนึ่ง ดังนีค้ อื 1, 3, 2, 6, 5, 4, 7, 8 อัลกอริทม่ึ การแวะผาน ใชคิวเพื่อเก็บบัพในกราฟแตละระดับที่ไดผานไปแวะผานบัพที่นําไปเก็บไว นัน้ จะไดรบั การดําเนินงานทีละบัพและบัพประชิดก็ไดรบั การแวะผานจนกระทัง่ ทุกบัพไดรบั การแวะผานเงือ่ น ไขจบการทํางานของอัลกอริทึมนี้ คือการที่คิววาง
โปรแกรมการแวะผานกราฟแบบแนวกวาง อัลกอริทมึ ตอไปนีก้ ลาวถึงกระบวนงานทีท่ าํ การเพิม่ และลบสมาชิกออกจากคิวโดยกระบวนงานทัง้ 2 นี้จะนํา ไปใชในอัลกอริทึมของการแวะผานกราฟที่จะกลาวตอไป type queuestruct = record queue : array[1..100] of integer; r,f : integer; end; var q : queuestruct; (*F = R for empty q*) (*F point to front element of queue*) (*queue is full when R = (F+1) mod N*) (*max number of element in queue is N-1*) procedure insert (con : integer); begin if (q.f <> (q.r+1) mod n) then begin q.r := (q.r+1) mod n: q.queue[q.r] := con else OVERFLOW end; procedure remove (var eoff : integer); begin if q.r = q.f then UNDERFLOW - CONDITION else begin q.f := (q.f+1) mod n; eoff := q.queue[q.f]
)'' end; end;
{อัลกอริทมึ นี้ แสดงการแวะผานกราฟแบบกวาง โดยมีการเก็บบัพที่ไดรับการแวะผานแลวไวในคิว และแวะไป ที่บัพที่อยูประชิดกับบัพที่อยูในคิว ดูรปู 15-5 ประกอบ} (*global data typed used for the graph*) type nodeid = 0..ordergraph; edgeptr = ^edgeinfo; nodetype = record mark : 0..1; adjlist : edgeptr end; edgeinfo = record node : nodeid; weight : integer; next : edgeptr; end; graphtype = array[1..ordergraph] of nodetype; var graph : graphtype; firstnode : nodeid; procedure breadth (firstnode : nodeid); var q : queuestruct; savenode : nodeid; adjptr : edgeptr; begin (*visit firstnode here*) graph [firstnode].mark := 1; insert (firstnode); while q.f <> 0 do begin remove (savenode); adjptr := graph[savenode].adjlist; (*visit nodes adjacent to savenode*) while adjptr <> nil do begin savenode := adjptr^.node; if (graph[savenode].mark = 0) then begin insert(savenode); (*visit savenode here*) graph[savenode].mark := 1 end; adjptr := adjptr^.next end
)'( end end;
กิจกรรม 15.5 จงเขียนโปรแกรมที่สามารถแวะผานกราฟระบุทิศทางแนวกวาง โดยกราฟนัน้ มีการแทนดวยเมท ริกซประชิด จากกราฟที่กําหนดให จงเขียนรายชื่อของบัพที่ไดจากการแวะผานกราฟระบุทิศทางแนวกวาง /
0
1
2
เรื่องที่ 15.3.2 การแวะผานกราฟแนวลึก การแวะผานแนวลึก (Depth-first Traversal) ทํางานคลายกับการแวะผานทีละระดับของตนไม โดย กําหนดวิถีแรก จากรากลงไปที่ใบและอีกทางหนึ่งจากรากไปที่ใบจนกระทั่งมีการแวะผานหมดทุกบัพ การแวะผานแบบลึกของกราฟใน รูปที่ 15-5 ใหผลในการแวะผานบัพแบบเรียงลําดับ จาก 1,2,4,8,5,7,3,6 การแวะผานดําเนินงานจนกระทัง่ ไมมบี พั ทีส่ ามารถแวะไดหลงเหลืออยูเ ลย อัลกอริทมึ นีก้ ก็ ลับ ไปที่บัพสุดทายที่ไดรับการเยี่ยมซึ่งเชื่อมกับบัพถัดไปที่ยังไมไดรับการไปเยี่ยม ดังนัน้ จากรูปที่ 15-5 สามารถ ไปเยี่ยมบัพอีกวิธีหนึ่งไดตามลําดับดังนี้ คือ 1,3,6,7,8,2,5,4 สําหรับ การแวะผานแนวลึกใชเงื่อนไขแบบรีเคอรซีฟ สามารถเขียนเปนกระบวนงาน ไดดงั นี้ คือ procedure depth (var thisnode : nodeid); var savenode : nodeid; adjptr : edgptr; begin (*visit thisnode here*) graph[thisnode].mark := 1; adjptr := graph[thisnode].adjlist; while adjptr <> nil do begin savenode := adjptr^.node; if (graph[savenode].mark = 0) then depth(savenode); adjptr := adjptr^.next end; end;
)'! กิจกรรม 15.6 จากกราฟที่กําหนดให จงเขียนรายชื่อของบัพที่ไดจากการแวะผานกราฟระบุทิศทางแนวลึก /
0
1
2
จงเขียนโปรแกรมที่สามารถแวะผานกราฟระบุทิศทางแนวลึก หลายมิติ
โดยกราฟนัน้ มีการแทนดวยลิงกลสิ