418531 ภาคต้น 2552/โจทย์ปัญหาอัลกอริทึมแบบตะกละ I/เฉลยข้อ 7
อัลกอริทึม
เรียงเวลาการเข้างานของคนงานตามเวลาเลิกจากน้อยไปหามาก เมื่อพิจารณาเวลาการทำงานของคนงานที่มีเวลาเลิกงานช้าที่สุด แล้วเลือกคนที่มีเวลาทำงาน overlap กับคนงานนี้ที่มีเวลาเลิกงานช้าที่สุดเป็นผู้ตรวจงาน จากนั้นลบคนงานทุก ๆ คนที่มีเวลาทำงาน overlap กับผู้ตรวจงานคนนี้ออกจากเซตของคนงานที่กำลังพิจารณา ทำแบบนี้ไปเรื่อย ๆ จนเซตของคนงานที่กำลังพิจารณาเป็นเซตว่าง
<geshi lang="c"> Supervisor() {
G = empty set // ให้ G เป็นเซตของผู้ตรวจงาน S = {1,2,...,n} // เซตของคนงานที่กำลังพิจารณา ที่เรียงตามเวลาเลิกงานจากน้อยไปมาก นั่นคือ f1 <= f2 <= ... <= fn นั่นเอง while S not empty do { i = {j in S| min f(j)} // i เป็นคนงานในเซตของคนงานที่กำลังพิจารณาที่มีเวลาเลิกงานช้าที่สุดตอนนี้ Oi={k in S| s(k) <= f(i) or s(i) < = f(k)} // Oi เป็นเซตของคนงานทุกคนในเซตของคนงานที่กำลังพิจารณาที่มีเวลาทำงาน overlap กับคนที่ i l = {m in S| min f(m)} // ให้ l เป็นคนงานที่มีเวลาทำงาน overlap กับ คนงานคนที่ i ที่เลิกงานช้าที่สุด G = G union l // เพิ่มคนงาน l เข้าไปในเซตของผู้ตรวจงาน Ol = {k in S| s(k) <= f(l) or s(l) <= f(k)} // Ol เป็นเซตของคนงานทุกคนในเซตของคนงานที่กำลังพิจารณาที่มีเวลาทำงาน overlap กับผู้ตรวจงาน l S= S - Ol } return G
} </geshi>
การพิสูจน์ความถูกต้องของอัลกอริทึม
จะใช้เทคนิค greedy algorithm นำหน้าเสมอ ดังนี้ ให้ เป็นเซตของผู้ตรวจงานที่ได้จาก greedy algorithm ข้างต้น และ เป็นเซตของผู้ตรวจงานที่ได้จาก optimal algorithm (อัลกอริทึมสำหรับการแก้ปัญหาข้างต้นที่ให้เซตของผู้ตรวจงานที่มีจำนวนน้อยที่สุด) เราจะทำการพิสูจน์โดยบอกว่า สังเกตว่า เนื่องจาก เป็นคำตอบที่ดีที่สุด ดังนั้น เสมอ
สมมติให้เวลาการเข้างานของ ถูกเรียงตามเวลาเลิกงานจากน้อยไปมากด้วย
lemma:สำหรับ ใด ๆ แล้ว เสมอ
พิสูจน์:ทำการพิสูจน์โดย induction บน r กรณี base case เนื่องจาก greedy algorithm เลือกคนงานที่มีเวลาเลิกงานช้าที่สุดที่ overlap กับคนงานที่มีเวลาเลิกงานน้อยที่สุดที่กำลังพิจารณาในเซต เป็นผู้ตรวจงาน ดังนั้น จริง
พิจารณากรณีที่ สมมติให้ข้อความที่ต้องการพิสูจน์เป็นจริงสำหรับค่า นั่นคือ ต้องการพิสูจน์ว่า ด้วย
พิสูจน์โดยข้อขัดแย้ง สมมติให้ พิจารณาการที่ greedy algorithm เลือกผู้ตรวจงานถึงคนที่ แสดงว่าต้องมีคนงานคนหนึ่งให้เป็นคนที่ ที่มีเวลาเริ่มงานทีหลังผู้ตรวจงานคนที่ นี้ นั่นคือ เราจะได้ว่าเวลาการทำงานของคนงานคนที่ นี้จะต้อง overlap กับผู้ตรวจงานคนที่ ของ ด้วย เพราะไม่เช่นนั้นคนที่ นี้ก็จะไม่มีผู้ตรวจงานคนไหน ตรวจงานเค้าได้ (ไม่เป็นไปตามเงื่อนไขของบริษัท) แต่เนื่องจาก greedy algorithm เลือกผู้ตรวจงานเป็นคนงานคนที่มีเวลาเลิกงานช้าที่สุด และในที่นี้ greedy algorithm เลือกคนที่ จึงเกิดข้อขัดแย้งที่ว่า ดังนั้นเราสามารถสรุปได้ว่า สำหรับ ใด ๆ
ทฤษฎีบท: Greedy algorithm ใช้จำนวนผู้ตรวจงานน้อยที่สุดเท่าที่จะเป็นไปได้ กล่าวคือ
พิสูจน์: สมมติเพื่อให้เกิดข้อขัดแย้งว่า
พิจารณาเมื่อ เพิ่มคนงานคนที่ เข้าไปเป็นผู้ตรวจงาน เนื่องจากผู้ตรวจงาน ตรวจงานคนงานได้ครบทุกคนตามเงื่อนไขของบริษัทแล้ว แสดงว่าไม่มีคนงานคนไหนที่มีเวลาทำงานไม่ overlap กับผู้ตรวจงาน คนในวิธีการของ และจาก lemma เราได้ว่า จึงได้ว่าไม่มีคนงานคนไหนที่ที่มีเวลาทำงานไม่ overlap กับผู้ตรวจงานคนที่ ด้วย แต่การที่ greedy algorithm ยังเพิ่มผู้ตรวจงานคนที่ เข้าไปอีก แสดงว่า greedy algorithm ยังทำงานไม่จบ ทั้ง ๆ ที่ควรจบได้แล้ว เพราะคนงานทุกคนมีผู้ตรวจงานที่มีเวลา overlap กับตนเองแล้ว จึงเกิดข้อขัดแย้ง
ดังนั้น และ greedy algorithm ใช้จำนวนผู้ตรวจงานน้อยที่สุดเท่าที่จะเป็นไปได้