2017-08-18 5 views
2

機械学習の問題があります。 1世代目のロケットが突然変異しておらず、同じ道をたどった後。私はあなたが見ることができるようにそれを解決するためにさまざまな方法を試みたが、どちらもうまくいきませんでした。 openprocessing.orgでこれを書きましたが、ローカルでもやってみました。私は問題を参照していないbutiは、それがロケットのコンストラクタ関数にあると思う。 ロケットは突然変異の後に方向を変えていません

var rockets = []; 
 
var bf = -1; 
 
var br; 
 

 
function setup() { 
 
    createCanvas(windowWidth, windowHeight); 
 
    background(100); 
 
    noStroke(); 
 
    fill(255, 50); 
 
    frameRate(10); 
 
    target = createVector(width, height/2); 
 
    for (var i = 0; i < 10; i++) { 
 
    rockets.push(new Rocket()); 
 
    } 
 
} 
 

 
function draw() { 
 
    background(100); 
 
    ellipse(width/2, height/2, 40, 40); 
 
    ellipse(width - 10, height/2, 40, 40); 
 
    for (i = 0; i < rockets.length; i++) { 
 
    rockets[i].show(); 
 
    //console.log(rockets[i].pos.y); 
 
    if (!rockets[i].killed) { 
 
     rockets[i].applyForce(); //it is a fittness counter inside 
 
    } 
 
    } 
 
    //console.log(rockets); 
 
    if (rockets[0].counter >= rockets[0].route.length) { 
 
    findBest(); 
 
    respawn(); 
 
    } 
 
} 
 

 
function respawn() { 
 
    var news = mutate(br); 
 
    for (var i = 0; i < 10; i++) { 
 
    rockets.push(new Rocket()); 
 
    //console.log(rockets); 
 
    rockets[i].route = news[i]; 
 
    } 
 
} 
 

 
function findBest() { 
 
    for (var i = 0; i < rockets.length; i++) { 
 
    //console.log(rockets[i].fittness); 
 
    if (rockets[i].fittness > bf) { 
 
     br = rockets[i].route; 
 
     bf = rockets[i].fittness; 
 
    } 
 
    } 
 
    rockets = []; 
 
} 
 

 
function mutate(arr) { 
 
    var news = []; 
 
    for (var i = 0; i < 10; i++) { 
 
    var tempArr = arr; 
 
    tempArr[floor(random(arr.lenth))] = p5.Vector.random2D().setMag(30); 
 
    news.push(tempArr); 
 
    } 
 
    return news; 
 
} 
 

 
function Rocket(a) { 
 
    this.pos = createVector(width/2, height/2); 
 
    this.route = []; 
 
    this.counter = 0; 
 
    this.fittness = 0; 
 
    this.killed = false; 
 
    //console.log(a); 
 
    if (!a) { 
 
    for (var i = 0; i < 20; i++) { 
 
     this.route.push(p5.Vector.random2D()); 
 
     this.route[i].setMag(20); 
 
     //console.log("!A"); 
 
     // console.log(i); 
 
    } 
 
    } else { 
 
    // this is not used 
 
    this.route = a; 
 
    // for(var i = floor(random(a.length-1)); i<a.length; i++) { 
 
    //console.log(this.route[i]); 
 
    b = floor(random(this.route.length - 1)); 
 
    console.log("before: ", this.route[b]); 
 
    this.route[b] = p5.Vector.random2D().setMag(30); 
 
    //this.route[i].rotate(0.2*pow(-1, i)); 
 
    console.log("after: ", this.route[b]); 
 
    //} 
 
    } 
 

 
    //console.log(mutate(this.route)); 
 
    this.applyForce = function() { 
 
    if (this.counter == this.route.length - 1) { 
 
     this.countFittness(); 
 
     //console.log(this.fittness); 
 
     this.killed = true; 
 
    } 
 
    this.pos.add(this.route[this.counter]); 
 
    this.counter++; 
 
    } 
 
    this.countFittness = function() { 
 

 
    this.fittness = 1/this.pos.dist(target) * 100; 
 
    //console.log(this.fittness); 
 
    } 
 
    this.show = function() { 
 
    ellipse(this.pos.x, this.pos.y, 10, 10); 
 

 
    } 
 
}
<html> 
 

 
<head> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.12/p5.js"></script> 
 
</head> 
 

 
</html>

+0

あなたは決してロケットにパラメータを設定していませんか?確かにあなたは '新しいRocket(True/False);を実行する必要がありますif文がelseを実行するようにする – Deckerz

+0

@Deckerz、ありがとうございます。しかし、私はこれをやろうとしましたが、今は新しいロケットを作成して、ランダム/最善の変異経路 – Damiano

答えて

1

ニースのコード。あなたは、配列のコピーを取得していないJavaScriptで

var tempArr = arr; 

を使用する場合

function mutate(arr) { 
    var news = []; 
    for (var i = 0; i < 10; i++) { 
    var tempArr = arr; 
    tempArr[floor(random(arr.length))] = p5.Vector.random2D().setMag(30); 
    news.push(tempArr); 
    } 
    return news; 
} 

:あなたのmutate機能にエラーがあるようです。どちらの配列も同じ参照を指します。あなたが突然変異を起こすと、元のものも突然変異する。そうすれば最終的にはロケットのすべてのルートが同じになるでしょう。

試してみてください...

var tempArr = arr.slice(); 

スライス()操作は、配列を複製して、新しい配列への参照を返します。

同じ機能に小さな誤字もあります。私はそうすべきだと思います...

tempArr[floor(random(arr.length))] = p5.Vector.random2D().setMag(30); 
+0

ありがとう、男!私はプロジェクト全体を行ったよりもずっとこの時間がかかっていたxd – Damiano

+0

素晴らしいプロジェクトです!私はそれを調査することが本当に好きだった。 – snwclone

関連する問題