ปกติโดยส่วนตัวแล้วผมเป็นคนชอบใช้งานอะไรที่ง่าย ๆ ไม่ต้องพิธีรีตรองมาก ถึงแม้ว่าจริง ๆ แล้วจะชอบศึกษาเรื่องที่ดูซับซ้อนมาก ๆ ก็ตาม
แต่การอธิบายให้อยู่ในรูปที่เข้าใจได้ง่าย ๆ นั้นน่าจะดีกว่า
ดังนั้นเมื่อต้องการแก้ไขปัญหาบางอย่างที่มีความซับซ้อนขึ้นมา ผมจะชอบเลือกวิธี Brute force มาเป็นอันดับต้น ๆ แม้ว่าไม่ได้ตั้งความหวัง ไว้ว่า 100% ต้องเจอผลลัพธ์อย่างถูกต้องแม่นยำ แต่อย่างน้อยวิธีการนี้อาจทำให้เราเห็นถึงธรรมชาติของปัญหานั้น ๆ ได้เร็วขึ้น
แน่นอน ในการทำงานบางครั้งที่ต้องเจอกับ Tools หรือ Frame work ที่ยุ่งยากซับซ้อน ผมจะทำการ Hack มัน :)

วิธีแบบ Monte Carlo เป็นหนึ่งในวิธีที่ใช้แก้ปัญหาที่เข้ากันกับธรรมชาติของผมมาก
วิธีนี้มี Concept คร่าว ๆ ดังนี้ครับ

1. นิยามค่าที่เป็นไปได้ทั้งหมดของข้อมูล input
2. สุ่มยิงค่า input เข้าไปแบบกระจัดกระจาย
3. ทำการคำนวนหา ความสัมพันธ์ของค่า input เพิ่อหา output ที่ต้องการ
4. รวบรวมผลลัพธ์มาสรุปเป็น คำตอบสุดท้าย

ตัวอย่างสุด Hot ของ Monte Carlo method ก็คงไม่พ้น การหาค่า pi ในแบบ Monte Carlo
จาก step ข้างบน เรามาสรุปเป็นวิธีหาค่า pi ได้ดังนี้


1. วาดสี่เหลี่ยมจตุรัสลงบนพื้น จากนั้นวาดวงกลมลงไปให้พอดีกับรูป 4 เหลี่ยม เราสามารถหาความสัมพันธ์ของ pi ได้จาก การถอดสมการพื้นที่ของ รูปสี่เหลี่ยม และ วงกลมนี้ โดย
พื้นที่ของวงกลม/พื้นที่ของรูปสี่เหลี่ยม = pi * r^2/(2r)^2 = pi/4
2. สุ่มโปรยเม็ดถั่วลงไป อย่างกระจัดกระจายและทั่วถึง
3. ในเมื่อ ความสัมพันธ์ของ  พื้นที่ของวงกลม/พื้นที่ของรูปสี่เหลี่ยม = pi/4 ดังนั้น pi = 4 * (พื้นที่ของวงกลม/พื้นที่ของรูปสี่เหลี่ยม) เราสามารถหาอัตราส่วนต่อพื้นที่นี้ได้อย่างหยาบ ๆ ได้ด้วยการนับเม็ดถั่ว
4. เอาผลลัพธ์ที่ได้ มาคูณด้วย 4 ก็จะได้ค่า pi โดยประมาณ

เมื่อใช้วิธีนี้ถึงเราจะไม่ได้ค่าที่ถูกต้องแม่นยำ แต่มันก็พอเพียงที่เราจะเห็นหน้าค่าตาของค่า pi มาอย่างคร่าว ๆ แล้ว
แถมยังรวดเร็วทันใจ :)

อาจมีคนอยากเถียงผมนะว่าแค่เอา 22 ไปหารกับ 7 แล้วจะได้ค่า pi เป็นวิธีที่ง่ายมาก
แต่จริง ๆ แล้ววิธีนี้เป็นวิธีลัดที่เกิดจากการหาค่า pi ได้อย่างแม่นยำได้แล้ว ภายหลังจึงมีคนย่อรูปลง ให้อยู่ในค่าใกล้เคียงที่จำได้ง่าย ๆ

เรามาลองคำนวนค่า pi แบบ Monte Carlo ด้วย simulation กันด้วยกระสุนเม็ดถั่ว 100000 นัดกันดูครับ

#โค้ดโปรแกรมภาษาไทยธอน
จำนวนกระสุนทั้งหมด = 100000
เข้าเป้า = 0
จำนวนนัด = 0
แต่ละ เม็ดกระสุน ใน ระยะ(จำนวนกระสุนทั้งหมด):
	จำนวนนัด += 1
	x = สุ่ม()
	y = สุ่ม()
	รัศมี = คณิต.ถอดราก(x**2 + y**2)
	ถ้า รัศมี  <= 1.0:
		เข้าเป้า += 1.0

ไพ = 4 * (เข้าเป้า / จำนวนนัด)

แสดงผล( "pi = %s" %(ไพ))

การทดลองแต่ละครั้งจะได้ผลไม่เท่ากัน เพราะเป็นค่าประมาณจากการสุ่ม แต่ก็ได้ค่าใกล้เคียงมาพอสมควร

เพื่อให้เห็นภาพที่ชัดเจนยิ่งขึ้นเดี๋ยวหลังจากปรับปรุงตัว Thaithon เป็นที่เรียบร้อยแล้ว เรามาดู simulation ที่เป็น visual กันดูมั่ง
เร็ว ๆ นี้ครับ

Comments
  1. […] การคำนวนค่าไพแบบมอลติคาร์โลที่เคยได้เสนอไปแล้วในบทความก่อน ๆ […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s