ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทย์ปัญหาอัลกอริทึมแบบตะกละ I/เฉลยข้อ 8"
Aoy (คุย | มีส่วนร่วม) |
Aoy (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 1 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 5: | แถว 5: | ||
==''ข้อสังเกต''== | ==''ข้อสังเกต''== | ||
− | ให้ <math> l,m \, </math> เป็นผู้ใช้สองคนจากผู้ใช้ทั้งหมด <math> n \, </math> คน และให้การจัดลำดับการทำงานสองลำดับคือ <math> S_1,S_2 \, </math> ที่มีการจัดลำดับของผู้ใช้คนอื่น ๆ เหมือนกันหมด แต่ว่าต่างกันที่ลำดับการทำงานของผู้ใช้ คนที่ <math> l \,</math> กับ <math> m \, </math> เท่านั้น สมมติให้ลำดับที่หนึ่ง <math> S_1 \, </math> ให้งานของผู้ใช้คนที่ <math> l \, </math> ทำก่อนงานของผู้ใช้คนที่ <math> m \, </math> นั่นคือลำดับเป็นดังนี้ <math> i_1,i_2,...,i_l,i_m,...,i_n \,</math> ส่วนการจัดลำดับแบบที่สอง <math> S_2 \,</math> คือให้งานของผู้ใช้คนที่ <math> m \, </math> ทำก่อนงานของผู้ใช้คนที่ <math> l \, </math> นั่นคือลำดับเป็นดังนี้ <math> i_1,i_2,...,i_m,i_l,...,i_n \,</math> ดังนั้นเวลาคอยรวมของผู้ใช้จากการจัดลำดับแบบ <math> S_1 \, </math> คือ <math> \sum_{k=1}^{l-1}\sum_{j=1}^k t(i_j) + \sum_{j=1}^l t(i_j)+ \sum_{j=1}^m t(i_j)+ \sum_{k=m+1}^n \sum_{j=1}^k t(i_j) \,</math> ส่วนเวลาคอยรวมของผู้ใช้จากการจัดลำดับแบบ <math> S_2 \, </math> คือ <math> \sum_{k=1}^{m-1}\sum_{j=1}^k t(i_j) + \sum_{j=1}^m t(i_j)+ \sum_{j=1}^l t(i_j)+ \sum_{k=l+1}^n \sum_{j=1}^k t(i_j) \,</math> โดยที่ <math> \sum_{k=1}^{l-1}\sum_{j=1}^k t(i_j)=\sum_{k=1}^{m-1}\sum_{j=1}^k t(i_j) \,</math> และ <math> \sum_{k=m+1}^n \sum_{j=1}^k t(i_j)=\sum_{k=l+1}^n \sum_{j=1}^k t(i_j)\,</math>แต่ <math> \sum_{j=1}^l t(i_j) \,</math> และ <math> \sum_{j=1}^m t(i_j)\,</math> ใน <math> S_1 \, </math> และ <math> S_2 \, </math> ไม่เท่ากัน | + | ให้ <math> l,m \, </math> เป็นผู้ใช้สองคนจากผู้ใช้ทั้งหมด <math> n \, </math> คน และให้การจัดลำดับการทำงานสองลำดับคือ <math> S_1,S_2 \, </math> ที่มีการจัดลำดับของผู้ใช้คนอื่น ๆ เหมือนกันหมด แต่ว่าต่างกันที่ลำดับการทำงานของผู้ใช้ คนที่ <math> l \,</math> กับ <math> m \, </math> เท่านั้น สมมติให้ลำดับที่หนึ่ง <math> S_1 \, </math> ให้งานของผู้ใช้คนที่ <math> l \, </math> ทำก่อนงานของผู้ใช้คนที่ <math> m \, </math> นั่นคือลำดับเป็นดังนี้ <math> i_1,i_2,...,i_l,i_m,...,i_n \,</math> ส่วนการจัดลำดับแบบที่สอง <math> S_2 \,</math> คือให้งานของผู้ใช้คนที่ <math> m \, </math> ทำก่อนงานของผู้ใช้คนที่ <math> l \, </math> นั่นคือลำดับเป็นดังนี้ <math> i_1,i_2,...,i_m,i_l,...,i_n \,</math> ดังนั้นเวลาคอยรวมของผู้ใช้จากการจัดลำดับแบบ <math> S_1 \, </math> คือ <math> \sum_{k=1}^{l-1}\sum_{j=1}^k t(i_j) + \sum_{j=1}^l t(i_j)+ \sum_{j=1}^m t(i_j)+ \sum_{k=m+1}^n \sum_{j=1}^k t(i_j) \,</math> ส่วนเวลาคอยรวมของผู้ใช้จากการจัดลำดับแบบ <math> S_2 \, </math> คือ <math> \sum_{k=1}^{m-1}\sum_{j=1}^k t(i_j) + \sum_{j=1}^m t(i_j)+ \sum_{j=1}^l t(i_j)+ \sum_{k=l+1}^n \sum_{j=1}^k t(i_j) \,</math> โดยที่ <math> \sum_{k=1}^{l-1}\sum_{j=1}^k t(i_j)=\sum_{k=1}^{m-1}\sum_{j=1}^k t(i_j) \,</math> และ <math> \sum_{k=m+1}^n \sum_{j=1}^k t(i_j)=\sum_{k=l+1}^n \sum_{j=1}^k t(i_j)\,</math> แต่ <math> \sum_{j=1}^l t(i_j) \,</math> และ <math> \sum_{j=1}^m t(i_j)\,</math> ใน <math> S_1 \, </math> และ <math> S_2 \, </math> ไม่เท่ากัน |
==''การพิสูจน์ความถูกต้องของอัลกอริทึม''== | ==''การพิสูจน์ความถูกต้องของอัลกอริทึม''== | ||
แถว 17: | แถว 17: | ||
ต่อไปเราต้องทำการพิสูจน์ให้ได้ว่า การสลับลำดับการจัดงานให้เครื่องจักรข้างต้นจะไม่ทำให้เวลาคอยรวมของผู้ใช้เพิ่มขึ้น | ต่อไปเราต้องทำการพิสูจน์ให้ได้ว่า การสลับลำดับการจัดงานให้เครื่องจักรข้างต้นจะไม่ทำให้เวลาคอยรวมของผู้ใช้เพิ่มขึ้น | ||
− | + | จากข้อสังเกตข้างต้น เพื่อความง่ายในการแทนค่าในสมการเวลาคอย จะกำหนดให้ <math> \sum_{k=1}^{l-1}\sum_{j=1}^k t(i_j)=\sum_{k=1}^{m-1}\sum_{j=1}^k t(i_j)=U \,</math> และ <math> \sum_{k=m+1}^n \sum_{j=1}^k t(i_j)=\sum_{k=l+1}^n \sum_{j=1}^k t(i_j)=V \,</math> | |
− | และจะได้ว่าหลังการสลับ | + | ก่อนการสลับจะได้ว่า <math> \sum_{j=1}^l t(i_j)=U+t(l) \, </math> และ <math> \sum_{j=1}^m t(i_j)=U+t(l)+t(m) \, </math> ทำให้เวลาคอยรวมของผู้ใช่ก่อนการสลับจะเท่ากับ <math> U+U+t(l)+U+t(l)+t(m)+V \,</math> |
+ | |||
+ | และจะได้ว่าหลังการสลับ <math> \sum_{j=1}^m t(i_j)=U+t(m) \, </math> และ <math> \sum_{j=1}^l t(i_j)=U+t(m)+t(l) \, </math> ทำให้เวลาคอยรวมของผู้ใช่ก่อนการสลับจะเท่ากับ <math> U+U+t(m)+U+t(m)+t(l)+V \,</math> | ||
เมื่อพิจารณาสมการเวลาคอยรวมก่อนและหลังสลับข้างต้น และเนื่องจาก <math> t(l) > t(m) \,</math> เราจะได้ว่าหลังการสลับไม่ได้ทำให้เวลาคอยรวมของผู้ใช้เพิ่มขึ้น | เมื่อพิจารณาสมการเวลาคอยรวมก่อนและหลังสลับข้างต้น และเนื่องจาก <math> t(l) > t(m) \,</math> เราจะได้ว่าหลังการสลับไม่ได้ทำให้เวลาคอยรวมของผู้ใช้เพิ่มขึ้น | ||
ดังนั้นเราจึงสรุปได้ว่าการจัดลำดับการทำงานให้เครื่องจักรตามวิธี greedy algorithm ข้างต้น ทำให้เวลาคอยรวมของผู้ใช้น้อยที่สุดเท่าที่จะเป็นไปได้แล้ว | ดังนั้นเราจึงสรุปได้ว่าการจัดลำดับการทำงานให้เครื่องจักรตามวิธี greedy algorithm ข้างต้น ทำให้เวลาคอยรวมของผู้ใช้น้อยที่สุดเท่าที่จะเป็นไปได้แล้ว |
รุ่นแก้ไขปัจจุบันเมื่อ 19:09, 18 กันยายน 2552
อัลกอริทึม
เรียงงานของผู้ใช้ตาม จากน้อยไปหามาก แล้วส่งให้เครื่องจักรทำงานตามลำดับนั้น จะได้ว่า อัลกอริทึมทำงานได้ในเวลา ซึ่งใช้ในการเรียงลำดับนั่นเอง
โจทย์ต้องการให้เวลาคอยรวมของผู้ใช้ทุกคนมีค่าน้อยที่สุด เขียนเป็นสมการทางคณิตศาสตร์คือต้องการให้ค่า มีค่าน้อยที่สุดนั่นเอง
ข้อสังเกต
ให้ เป็นผู้ใช้สองคนจากผู้ใช้ทั้งหมด คน และให้การจัดลำดับการทำงานสองลำดับคือ ที่มีการจัดลำดับของผู้ใช้คนอื่น ๆ เหมือนกันหมด แต่ว่าต่างกันที่ลำดับการทำงานของผู้ใช้ คนที่ กับ เท่านั้น สมมติให้ลำดับที่หนึ่ง ให้งานของผู้ใช้คนที่ ทำก่อนงานของผู้ใช้คนที่ นั่นคือลำดับเป็นดังนี้ ส่วนการจัดลำดับแบบที่สอง คือให้งานของผู้ใช้คนที่ ทำก่อนงานของผู้ใช้คนที่ นั่นคือลำดับเป็นดังนี้ ดังนั้นเวลาคอยรวมของผู้ใช้จากการจัดลำดับแบบ คือ ส่วนเวลาคอยรวมของผู้ใช้จากการจัดลำดับแบบ คือ โดยที่ และ แต่ และ ใน และ ไม่เท่ากัน
การพิสูจน์ความถูกต้องของอัลกอริทึม
เราจะพิสูจน์ความถูกต้องของอัลกอริทึมโดยใช้เทคนิค exchange argument ให้ แทนวิธีการจัดลำดับการทำงานให้เครื่องจักรที่มีเวลาคอยรวมของผู้ใช้น้อยที่สุด เราจะแสดงว่าเราสามารถเปลี่ยนวิธีการจัดลำดับการส่งงานให้เครื่องจักร ไปเป็นวิธีการจัดลำดับการส่งงานให้เครื่องจักรทำเรียงตามค่า จากน้อยไปมากได้ โดยที่เวลาคอยรวมของผู้ใช้ไม่เพิ่มขึ้น
สมมติว่า ไม่ใช่การจัดลำดับตามวิธีการในอัลกอริทึมข้างต้น แสดงว่ามี inversion ที่อยู่ติดกัน กล่าวคือจะต้องมีงานของผู้ใช้คนที่ และ ที่ แต่ งานของผู้ใช้คนที่ ได้ทำก่อนของผู้ใช้คนที่
จากในห้องเรียนเราได้ทำการพิสูจน์ไปแล้วว่า เมื่อมี inversion แล้วจะต้องมีคู่ของ inversion ที่ติดกัน กล่าวคือจะต้องมีงานของลูกค้าคนที่ และ ที่ และงานของผู้ใช้คนที่ ถูกทำต่อจากงานของผู้ใช้คนที่ ทันที ถ้าหากเราสลับให้งานของผู้ใช้คนที่ ทำก่อนงานของผู้ใช้คนที่ เราก็สามารถลดจำนวนของ inversion ไปได้อีกหนึ่งตัว และเราสามารถทำแบบนี้ไปได้เรื่อย ๆ จนกระทั่งไม่เหลือ inversion ดังนั้นเราจะสามารถเปลี่ยนลำดับการจัดงานให้เครื่องจักรแบบ ให้เป็นลำดับจัดงานให้เครื่องจักรเหมือนใน greedy algorithm ที่เรานำเสนอได้เสมอ
ต่อไปเราต้องทำการพิสูจน์ให้ได้ว่า การสลับลำดับการจัดงานให้เครื่องจักรข้างต้นจะไม่ทำให้เวลาคอยรวมของผู้ใช้เพิ่มขึ้น
จากข้อสังเกตข้างต้น เพื่อความง่ายในการแทนค่าในสมการเวลาคอย จะกำหนดให้ และ
ก่อนการสลับจะได้ว่า และ ทำให้เวลาคอยรวมของผู้ใช่ก่อนการสลับจะเท่ากับ
และจะได้ว่าหลังการสลับ และ ทำให้เวลาคอยรวมของผู้ใช่ก่อนการสลับจะเท่ากับ
เมื่อพิจารณาสมการเวลาคอยรวมก่อนและหลังสลับข้างต้น และเนื่องจาก เราจะได้ว่าหลังการสลับไม่ได้ทำให้เวลาคอยรวมของผู้ใช้เพิ่มขึ้น
ดังนั้นเราจึงสรุปได้ว่าการจัดลำดับการทำงานให้เครื่องจักรตามวิธี greedy algorithm ข้างต้น ทำให้เวลาคอยรวมของผู้ใช้น้อยที่สุดเท่าที่จะเป็นไปได้แล้ว