นี่คือซอร์สโค้ดสำหรับโครงการ HTML5 ที่ใช้อัลกอริทึมการเรียนรู้ของเครื่องในวิดีโอเกม Flappy Bird โดยใช้เครือข่ายประสาทและอัลกอริทึมทางพันธุกรรม โปรแกรมสอนนกตัวเล็ก ๆ เกี่ยวกับวิธีการพนังอย่างดีที่สุดเพื่อที่จะบินได้อย่างปลอดภัยผ่านอุปสรรคให้นานที่สุด
บทช่วยสอนที่สมบูรณ์พร้อมรายละเอียดเพิ่มเติมและการสาธิตที่คุณสามารถหาได้ที่นี่:
http://www.askforgametask.com/tutorial/machine-learning-algorithm-flappy-bird
ที่นี่คุณสามารถดูวิดีโอสั้น ๆ พร้อมการนำเสนออัลกอริทึมง่ายๆ:
https://www.youtube.com/watch?v=aewmdojejf0
รหัสทั้งหมดเขียนใน HTML5 โดยใช้เฟรมเวิร์ก Phaser และไลบรารีเครือข่ายประสาทซินแนปติกสำหรับการใช้งานเครือข่ายประสาท
ในการเล่นเกมแต่ละหน่วย (นก) มีเครือข่ายประสาทของตัวเองประกอบด้วย 3 ชั้นถัดไป:
เลเยอร์อินพุตที่มี 2 เซลล์ประสาทนำเสนอสิ่งที่นกเห็น:
1) horizontal distance between the bird and the closest gap
2) height difference between the bird and the closest gap
ชั้นที่ซ่อนอยู่กับเซลล์ประสาท 6 เซลล์
เลเยอร์เอาท์พุทที่มี 1 เซลล์ประสาทที่ใช้ในการดำเนินการดังนี้:
if output > 0.5 then flap else do nothing
มีห้องสมุดเครือข่ายนิวรัลซินแนปติกที่ใช้เพื่อใช้เครือข่ายประสาทเทียมทั้งหมดแทนที่จะสร้างใหม่ตั้งแต่เริ่มต้น
แนวคิดหลักของการเรียนรู้ของเครื่องที่ใช้ในโปรแกรมนี้ขึ้นอยู่กับรูปแบบวิวัฒนาการของระบบประสาท มันใช้อัลกอริทึมวิวัฒนาการเช่นอัลกอริทึมทางพันธุกรรมเพื่อฝึกอบรมเครือข่ายประสาทเทียม นี่คือขั้นตอนหลัก:
สร้างประชากรใหม่ 10 หน่วย (นก) ด้วย เครือข่ายประสาทแบบสุ่ม
ให้ทุกหน่วยเล่นเกมพร้อมกันโดยใช้เครือข่ายประสาทของตัวเอง
สำหรับแต่ละหน่วยคำนวณฟังก์ชั่น การออกกำลังกาย เพื่อวัดคุณภาพเป็น:
fitness = total travelled distance - distance to the closest gap
เมื่อทุกหน่วยถูกฆ่าตายให้ประเมินประชากรปัจจุบันไปยังอีกหน่วยหนึ่งโดยใช้ ตัวดำเนินการทางพันธุกรรมอัลกอริทึม (การเลือกครอสโอเวอร์และการกลายพันธุ์) ดังนี้:
1. sort the units of the current population in decreasing order by their fitness ranking
2. select the top 4 units and mark them as the winners of the current population
3. the 4 winners are directly passed on to the next population
4. to fill the rest of the next population, create 6 offsprings as follows:
- 1 offspring is made by a crossover of two best winners
- 3 offsprings are made by a crossover of two random winners
- 2 offsprings are direct copy of two random winners
5. to add some variations, apply random mutations on each offspring.
กลับไปที่ขั้นตอนที่ 2
เนื่องจากโปรแกรมถูกเขียนใน HTML5 โดยใช้เฟรมเวิร์ก Phaser และไลบรารีเครือข่ายประสาทซินแนปติกคุณต้องการไฟล์เหล่านี้:
ลอจิกเกมทั้งหมดถูกนำไปใช้ในไฟล์ gameplay.js ประกอบด้วยคลาสต่อไปนี้:
App.Main
รูทีนหลักที่มีฟังก์ชั่นสำคัญต่อไปนี้:
TreeGroup Class
, Extended Phaser Group Class เพื่อแสดงถึงสิ่งกีดขวางที่เคลื่อนไหว กลุ่มนี้มีสไปรต์บนต้นและต้นไม้ด้านล่าง
ชั้นเรียน Tree Class
ชั้นสไปรต์เฟสเซอร์เพื่อแสดงสไปรต์ต้นไม้
ชั้นเรียน Bird Class
ระดับสไปรต์เฟสเซอร์เพื่อเป็นตัวแทนของสไปรต์นก
Text Class
, คลาส phaser bitmaptext แบบขยายที่ใช้สำหรับการวาดข้อความ
อัลกอริทึมทางพันธุกรรมถูกนำไปใช้ในไฟล์ Genetic.js ซึ่งประกอบด้วยคลาสต่อไปนี้:
GeneticAlgorithm Class
คลาสหลักในการจัดการการดำเนินการทางพันธุกรรมทั้งหมด มันต้องการพารามิเตอร์สองพารามิเตอร์: MAX_UNITS เพื่อกำหนดจำนวนหน่วยทั้งหมดในประชากรและ TOP_UNITS เพื่อตั้งค่าจำนวนหน่วยสูงสุด (ผู้ชนะ) ที่ใช้สำหรับการพัฒนาประชากร นี่คือฟังก์ชั่นที่สำคัญ: