ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทย์ปัญหาอัลกอริทึมแบบตะกละ I/เฉลยข้อ 7"
Aoy (คุย | มีส่วนร่วม) |
Aoy (คุย | มีส่วนร่วม) |
||
แถว 19: | แถว 19: | ||
} | } | ||
</geshi> | </geshi> | ||
+ | |||
+ | ==''การพิสูจน์ความถูกต้องของอัลกอริทึม''== | ||
+ | จะใช้เทคนิค greedy algorithm นำหน้าเสมอ ดังนี้ ให้ <math> G=\{i_1,i_2,...,i_k \} \, </math> เป็นเซตของผู้ตรวจงานที่ได้จาก greedy algorithm ข้างต้น และ <math> OPT=\{j_1,j_2,...,j_m \} \, </math> เป็นเซตของผู้ตรวจงานที่ได้จาก optimal algorithm (อัลกอริทึมสำหรับการแก้ปัญหาข้างต้นที่ให้เซตของผู้ตรวจงานที่มีขนาดน้อยที่สุด) เราจะทำการพิสูจน์โดยบอกว่า <math> k = m \,</math> สมมติให้เวลาการเข้างานของ <math> OPT \, </math> ถูกเรียงตามเวลาเลิกงานจากน้อยไปมากด้วย | ||
+ | |||
+ | ''lemma:''สำหรับ <math> r \leq k \,</math> ใด ๆ แล้ว <math> f(i_r) \geq f(j_r) \,</math> เสมอ | ||
+ | |||
+ | ''พิสูจน์''ทำการพิสูจน์โดย induction บน r กรณี base case <math> r=1 \, </math> เนื่องจาก greedy algorithm เลือกคนงานที่มีเวลาเลิกงานช้าที่สุดที่ overlap กับคนงานที่มีเวลาเลิกงานน้อยที่สุดที่กำลังพิจารณาในเซต <math> S \, </math> เป็นผู้ตรวจงาน ดังนั้น <math> f(i_1) \geq f(j_1) \, </math> จริง | ||
+ | |||
+ | พิจารณากรณีที่ <math> r > 1 \, </math> สมมติให้ข้อความที่ต้องการพิสูจน์เป็นจริงสำหรับค่า <math> r-1 \, </math> นั่นคือ <math> f(i_{r-1}) \geq f(j_{r-1}) \, </math> |
รุ่นแก้ไขเมื่อ 08:21, 19 กันยายน 2552
อัลกอริทึม
เรียงเวลาการเข้างานของคนงานตามเวลาเลิกจากน้อยไปหามาก เมื่อพิจารณาเวลาการทำงานของคนงานที่มีเวลาเลิกงานช้าที่สุด แล้วเลือกคนที่มีเวลาทำงาน 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 กับคนงานที่มีเวลาเลิกงานน้อยที่สุดที่กำลังพิจารณาในเซต เป็นผู้ตรวจงาน ดังนั้น จริง
พิจารณากรณีที่ สมมติให้ข้อความที่ต้องการพิสูจน์เป็นจริงสำหรับค่า นั่นคือ