• 27 min

เกม 24 กับ วิทยาการคอมพิวเตอร์

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

เป็ดไอคอนของเรื่องเล่าชาวอัลกอ Practical Algorithms
Practical Algorithms: เรื่องเล่าชาวอัลกอ
เพจที่อยากให้คนไทยมีเนื้อหาอัลกอริทึมดีๆ ให้ได้อ่านกัน
เป็ดน้องอัลกอกำลังเล่นเกม 24 อยู่ มีเลข 3 2 5 9 ลอยอยู่รอบๆตัว

เกม 24 คืออะไร?

สำหรับคนที่ยังไม่เคยได้ยินมาก่อนเลยว่า “เกม 24” คืออะไร: มันเป็นเกมคิดเลขที่คนเล่นจะได้เลข 1-9 มา 4 ตัว แล้วเราจะเอาเลขพวกนั้นมาบวก ลบ คูณ หารให้ยังไงก็ได้ ให้ได้ผลลัพธ์เป็น 24

อย่างเช่น มีตัวเลข 3 2 5 9 ให้คำนวณให้ได้ 24

ซึ่งตัวอย่างนึงที่ทำได้ก็จะเป็นว่า

  • 52=35 - 2 = 3
  • 9×3=279 \times 3 = 27
  • 273=2427 - 3 = 24

ถ้าเอามาเลองวาดความเชื่อมโยงเล่นๆก็จะได้ว่า

กราฟแทนการเปลี่ยน state จาก 3 2 5 9 ไปเป็น 3 3 9 ไป 3 27 เป็น 24 โดยแต่ละ state ถูกวาดด้วยวงกลม แล้วมีลูกศรชี้ไปหา state ที่เกี่ยวข้อง 3 2 5 9 ไปเป็น 3 3 9 ที่ลูกศรมีบอกว่า 5 - 2 = 3 จาก 3 3 9 ไป 3 27 มีเขียน 3*9 = 27 อยู่ กราฟความเชื่อมโยง

กราฟแทนการเปลี่ยน state จาก 3 2 5 9 ไปเป็น 3 3 9 ไป 3 27 เป็น 24 โดยแต่ละ state ถูกวาดด้วยวงกลม แล้วมีลูกศรชี้ไปหา state ที่เกี่ยวข้อง 3 2 5 9 ไปเป็น 3 3 9 ที่ลูกศรมีบอกว่า 5 - 2 = 3 จาก 3 3 9 ไป 3 27 มีเขียน 3*9 = 27 อยู่ กราฟความเชื่อมโยง

แน่นอนว่านี่เป็นแค่หนึ่งในรูปแบบที่ทำได้ แต่คำถามคือเราจะไปรู้ได้ยังไงล่ะว่าต้องทำอะไรบ้าง แล้วทำอันไหนก่อนหลัง

ถ้าอยากลองคิดข้ออื่นเล่นๆดูก็เข้าไปเล่นได้ที่ เกม 24 เว็บ KruPloy Faviconเกม 24 เว็บ KruPloyหรือไม่ก็ลองไปมองทะเบียนท้ายรถสักคันแล้วคิดตามดูก็ได้ (แอดทำบ่อย 🤣)

วิธีแก้เกม 24 เกี่ยวกับวิทยาการคอมพิวเตอร์อย่างไร?

สมมติก่อนว่าเราไม่รู้อะไรเลยเกี่ยวกับเทคนิกเกม 24 ปัญหาแรกเลยคือเราจะเริ่มตรงไหนก่อน

ด้วยความที่เราไม่รู้หรอกว่าวิธีไหนมันดี สิ่งที่เราทำได้ก็มีแค่ลองมันทุกแบบที่คิดได้นั่นแหละ ก็คือคิดไปเลยว่า “ถ้าเอา x กับ y มา บวก/ลบ/คูณ/หาร กันแล้วจะได้ค่าอะไร” แล้วหลังจากนั้นเราทำอะไรต่อได้บ้าง

แน่นอนว่าการทำแบบนี้ไม่ได้การันตีว่าเราจะได้คำตอบตั้งแต่การลองครั้งแรก แต่ก็เป็นการเริ่มต้นที่ดีเพราะมันทำให้เราได้ข้อมูลมากขึ้นเรื่อยๆ โดยวิธีแบบนี้ในทางวิทยาการคอมพิวเตอร์เราจะเรียกมันว่า Depth-First Search

ก็คือ เราก็ลองไปเรื่อยๆจากตอนแรกที่ได้ว่า 3 2 5 93\ 2\ 5\ 9 เราสามารถคำนวณมันกลายเป็น 2 2 92\ 2\ 9 ได้ และเป็น 4 94\ 9 ได้จากการทำ 53=25-3=2 กับ 2×2=42 \times 2 = 4

พอเราเหลือแค่ 44 กับ 99 เราก็ลองทุกวิธีคือ 4+9,49,94,49,4/9,9/44 + 9, 4 - 9, 9-4, 4 * 9, 4 / 9, 9 / 4 แน่นอนว่าเราไม่ได้คำตอบที่เป็น 2424 เลย แต่นั่นก็ไม่เป็นไรเพราะเราตอนนี้เราก็รู้แล้วว่า การที่ได้คำตอบเป็น 4 94\ 9 มาไม่ช่วยให้เราได้คำตอบ

กราฟการเปลี่ยน state เหมือนเดิมจาก 3 2 5 9 ไปเป็น 2 2 9 แทน แล้วไป 4 9 แล้วจาก 4 9 ลองพยายามแยกออกไปหลายๆแบบดูว่าทำไรได้บ้าง แต่ด้วยความว่าทำไรไม่ได้เลย ก็เลย highlight 4 9 เป็นสีแดง ลำดับการคิดรูปแบบที่เป็นไปได้

กราฟการเปลี่ยน state เหมือนเดิมจาก 3 2 5 9 ไปเป็น 2 2 9 แทน แล้วไป 4 9 แล้วจาก 4 9 ลองพยายามแยกออกไปหลายๆแบบดูว่าทำไรได้บ้าง แต่ด้วยความว่าทำไรไม่ได้เลย ก็เลย highlight 4 9 เป็นสีแดง ลำดับการคิดรูปแบบที่เป็นไปได้

ทีนี้พอ 4 94\ 9 ทำไม่ได้เราก็แค่กลับไปหา 2 2 92\ 2\ 9 ดูว่าแปลงเป็นอย่างอื่นต่อได้ไหม แล้วก็ลองในรูปแบบอื่นๆต่อไปเรื่อยๆ

ถ้าลองแตกแขนงออกจาก State 2 2 9 จะได้อยู่หลายแบบมากๆ ซึ่งแทนด้วยวงกลมหลายลงที่มีลูกศรชี้ออกมาจาก 2 2 9 ขยายออกไปอีก

ถ้าลองแตกแขนงออกจาก State 2 2 9 จะได้อยู่หลายแบบมากๆ ซึ่งแทนด้วยวงกลมหลายลงที่มีลูกศรชี้ออกมาจาก 2 2 9 ขยายออกไปอีก

แล้วถ้า 2 2 92\ 2\ 9 ก็ยังไม่ได้อีก ก็ย้อนกลับไปหา 3 2 5 93\ 2\ 5\ 9 แล้วดูวิธีอื่นๆเอา

แล้วมันแปลว่าอะไรล่ะ?

ไม่ว่าจะเป็น 2 2 92\ 2\ 9 หรือ 4 94\ 9 หรือ 3 2 5 93\ 2\ 5\ 9 มันก็เป็นเหมือน สถานะๆนึง ที่เกมที่เริ่มต้นจาก 3 2 5 93\ 2\ 5\ 9 สามารถทำได้ ดังนั้นเขาจะใช้คำว่า State ในการแทนสถานะที่เกิดขึ้นได้ทั้งหมด

และใช้คำว่า การกระทำ หรือ Action แทนการกระทำที่เกิดขึ้นระหว่าง State หรือก็คือที่เราหยิบเลขสองตัวมาบวกลบคูณหารกันนั่นแหละ

วงกลมที่แทน 3 2 5 9 มีลูกศีชี้ลึกลงไปเรื่อยๆจนเจอวงกลมที่เป็นแค่เลข 24 State เป้าหมาย

วงกลมที่แทน 3 2 5 9 มีลูกศีชี้ลึกลงไปเรื่อยๆจนเจอวงกลมที่เป็นแค่เลข 24 State เป้าหมาย

แล้วถ้าเราเอา State และ Action ที่เกิดขึ้นได้ทั้งหมดมาต่อกันก็จะได้เป็นกราฟที่เรียกว่า State-Space Graph และสิ่งที่เราต้องหาก็แค่ว่าจะโยงเส้นเชื่อมจาก State แรกสุด ไปหา 2424 ได้ยังไง

พอวาดมันออกมาเป็นกราฟเนี่ย สิ่งที่เราทำได้ก็คือใช้ทฤษฎีกราฟมาแก้ไงล่ะ ซึ่งหลักๆที่เริ่มมาเลยก็ทำได้สองแบบคือ Depth-First Search กับ Breadth-First Search

ในส่วนของ Depth-First Search ที่ได้ยกตัวอย่างไปแล้วก่อนหน้านี้ ก็ยังเหมือนเดิมแหละ ก็คือเห็นว่า Action ไหนทำได้ ณ State นั้นๆ ก็ลองทำไปเลยถ้ามันไม่ถึง 24 (สถานะที่ต้องการ)ก็ย้อนกลับไปหา State ก่อนหน้านี้แล้วก็ทำไปเรื่อยๆ

ซึ่งลักษณะการลงไปใน State-Space Graph ก็จะได้แนวๆนี้

วงกลมหลายๆวงที่มีการแตกแขนงออกมาหลายๆกิ่งด้วยลูกศร แล้วมีตัวเลขกำกับอยู่ตามวงกลม โดยที่ข้างบนสุดที่แทนสถานะเริ่มต้นมีเลข 1 กำกับอยู่ หลังจากนั้นเลขก็ค่อยๆเรียงไปตามที่เลข 1 ชี้ ไปเรื่อยๆ แล้วพอไม่มีอะไรชี้ต่อแล้วก็ย้อนกลับขึ้นมา การวิ่งทดลองข้อมูลแบบ Depth-First Search

วงกลมหลายๆวงที่มีการแตกแขนงออกมาหลายๆกิ่งด้วยลูกศร แล้วมีตัวเลขกำกับอยู่ตามวงกลม โดยที่ข้างบนสุดที่แทนสถานะเริ่มต้นมีเลข 1 กำกับอยู่ หลังจากนั้นเลขก็ค่อยๆเรียงไปตามที่เลข 1 ชี้ ไปเรื่อยๆ แล้วพอไม่มีอะไรชี้ต่อแล้วก็ย้อนกลับขึ้นมา การวิ่งทดลองข้อมูลแบบ Depth-First Search

แต่ถ้าเราคิดอีกแบบนึงว่า เราลองดูก่อนว่าจาก State เริ่มต้นเนี่ย คิดทุกวิธีเลยว่าเราทำอะไรบ้างก่อน แล้วค่อยๆลองขยายออกไปเรื่อยๆ อย่างเช่น

จาก 3 2 5 93\ 2\ 5\ 9 เราก็ลองแปลงมันเป็น 2 2 92\ 2\ 9, 1 5 91\ 5\ 9, 2 5 62\ 5\ 6 ไปเรื่อยๆจนครบทุกแบบ แล้วถ้ามันยังไม่ได้ 24 สักตัว ก็เอาแบบที่ได้มาใหม่เนี่ย มาลองต่อไปเรื่อยๆจนกว่าจะได้ 24

วิธีแบบนี้จะเรียกว่า Breadth-First Search

ที่พอวาดเป็นกราฟก็จะได้ลักษณะแนวๆนี้เลย

วงกลมหลายๆวงที่มีการแตกแขนงออกมาหลายๆกิ่งด้วยลูกศร แล้วมีตัวเลขกำกับอยู่ตามวงกลม โดยที่ข้างบนสุดที่แทนสถานะเริ่มต้นมีเลข 1 กำกับอยู่ หลังจากนั้นทุกตัวที่เลข 1 ชี้อยู่จะได้เลขเรียงจาก 2 ไปเรื่อยๆ จนครบทุกตัว การวิ่งทดลองข้อมูลแบบ Breadth-First Search

วงกลมหลายๆวงที่มีการแตกแขนงออกมาหลายๆกิ่งด้วยลูกศร แล้วมีตัวเลขกำกับอยู่ตามวงกลม โดยที่ข้างบนสุดที่แทนสถานะเริ่มต้นมีเลข 1 กำกับอยู่ หลังจากนั้นทุกตัวที่เลข 1 ชี้อยู่จะได้เลขเรียงจาก 2 ไปเรื่อยๆ จนครบทุกตัว การวิ่งทดลองข้อมูลแบบ Breadth-First Search

ซึ่งสังเกตได้อย่างนึงคือทั้งสองแบบต้องคิดหลาย State มาก แททบจะลงไปดูเกือบทุก State เลยก็ว่าได้

แต่ลองคิดเล่นๆดูนะ พอเราเล่นเกม 24 ไปเรื่อยๆ เราจะเริ่มมีความรู้สึกว่า “เลขชุดนี้น่าจะทำได้/น่าจะทำไม่ได้แฮะ” แล้วทำไมเราต้องไปคิดเลขชุดที่มันไม่น่าจะทำได้ด้วยล่ะ?

อย่างเช่นว่า เราได้ State นึงมาที่เลขมันเป็นจำนวนเฉพาะที่คำนวณยากๆหน่อย แล้วเหลือเลขให้ใช้ไม่กี่ตัวแล้วจะทำให้มันกลายเป็น 2424 มันก็ยาก ไม่น่าจะทำได้ งั้นไม่คิดต่อเลยแล้วกัน

หรือแบบอื่นเช่น เราได้ 33 มาแล้ว เอาเลขที่เหลือให้ได้ 88 ก็จะได้คำตอบเลย เราก็จะทุ่มการคำนวณไปกับการแปลงเลขที่เหลือให้ได้ 88 แทนที่จะมาลองสนใจเลข 33 เผื่อเอาไปทำอย่างอื่นได้

ฮิวริสติก (Heuristic)

ตัวอย่างพวกนี้เราเรียกมันว่า Heuristic ซึ่งเป็นฟังก์ชัน หรือแพทเทิร์นที่ใช้วัดความน่าจะเป็นในการไปหา State ที่ต้องการ

ซึ่งทำให้แทนที่เราจะไปคิดทุกวิธีที่เป็นไปได้ เราไปดูวิธีที่น่าจะเป็นไปได้มากสุดในการเข้าใกล้ State ที่ต้องการแล้วไปต่อเรื่อยๆ ซึ่งมันเพิ่มโอกาสในการเจอคำตอบได้เร็วขึ้น

State 3 2 5 4 แยกออกเป็น 2 2 9 และ 3 2 4 แต่ลงไปทำ 3 2 4 ต่อและไม่สนใจ 2 2 9 ใช้ Heuristic ในการเก็บ 3 เอาไว้

State 3 2 5 4 แยกออกเป็น 2 2 9 และ 3 2 4 แต่ลงไปทำ 3 2 4 ต่อและไม่สนใจ 2 2 9 ใช้ Heuristic ในการเก็บ 3 เอาไว้

อย่างในรูปจะแทน State Space graph ของ 3 2 5 93\ 2\ 5\ 9 ที่ชี้ให้เห็นว่า ลองไปทาง 3 2 43\ 2\ 4 แล้วไปหา 3 83\ 8 ดีกว่า

แต่ถึงอย่างนั้นมันก็ไม่ได้การันตีว่าคำตอบจะอยู่ในเส้นที่ Heuristic เลือกอ่ะนะ ถ้ามันไม่ได้ก็ยังต้องกลับออกไปลองเส้นอื่นๆอยู่ดี

ส่งท้าย

ตัว State-Space Graph และวิธีการหาคำตอบ (State-Space Search) เนี่ยเป็นพื้นฐานของวิชา AI เลย ก็คือมันจะใช้ตอนที่ดูว่าทำ Action ไหนจะได้ผลลัพธ์ออกมาดีที่สุดในขณะนั้น จริงๆแล้วมันมีหลายแบบมาก บางอย่างอาจจะไม่ได้มี State สิ้นสุดที่ชัดเจนก็ได้ แต่เป็นว่า State ไหนมีคะแนน”ความดี” มากกว่ากันอะไรประมาณนั้น ซึ่งมันก็เอามาประยุกค์ใช้กับการทำโปรแกรมที่มีตัวเลือกการกระทำค่อนข้างจำกัดเช่น การทำ bot ในเกม เป็นต้น

แต่ถ้าถามว่านี่เกี่ยวกับ LLM ไหมก็ไม่นะ …คนละเรื่องกันเลยนะฮะ 😆

ลิงก์

เว็บเจนโจทย์เกม 24 มีคนอธิบายเพิ่มเรื่อง BFS กับ DFS เพิ่มใน Medium ไปอ่านกันได้
0

บทความอื่นๆ