การบ้าน : Dijkstra's Algorithm
ช่วยเขียน applet ที่ทำงานคล้าย ๆ applet
ข้างล่างนี้หน่อย (ไม่จำเป็นต้องเหมือนเปี๊ยบ)
กดปุ่ม Random เพื่อสุ่มสร้างจุด 101 จุด (จะนำเมาส์ไปคลิกจุดเพิ่มก็ทำได้) เมื่อกดปุ่ม Play
ก็จะเิริ่มหาวิถีสั้นสุดจากจุดแดงไปยังจุดอื่น ๆ ทั้งหมด
ข้างบนนี้เราถือว่ามี complete graph (เราไม่ได้แสดงเส้นเชื่อม เพราะจะแน่นไปหมด) โดยความยาวของเส้นเชื่อมมีค่าเป็นกำลังสองของระยะทางระหว่างจุด (หมายความว่าความยาวของเส้นเชื่อมระหว่างจุด i กับ j คือ (xi-xj)2 + (yi-yj)2) ขอเน้นว่าความยาวเส้นเชื่อมไม่ได้เป็นระยะทางสั้นสุดแบบ euclid ระหว่างจุดสองจุดบนระนาบสองมิติ เพราะถ้าเป็นเช่นนั้น การหา single-source shortest paths ก็จะง่ายมาก ดังแสดงด้วย applet ข้างล่างนี้ (ลองคิดเล่น ๆ ก่อนดูนะว่าจะได้ผลอย่างไร ก่อนกดปุ่ม Random แล้ว Play ข้างล่างนี้
อ้อลืมบอกไปว่า การแสดงการทำงานทั้งสอง applets ข้างบนนี้ เราจงใจให้มีการหน่วงเวลาเล็กน้อย (ประมาณ 30ms) ทุกครั้งที่มีการลากเส้นเชื่อมที่เลือก เพราะต้องการให้เห็นการเติบโตของต้นไม้ที่หาได้ระหว่างการทำงาน
วิธีส่ง
เมื่อทำเสร็จ ให้นำ applet ที่พัฒนาขึ้นพร้อมเขียน web page เพื่อสาธิตการทำงาน แล้วไปวางไว้ที่ใคร ๆ ก็ชมได้ จากนั้น
ส่ง source code พร้อม url ของ page ที่สาธิตการทำงานที่ว่านี้ มาให้ผมที่ somchaip@chula.ac.th โดยให้ mail มี subject ในรูปแบบดังนี้
HW327-01-xxxxxxxxxx ตามด้วยชื่อสกุล
โดยที่ xxxxxxxxxx คือรหัสนิสิต
ให้เวลาสองอาทิตย์ หมดเขต 27 ส.ค. ศกนี้
ช้อแนะนำ
จะเลือกใช้โครงสร้างข้อมูลอะไรก็ไม่ว่ากัน แต่ต้องใช้อัลกอริทึมของ Dijkstra
ถ้ามีเวลาว่างสักอีก 10 นาที
ให้สังเกตว่าต้นไม้ที่ได้นั้นไม่ใช่ Minimum spanning tree (ลองคิดดู) ถ้าว่าง ๆ ก็ลองปรับ applet ที่ได้เขียนไปอีกนิดเดียวให้หา minimum spanning tree ด้วยอัลกอริทึมของ Prim นั้นง่ายนิดเดียว แก้เพียงสองสามบรรทัดเท่านั้นจากของ Dijkstra หรือถ้าจะปรับ applet ให้เป็นแบบข้างล่างนี้ให้ผู้ใช้เลือกเอา ก็น่าสนใจ
สมชาย ประสิทธิ์จูตระกูล (15/8/47)