เริ่มต้นเขียน Game AI แบบ Turn-based Strategy ง่ายๆ บน Kaggle  

  RSS
The Neural Engineer
(@neural-engineer)
EfficientNet
เริ่มต้นเขียน Game AI แบบ Turn-based Strategy ง่ายๆ บน Kaggle
(Lux Competition ตอนที่ 1)
ThAIKeras and Kaggle 15 ตุลาคม 2021
 
 
การเขียน AI เพื่อวางแผนบนเกมส์ เช่น StarCraft และ Civilization หรือ AI ที่จำลองการใช้ชีวิตบนโลกเสมือนแบบ The Sims
จะยิ่งสำคัญและน่าตื่นเต้นขึ้นเรื่อยๆ เมื่อเรากำลังเข้าสู่ยุค Metaverse ด้วยเทคโนโลยี VR และ AR (ดูคลิปสั้นแนะนำ

)

 
นั่นจึงทำให้ Game หรือ Bot AI ที่ใช้ชีวิตใน Virtual Environment เป็นหัวข้อที่น่าสนใจไม่แพ้หัวข้อ AI อื่นๆ ที่ร้อนแรงเช่น Deep Learning หรือ Data Science ทีเดียวครับ
 
บทความนี้จะเป็นบทความแรกที่จะแนะนำเพื่อนๆ ให้ลองฝึกเขียน Agent/Bot AI บน Kaggle.com ที่ได้เตรียม Environments ใช้งานง่ายและ Hardware/Software ที่จำเป็นทั้งหมดให้เราแล้วในเบื้องหลัง ดังนั้นเราเพียงแค่ใช้ Browser ในการเขียนเท่านั้น โดยไม่มีค่าใช้จ่ายใดๆ (สำหรับผู้ที่ยังไม่รู้จัก Kaggle.com สามารถดูรายละเอียดได้ที่กระทู้ปักหมุดในเพจ @ThaiKeras and Kaggle)
 
โดยเราจะหัดเขียนผ่านเกมส์ Turn-based Strategy เล็กๆ ที่ชื่อว่า Lux ซึ่งเป็นเกมส์ที่ผู้เล่นต้องวางแผนและผลัดกันควบคุม units ของตัวเอง ในทำนองเดียวกับเกมส์ Civilization เพียงแต่กติกา กฎต่างๆ นั้นเข้าใจง่ายกว่า Civilization มากๆ ทำให้เหมาะสำหรับ ผู้เริ่มต้น
 
อย่างไรก็ดี กติกายังมีความซับซ้อนในระดับที่ท้าทาย โปรแกรมเมอร์เก่งๆ ทั่วโลกให้เข้ามาพัฒนา Bot แข่งกันบน game นี้ครับ โดย Kaggle นั้นได้จัดให้เป็นการแข่งขันชิงรางวัล 10,000 USD ที่ทุกคนในโลกสามารถเข้าร่วมได้ในชื่อว่า Lux Competition ( https://www.kaggle.com/c/lux-ai-2021/overview )
 
โดยการแข่งขันนี้มีเวลาทั้งหมด 4 เดือน ณ วันที่เขียนบทความนี้ (15 ตค. 2564) ก็ยังเหลือเวลาอีกเกือบ 2 เดือน ซึ่งเพียงพอเลยทีเดียวครับ
 
กล่าวโดยสรุป การแข่งขันนี้เหมาะกับทั้งผู้เริ่มต้นฝึกเขียน Bot Game AI บน Environment ที่เรียบง่าย หรือกระทั่งโปรแกรมเมอร์มือ
อาชีพที่จะได้แข่งกับมืออาชีพด้วยกันเอง ซึ่งการเริ่มต้น เราต้องศึกษาเรื่องดังต่อไปนี้ และจะทยอยเขียนบทความให้ครอบคลุมครับ
 
1) กติกาของ (1.1) เกมส์ และ (1.2) การแข่งขันระหว่างโปรแกรมเมอร์ด้วยกัน
2) Interface ของ Game Environment -- นั่นคือ เราจะบังคับ หรือควบคุม units ต่างๆ ของเราเองด้วยคำสั่งอะไรได้บ้าง และส่งคำสั่งเหล่านั้นให้ Environment ของเกมส์ทราบได้อย่างไร
3) แนวคิดในการเขียน Agent/Bot ใน Game AI เบื้องต้น ด้วย Rule-based
4) การเขียนโปรแกรมขั้นสูง (4.1) เรียนรู้ Bot ของ Top-player อัตโนมัติด้วย Game Scraping + Imitation Learning และ
(4.2) ให้ Bot เรียนรู้ด้วยตัวเองทั้งหมดตั้งแต่แรกเริ่มด้วย Reinforcement Learning
 
จะเห็นว่าการเข้าร่วม Lux Competition นี้ เราจะได้เรียนรู้ ความรู้หลากหลายมาก ไม่ว่าจะเป็นการเขียน Bot/Agent บน Virtual Environment ซึ่งจะเป็นอนาคตของเทคโนโลยีโลกในยุค Metaverse รวมทั้งมีโอกาสเรียนรู้เทคนิค Machine Learning ขั้นสูงคือ Imitation Learning และ Reinforcement Learning ด้วยครับ
 
** หมายเหตุ **
1) คำว่า Bot หรือ Game AI ในศัพท์เฉพาะในวงการนี้มักจะเรียกว่า Agent ได้เช่นกัน ดังเช่น ถ้าเราเข้าไปอ่านข้อมูลเพิ่มใน Kaggle ก็จะเจอคำว่า Agent บ่อยๆ ซึ่งก็หมายถึงตัว Bot ที่เราเขียนขึ้นเพื่อเล่นเกมส์นี้นั่นเองครับ
2) คำว่า "Game/Virtual Environment" นั้น หมายถึงระบบควบคุมหลัก ของสิ่งต่างๆ ในเกมส์ ที่คอย simulate ผลลัพธ์ที่เกิดขึ้นจากการกระทำ (actions) ของ Bot/Agent ต่างๆ เช่น เมื่อ Agent ส่งคำสั่ง "เดินไปข้างหน้า" ไปยัง Environment เมื่อได้รับคำขอ Environment ก็จะเช็คว่าการเดินไปข้างหน้าของ unit นั้นๆ ทำได้หรือไม่ ถ้าทำได้ Environment ก็จะเคลื่อนที่ unit นั้นไปข้างหน้า แต่ถ้าทำไม่ได้ unit นั้นก็จะอยู่กับที่โดย Environment ก็จะส่ง Error message กลับมาให้ Agent ครับ
 
 
โดยในบทความแรกนี้จะขอว่าเฉพาะเรื่องของกติกากันก่อนนะครับ
 
.
 
กติกาของเกมส์ Lux
 
ในที่นี่อธิบายเพื่อให้เข้าใจแนวคิดภาพรวมของเกมส์ ส่วนกติกาแบบละเอียดสามารถอ่านได้ที่นี่ครับ : https://www.kaggle.com/c/lux-ai-2021/overview/lux-ai-specifications
 
ภาพรวมในเกมส์ Lux จะเป็นการแข่งขันกันของผู้เล่น 2 คน (หรือ Bots/Agents 2 ตัว) เล่นกันอยู่ใน map ที่สุ่มขนาด 12x12 ไปจนถึง 32x32 โดยใน map นั้นจะมีทรัพยากรต่างๆ กระจายอยู่คือ ไม้ ถ่านหิน และแร่ยูเรเนียม (เรียงจากพลังงานน้อยไปมาก) และจะเล่นกันทั้งหมด 360 turns โดยจะสลับเป็นกลางวัน 30 turns กลางคืน 10 turns รวมเป็น 1 cycle ดังนั้น 360 turns ก็จะมี 9 cycles
 
โดยจุดเริ่มต้นแต่ละผู้เล่นจะมี 1 เมือง 1 คนงาน (worker) และแต้มงานวิจัย=0 โดยคนงานสามารถเคลื่อนที่ไปเก็บทรัพยากรได้ และสร้างเมืองใหม่ได้ ส่วนเมืองก็จะสร้างคนงานขึ้นมาใหม่ได้ (แต่ต้องไม่เกินจำนวนเมืองที่มีอยู่) หรือเพิ่มแต้มงานวิจัยได้ 1 หน่วย
 
เมื่อคนงานขนทรัพยากรไปเก็บยังเมืองของตัวเอง ทรัพยากรจะถูกเปลี่ยนเป็น "พลังงานในเมือง" (fuel) เพื่อใช้ในยามค่ำคืน โดยในตอนกลางวันทั้งเมืองและผู้เล่นจะสามารถอยู่ได้โดยไม่ต้องอาศัยพลังงาน fuel ทว่าเมื่อถึง "กลางคืน" ทั้งผู้เล่นและเมืองจำเป็นต้องใช้พลังงาน
 
เมื่อ fuel หมดเมื่อไร คนงานหรือเมืองที่ไม่มี fuel แล้วจะ "ตาย" หรือหายไปจากเกมส์ทันที ดังนั้นในช่วง "กลางวัน" คนงานมีหน้าที่ตักตวงทรัพยากรให้มากที่สุดเพื่อปกป้อง "เมืองที่สำคัญ" เอาไว้ โดยอาจปล่อยให้เมือง "ไม่สำคัญ" ตายไปได้
 
เป้าหมายของเกมส์นี้คือ "การเหลือเมืองให้อยู่รอดมากที่สุด" หลัง 360 turns โดยผู้ที่เหลือเมืองมากที่สุดจะเป็นผู้ชนะในเกมส์
 
การเก็บและใช้ทรัพยากรมีหลักการต่อไปนี้
- คนงานสามารถเก็บทรัพยากรที่อยู่รอบตัวได้สูงสุด 5 ช่องใน 1 turn นั่นคือ กลาง ซ้าย ขวา บน ล่าง
- ถ้ามีไม้รอบตัว เก็บไม้ได้ turn ละ 20 หน่วย ต่อ 1 ช่อง
- ถ้ามีถ่านหินรอบตัว เก็บถ่านหินได้ turn ละ 5 หน่วย ต่อ 1 ช่อง
- ถ้ามียูเรเนียมรอบตัว เก็บถ่านหินได้ turn ละ 2 หน่วย ต่อ 1 ช่อง
- ไม้ ถ่านหิน และยูเรเนียม 1 หน่วยถ้าเก็บเข้าเมืองแล้วสามารถ "เปลี่ยน" เป็น "พลังงาน fuel" ในเมืองได้ 1, 10 และ 40 หน่วยตามลำดับ
- โดยการเก็บทรัพยากรขั้นสูงคือ ถ่านหิน และยูเรเนียมนั้นผู้เล่นจะต้องพัฒนาแต้มงานวิจัยให้ถึง 50 และ 200 ก่อนตามลำดับ
- ในกลางคืน 1 turn, คนงานใช้พลังงาน 4 หน่วย ส่วนเมืองเดี่ยวใช้พลังงาน 23 หน่วย ถ้าเป็นเมืองใหญ่ที่สร้างติดกันจะมีการประหยัดการใช้พลังงานตั้งแต่ 5-20 หน่วยซึ่งดูสูตรได้ในลิงก์กติกาด้านบน
- กลางวันไม่จำเป็นต้องใช้ fuel
- คนงานเก็บ resource รวมกันทุกชนิดรวมกันได้ไม่เกิน 100 หน่วย
 
Action ในแต่ละ turn
- คนงานเก็บทรัพยากรได้ทุก turn ถ้ามีทรัพยากรรอบตัว
- ในกลางวันคนงานเมื่อเดิน 1 ช่องต้องหยุดรอ (cool down) 1 turn ส่วนในกลางคืนต้องหยุดรอ 3 turns
- เมืองเมื่อสร้างคนงาน 1 คนหรือคิดค้น 1 research point แล้วต้องหยุดรอ (cooldown) 10 turns
- ในแต่ละ turn เราต้องส่งคำสั่งของทุก units (คนงานทั้งหมด และเมืองทั้งหมด) ที่ไม่ต้องหยุดรอ พร้อมๆ กัน
- เราจะเห็นข้อมูลทั้งหมด units / ทรัพยากร / actions ของผู้เล่นอีกฝั่งด้วย สามารถนำมาปรับใช้ในกลยุทธ turn ถัดไปได้
.
จริงๆ ในเกมส์ยังมีสิ่งอื่นๆ อีกนั่นคือ รถขนส่ง Cart และถนน Road แต่ว่าไม่ค่อยมีคนใช้งาน (แม้แต่ top players ในปัจจุบัน) และเราไม่กล่าวถึงเพื่อไม่ให้ทำความเข้าใจยากจนเกินไปครับ สามารถดูกฎเพิ่มเติมเกี่ยวกับ Cart และ Road ได้ในกฏฉบับเต็มในลิงก์ด้านบน
 
.
 
กติกาของการแข่งขัน Lux Competition ระหว่างโปรแกรมเมอร์ทั่วโลกบน Kaggle
 
- ผู้เล่นแต่ละทีมสามารถส่ง Bots/Agents ลงแข่งได้วันละไม่เกิน 5 Agents
- สามารถเขียน Bot ได้หลายภาษาไม่ว่าจะเป็น Python, Javascript, C++ และอื่นๆ อีกมาก แต่ผู้เล่นส่วนใหญ่จะแชร์ code python https://www.kaggle.com/c/lux-ai-2021/code ซึ่งเราสามารถนำมาต่อยอดได้เลย
- เมื่อเราส่ง Bot แล้ว Kaggle จะให้ Bot เราแข่งกับตัวเอง เพื่อทดสอบว่ามี Bug หรือไม่ ถ้าผ่านแล้วคะแนน Bot จะเริ่มต้นที่ 600 คะแนน
- Bot ที่ส่งจะถูกแข่งและเก็บคะแนนไปเรื่อยๆ จนจบการแข่งขันคือกลางเดือนธันวาคม โดยจะสุ่มสู้กับ Bot ที่มีคะแนนใกล้เคียงกับ Bot เราไปเรื่อยๆ
- วันแรกที่เรา submit, Bot ตัวนั้นจะถูกสุ่มแข่งมากเป็นพิเศษเพื่อให้ feedback กับผู้เล่นให้เร็วที่สุด และถูกสุ่มน้อยลงเรื่อยๆ ในวันหลังๆ (เพราะว่ามี Bot หลายแสนหรือล้านตัวอยู่ เลยไม่สามารถให้ทุกตัวสู้กันทั้งหมดได้)
- โดยเมื่อ Bot แพ้ก็จะถูกหักคะแนน และถ้าชนะก็จะถูกเพิ่มคะแนน นั่นคือ "คะแนนของ Bot" แต่ละตัว จะเปลี่ยนแปลงเรื่อยๆ ไม่คงที่ทุกๆ วัน แต่จะลู่เข้าค่าเฉลี่ยความสามารถที่แท้จริงของ Bot ตัวนั้นๆ โดย Kaggle จะมี algorithm ที่คำนวนคะแนนที่บวกเพิ่มและลด โดยยิ่งเวลาผ่านไปคะแนนที่บวกเพิ่มหรือลดลงจะมีขนาดน้อยลงเรื่อยๆ เมื่อ Kaggle Algorithm มั่นใจทางสถิติในความสามารถของ Bot เรา
- ณ วันที่เขียนบทความ 15 ตค นั้น Top players จะมีคะแนนในช่วง 1600-1800
- วันสุดท้ายที่จะส่ง Bots/Agents ลงแข่งได้คือวันที่ 6 ธันวาคม และหลังจากนั้น Bots ทุกตัวจะทำการสุ่มแข่งขันไปเรื่อยๆ เพื่อหาผู้ชนะเลิศในวันที่ 20 ธันวาคม (เช้าวันที่ 21ธันวา เมืองไทย)
- เราสามารถดู Replay การแข่งขันของ top-players ทั้งหมดย้อนหลังได้ เพื่อเรียนรู้และนำมาปรับกลยุทธของเราได้
- อนุญาตให้สามารถดูด (scrape) Replays ทั้งหมดของ top-players เพื่อนำมา "เลียนแบบ" หรือ "เรียนรู้" ผ่าน Deep Learning ได้ โดยกลยุทธนี้เรียกว่า Imitation Learning ซึ่งมีผู้แชร์โค้ดให้เพื่อนๆ เรียนรู้และต่อยอดได้ทันที ซึ่งเป็นเสน่ห์ของการแข่งขันและเรียนรู้บน Kaggle โดย code นี้ทำคะแนนได้อย่างน้อย 1300 คะแนน นับว่าเก่งพอตัว
 
.
 
เริ่มต้นเขียนโปรแกรม
มาถึงตรงนี้เพื่อนๆ หลายๆ คนอาจจะอยากเริ่มลองเขียน Bot ลงแข่งในเกมส์กันแล้ว ถ้าไม่อยากรอบทความตอนถัดไปของเรา
ก็สามารถศึกษาเริ่มต้นด้วยตัวเองได้ง่ายๆ เลยครับ 🙂
 
- Basic notebook ที่สอนรับข้อมูลจาก Environment และ functions ง่ายๆ เพื่อหาทรัพยากร และเคลื่อนที่ไปมา
 https://www.kaggle.com/stonet2000/lux-ai-season-1-jupyter-notebook-tutorial
 
- เขียน Agent/Bot โดยใช้ Rule based
 https://www.kaggle.com/lightmk/rule-based-agents-for-beginners
ดูเพิ่มเติมที่ https://www.kaggle.com/c/lux-ai-2021/discussion/274436
 
- Imitation Learning ที่ใช้ Deep Learning เลียนแบบ Top Player โดยตรง
www.kaggle.com/shoheiazuma/lux-ai-imitation-learning-keras
 
แล้วเจอกันบทความหน้าหรือเจอกันในสนามแข่งครับผม
This topic was modified 2 months ago 4 times by The Neural Engineer
อ้างอิง
Posted : 15/10/2021 1:19 pm
The Neural Engineer
(@neural-engineer)
EfficientNet

ตอนที่ 2 มีรูปเยอะมาก และบอร์ดนี้แปะรูปไม่สะดวก ตามเข้าไปอ่าน 

การเขียน Bot AI ด้วย Imitation Learning ได้บน FB ครับผม

ตอบกลับอ้างอิง
Posted : 24/10/2021 3:03 am
Share:

Please Login or Register