Category Archives: programming

วิทย์ม.ต้น: “ปัญหาเลือกคู่” (Optimal Stopping Problem)

(ลิงก์ดาวโหลดอยู่ด้านล่าง)

เราคุยต่อเนื่องมากจากสัปดาห์ที่แล้วที่เด็กๆได้รู้จัก “ปัญหาเลือกคู่” แล้วให้พยายามเขียนโปรแกรมเช็คว่าเป็นจริงตามที่ทฤษฎีบอกหรือไม่ เรามาเฉลยกันในห้องครับ

 “ปัญหาเลือกคู่” (marriage problem หรือ secretary problem) หรือรู้จักในชื่อทั่วไปคือ optimal stopping problem คือสมมุติว่าเรามีโอกาสคบคนทั้งหมด n คน โดยที่ต้องคบทีละคน และต้องเลิกคบกับคนปัจจุบันก่อนที่จะไปคบคนต่อไป เมื่อเลิกคบกับใครแล้วห้ามกลับไปคบกับเขาอีก แล้วต้องตัดสินใจว่าจะเลือกใครเป็นคู่ โดยหวังว่าจะเลือกคนที่ดีที่สุดใน n คนนี้ 

ปรากฎว่ามีวิธีที่ทำให้เรามีโอกาสประมาณ 37% ที่จะเลือกคนที่ดีที่สุดได้ ไม่ว่าจำนวน n จะเป็น 3, 10, 100, หรือ 1 ล้าน คือให้คบคนไป n/e คนก่อน (e เป็นค่าคงที่ 2.71828… เรียกว่าค่าอีหรือค่าคงที่ของออยเลอร์) อย่าพึ่งเลือกคนเหล่านี้ จากนั้นให้เลือกคนแรกที่ดีกว่าคนที่เคยคบมา (หรือเลือกคนสุดท้ายเมื่อไม่เหลือใครแล้ว) ยกตัวอย่างเช่นถ้าเราคิดว่าคงมีเวลาคบคน 10 คน ค่า n ของเราก็คือ 10 ดังนั้นให้เราคบไป 10/e = 10/2.71828… = 3.6787.. เท่ากับประมาณ 4 โดยที่เรายังไม่ตัดสินใจเลือกใครใน 4 คนนี้ ต่อไปเราคบกับคนที่เหลือทีละคน แล้วเลือกคนแรกที่ดีกว่าคนที่เราเคยคบมา ถ้าหาไม่ได้ก็เลือกคนสุดท้าย

หน้าตาโปรแกรมที่ทดสอบวิธีหาคู่แบบนี้ก็จะมีหน้าตาประมาณนี้ครับ:

ให้คอมพิวเตอร์ทดลองแทนคน 10,000 คนได้ผลสำเร็จประมาณ 37% หรือมากกว่าครับ:

ผมบันทึกตัวอย่างเหล่านี้ไว้ให้เด็กๆและผู้สนใจเข้ามาดูทบทวนโดยสามารถโหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่นะครับ

วิทย์ม.ต้น: ม.1 ดูที่มาของสูตรพื้นที่และปริมาตร, หัดเขียนฟังก์ชั่นต่างๆด้วยไพธอน

สัปดาห์นี้เด็กๆม.1 หัดเขียนฟังก์ชั่นต่างๆกันต่อ ให้เด็กๆคิดว่าถ้าจะสร้างฟังก์ชั่นอะไรจะต้องการข้อมูลอะไรที่ต้องป้อนเข้าไปบ้าง ให้เด็กๆดู animations ว่าสูตรการหาพื้นที่ต่างๆมาได้อย่างไรจะได้เห็นที่มาที่ไปของสูตรต่างๆที่เราเอามาใช้ในฟังก์ชั่นเราได้ เช่นคลิปเหล่านี้:

พื้นที่สี่เหลี่ยมคางหมูมาได้อย่างไร
พื้นที่สี่เหลี่ยมคางหมูมาได้อย่างไร
พื้นที่วงกลมมาได้อย่างไร
ปริมาตรทรงกลมมาได้อย่างไร
พื้นที่ผิวทรงกลมมาได้อย่างไร
วิธีหาพื้นที่สามเหลี่ยมถ้ารู้ความยาวด้านทั้งสาม พิสูจน์ที่ https://www.youtube.com/watch?v=TZq9hj3T8PU

จากนั้นเด็กๆก็เขียนวิธีคำนวณต่างๆที่เขารู้จักในวิชาคณิตศาสตร์เป็นฟังก์ชั่นในไพธอนกันครับ หน้าตาจะเป็นประมาณนี้:

วิทย์ม.ต้น: StanDard Error of Mean = SEM = ประมาณคุณภาพของคำตอบจากการสุ่ม, “ปัญหาเลือกคู่” (Optimal Stopping Problem)

สัปดาห์ที่แล้วเด็กๆม.2-3 รู้จักการสุ่มหาคำตอบเมื่อปัญหาใหญ่เกินกำลังที่จะแก้แบบเป๊ะๆได้ สัปดาห์นี้จึงมาเข้าใจว่าคำตอบที่สุ่มได้มาพอเชื่อได้แค่ไหน

วิธีตรงไปตรงมาเข้าใจง่ายก็คือลองสุ่มหลายๆรอบแล้วเก็บคำตอบการสุ่มแต่ละรอบเอาไว้ แล้วเอาคำตอบที่เก็บไว้ทั้งหมดมาหาค่าเฉลี่ย (mean) และค่าเบี่ยงเบนของค่าเฉลี่ย (standard error of mean หรือ SEM) ถ้า SEM เล็กคำตอบก็พอเชื่อถือได้

เราคำนวณ SEM จาก ค่าเบี่ยงเบนมาตรฐานของตัวอย่าง (sample standard deviation หรือ s) กัน โดยที่ SEM = s/รูทที่สองของจำนวนคำตอบที่เก็บมา

เด็กๆรู้จักวิธีคำนวณ mean และ sample standard deviation แบบหน้าตาประมาณนี้:

แต่จริงๆแล้วเราสามารถใช้ฟังก์ชั่นที่มีในไพธอนอยู่แล้วมาคำนวณให้ก็ได้คือฟังก์ชั่น numpy.mean() และ numpy.std()

ใส่ doff = 1 ใน numpy.std() เพื่อหา sample standard deviation

หน้าตาของการหาค่าเฉลี่ยและ SEM ก็จะเป็นประมาณนี้ (เก็บข้อมูล n_trials ครั้ง):

ถ้าเก็บคำตอบมาหลายครั้ง (จำนวนครั้ง = n_trials) เราก็จะมั่นใจในคำตอบมากขึ้นเมื่อ SEM เล็กลงเรื่อยๆแบบนี้:

ผมแนะนำให้เด็กๆรู้จักกับ “ปัญหาเลือกคู่” (marriage problem หรือ secretary problem) หรือรู้จักในชื่อทั่วไปคือ optimal stopping problem คือสมมุติว่าเรามีโอกาสคบคนทั้งหมด n คน โดยที่ต้องคบทีละคน และต้องเลิกคบกับคนปัจจุบันก่อนที่จะไปคบคนต่อไป เมื่อเลิกคบกับใครแล้วห้ามกลับไปคบกับเขาอีก แล้วต้องตัดสินใจว่าจะเลือกใครเป็นคู่ โดยหวังว่าจะเลือกคนที่ดีที่สุดใน n คนนี้

ปรากฎว่ามีวิธีที่ทำให้เรามีโอกาสประมาณ 37% ที่จะเลือกคนที่ดีที่สุดได้ ไม่ว่าจำนวน n จะเป็น 3, 10, 100, หรือ 1 ล้าน คือให้คบคนไป n/e คนก่อน (e เป็นค่าคงที่ 2.71828… เรียกว่าค่าอีหรือค่าคงที่ของออยเลอร์) อย่าพึ่งเลือกคนเหล่านี้ จากนั้นให้เลือกคนแรกที่ดีกว่าคนที่เคยคบมา (หรือเลือกคนสุดท้ายเมื่อไม่เหลือใครแล้ว) ยกตัวอย่างเช่นถ้าเราคิดว่าคงมีเวลาคบคน 10 คน ค่า n ของเราก็คือ 10 ดังนั้นให้เราคบไป 10/e = 10/2.71828… = 3.6787.. เท่ากับประมาณ 4 โดยที่เรายังไม่ตัดสินใจเลือกใครใน 4 คนนี้ ต่อไปเราคบกับคนที่เหลือทีละคน แล้วเลือกคนแรกที่ดีกว่าคนที่เราเคยคบมา ถ้าหาไม่ได้ก็เลือกคนสุดท้าย

สำหรับการบ้านเด็กๆสัปดาห์นี้ ผมให้เด็กๆไปเขียนโปรแกรมตรวจว่าวิธีเลือกคู่แบบนี้ได้ผลจริงๆไหมสำหรับ n ต่างๆ

วิธีเลือกแบบนี้เป็นเรื่องเดียวกับการเลือกห้องน้ำในคอนเสิร์ตด้วยครับ 😃:

ถ้าสนใจว่า n/e มาได้อย่างไร ดูวิดีโอข้างบน จะมีลิงก์ไปวิดีโอที่แสดงวิธี หรืออ่านที่นี่ก็ได้ครับ