ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทย์ปัญหาอัลกอริทึมแบบตะกละ I/เฉลยข้อ 7"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 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 กับคนงานที่มีเวลาเลิกงานน้อยที่สุดที่กำลังพิจารณาในเซต เป็นผู้ตรวจงาน ดังนั้น จริง

พิจารณากรณีที่ สมมติให้ข้อความที่ต้องการพิสูจน์เป็นจริงสำหรับค่า นั่นคือ