Skip to content

Instantly share code, notes, and snippets.

@Nick0603
Created December 21, 2019 02:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Nick0603/38f8219bde7190011f1adfc5fa5039db to your computer and use it in GitHub Desktop.
Save Nick0603/38f8219bde7190011f1adfc5fa5039db to your computer and use it in GitHub Desktop.
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