-
-
Save Nick0603/38f8219bde7190011f1adfc5fa5039db to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var DNA_LENGTH = 500; // 每個火箭的基因長度 | |
var SIZE = 30; // 每一個世代的火箭個數 | |
var rockets = []; // 存放所有的火箭 | |
// 初始化所有的火箭 | |
for (var i = 0; i < SIZE; i++) { | |
var rocket = new Rocket(); | |
rocket.gens = randomGens(); | |
rocket.fire(); | |
rockets.push(rocket); | |
} | |
forever(function () { | |
if (key.up) rockets[0].vy -= 0.3; | |
if (key.right) rockets[0].vx += 0.1; | |
if (key.left) rockets[0].vx -= 0.1; | |
}); | |
// 當所有的火箭都停止,執行nextGeneration 產生下一代火箭 | |
forever(function() { | |
for (var i = 0; i < rockets.length; i++) { | |
if (rockets[i].active) return; | |
} | |
nextGeneration(); | |
}); | |
// 產生隨機的初始化基因 | |
function randomGens () { | |
var gens = []; | |
for (var i = 0; i < DNA_LENGTH; i++) { | |
var num = Math.floor(Math.random() * 4); | |
gens.push(num); | |
} | |
return gens; | |
} | |
// 產生下一個世代 | |
function nextGeneration () { | |
for (var i = 0; i < SIZE; i++) { | |
var rocket = rockets[i]; | |
var score1 = Math.abs(platform.x - rocket.x); | |
var score2 = Math.abs(rocket.vy); | |
rockets[i].score = score1 + score2; | |
} | |
rockets.sort(function(a, b) { | |
return a.score - b.score; | |
}); | |
bestGens = rockets[0].gens; | |
subGens = rockets[1].gens; | |
for (var i = 0; i < SIZE; i++) { | |
rockets[i].gens = crossover(bestGens, subGens); | |
rockets[i].fire(); | |
} | |
} | |
// 交配產生下一代基因 | |
// 每個基因有 2% 的機率突變,若不突變則各有 50% 的機率來自父親和母親 | |
function crossover (a, b) { | |
var gens = []; | |
for (var i=0; i<DNA_LENGTH; i++) { | |
gens[i] = Math.random() > 0.5 ? a[i] : b[i]; | |
if (Math.random() < 0.02) gens[i] = Math.floor(Math.random()*4); | |
} | |
return gens; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment