Evolution Simulator:神经网络似乎没有改善(processing.js)

时间:2019-11-30 17:57:41

标签: neural-network deep-learning processing.js evolutionary-algorithm

背景和预期行为

我是神经网络的新手,我从头开始编写了一些代码。

  • 蓝点食物
  • 黑点杀死了生物
  • 食物的寿命是生物的两倍。
  • 万物死亡后,最佳生物繁殖,其他生物变异程度不同。

如果运行以下代码,即使运行了几个小时,也可以看到它不起作用。

环境和设置

我正在使用处理语言API 作为JavaScript库,称为processing.js

问题和代码

神经网络似乎没有改善。

过一会儿它不会改变。

<!DOCTYPE html>
<html>
<head>
	<title>Evolution Simulator</title>
	<style>
            body {
                margin: 0px;
                padding: 0px;
                overflow: hidden;
            }
            canvas { 
                margin: 0px;
                padding: 0px;
                position: absolute;
                top: 0px;        
                left: 0px;            
            }                    
        </style>                                               
</head>   
<body>                     
	<script src="https://cdn.jsdelivr.net/processing.js/1.4.8/processing.min.js">
	</script> 
	<script data-processing-target="processing-canvas" type="text/processing">
	    //localStorage.setItem("data", 0);
var mouseIsPressed=mousePressed;
var keyIsPressed=keyPressed;  
void setup() {
    //   /embedded?author=no&width=1366&height=770
    size(650, 400); 
    frameRate(140);           
};  
noStroke();   
const max_creatures = 150;
const mutation_rate = 5;
var creatures = [[100, 100, 0, 100]];
var food = [[300, 100]];
var bad = [[200, 200]];
var boost = [];
var f;
var neural = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
/**
 * Represents a synapse
 * i array 
 * w weight 
 * [1.244, 18.16732, 23.4243]
 **/
var synapse = function(i, w) {
    f = 0;
    for(var g in i) {
        f += i[g];
    }
    return f*w;
};
var score = [0];
var death = [false];
var final = [false];
var massdeath = false;
var generation = 0;
var store_neural = 0;
creatures = [];
score = [];
final = [];
boost = [];
death = [];
food = [];
bad = [];
neural = []; 
var derug = function(d) {
    for(var i in d) {
        return d[i];
    }
};
for(var i = 0; i < max_creatures;i++) {
    creatures.push([100, 100, 0, 100]);
    score.push(0);
    death.push(false);
    final.push(false);
    food.push([300, 100]);
    bad.push([200, 200]);
    neural.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
}
var boost = [];
var max_boost = [];
var store = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 
var great = false;
var sorts = function(a) {
    for(var i in a) {    
        great = true;
        for(var j in a) {
            if(a[i]<a[j]) {
                great = false;
            }
        }
        if(great) {
            return a[i];
        }
    }
};
var limits = function(a, b) {
    if(a>b) {
        return b;
    } else if(a<-b) {
        return -b;
    } else {
        return a;
    }
};
var highscore = [0, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
draw = function() { 
    background(0, 255, 0);
    fill(0); 
    text("Generation: " + generation, 20, 20);
    massdeath = true;  
    for(var i in creatures) {
        if(death[i]===false) {
            massdeath = false;  
        }
        if(boost[i]===undefined) {
            boost.push([dist(creatures[i][0], creatures[i][1], food[i][0], food[i][1])]); 
        } 
        if(creatures[i][0]===0) {
            death[i]=true;
        }
        fill(255, 0, 255);
        if(!death[i]) { 
            ellipse(creatures[i][0], creatures[i][1], 20, 20);
        }
        
        fill(0, 0, 255); 
        ellipse(food[i][0], food[i][1], 20, 20); 
        fill(0, 0, 0);
        ellipse(bad[i][0], bad[i][1], 20, 20);
        var l_1 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][0]);
        var l_2 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][1]);
        var l_3 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][2]);
        var l_4 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][3]);
        var l_5 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][4]);
        var l_6 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][5]);
        var l2_1 = synapse([l_1, l_2, l_3, l_4, l_5, l_6], neural[i][6]);
        var l2_2 = synapse([l_1, l_2, l_3, l_4, l_5, l_6], neural[i][7]);
        var l2_3 = synapse([l_1, l_2, l_3, l_4, l_5, l_6], neural[i][8]);
        var l2_4 = synapse([l_1, l_2, l_3, l_4, l_5, l_6], neural[i][9]);
        var l2_5 = synapse([l_1, l_2, l_3, l_4, l_5, l_6], neural[i][10]);
        var l3_1 = synapse([l2_1, l2_2, l2_3, l2_4, l2_5], neural[i][11]);
        var l3_2 = synapse([l2_1, l2_2, l2_3, l2_4, l2_5], neural[i][12]);
        var l3_3 = synapse([l2_1, l2_2, l2_3, l2_4, l2_5], neural[i][13]);
        var l3_4 = synapse([l2_1, l2_2, l2_3, l2_4, l2_5], neural[i][14]);
        var l_12 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][17]);
        var l_22 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][18]);
        var l_32 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][19]);
        var l_42 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][20]);
        var l_52 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][21]);
        var l_62 = synapse([creatures[i][2], creatures[i][0], creatures[i][1], food[i][0], food[i][1], bad[i][0], bad[i][1]], neural[i][22]);
        var l2_12 = synapse([l_12, l_22, l_32, l_42, l_52, l_62], neural[i][23]);
        var l2_22 = synapse([l_12, l_22, l_32, l_42, l_52, l_62], neural[i][24]);
        var l2_32 = synapse([l_12, l_22, l_32, l_42, l_52, l_62], neural[i][25]);
        var l2_42 = synapse([l_12, l_22, l_32, l_42, l_52, l_62], neural[i][26]);
        var l2_52 = synapse([l_12, l_22, l_32, l_42, l_52, l_62], neural[i][27]);
        var l3_12 = synapse([l2_12, l2_22, l2_32, l2_42, l2_52], neural[i][28]);
        var l3_22 = synapse([l2_12, l2_22, l2_32, l2_42, l2_52], neural[i][29]);
        var l3_32 = synapse([l2_12, l2_22, l2_32, l2_42, l2_52], neural[i][30]);
        var l3_42 = synapse([l2_12, l2_22, l2_32, l2_42, l2_52], neural[i][31]);
        creatures[i][2] += limits(synapse([l3_1, l3_2, l3_3, l3_4], neural[i][15]), 10);
        if(synapse([l3_12, l3_22, l3_32, l3_42], neural[i][16])>0) {
            creatures[i][0] += sin((PI/180)*creatures[i][2])*5;
            creatures[i][1] += cos((PI/180)*creatures[i][2])*5;
        }
        
        //creatures[i][2] += synapse(synapse(synapse(creatures[i][0], creatures[i][1], neural[i][8], neural[i][9]), creatures[i][2], neural[i][10], neural[i][11]), synapse(synapse(bad[i][0], bad[i][1], neural[i][2], neural[i][3]), synapse(food[i][0], food[i][1], neural[i][4], neural[i][5]), neural[i][0], neural[i][1]), neural[i][6], neural[i][7]);
         
        //output1:  
        if(dist(creatures[i][0], creatures[i][1], food[i][0], food[i][1]) <20&&!death[i]) {
            score[i]++;
            boost[i] = dist(creatures[i][0], creatures[i][1], food[i][0], food[i][1]);
            max_boost[i] = 0;
            creatures[i][3]+=175;
            if(score[i]===1) {
                food[i][0] = 500;
            }
             if(score[i]===2) {
                food[i][1] = 300;
            }
            
            if(score[i]>2) {
                food[i][0] = random(0, width);
                food[i][1] = random(0, height);
                bad[i][0] = random(0, width);
                bad[i][1] = random(0, height);
            }
           
        }
        if(dist(creatures[i][0], creatures[i][1], bad[i][0], bad[i][1]) <20) {
            creatures[i][3]-=300;
        }
        if(max_boost[i]===undefined) {
            max_boost.push(0);
        }
        if(1-dist(creatures[i][0], creatures[i][1], food[i][0], food[i][1])/boost[i]>max_boost[i]) {
            max_boost[i] = 1-dist(creatures[i][0], creatures[i][1], food[i][0], food[i][1])/boost[i];
        }
        if(!final[i]) {
            creatures[i][3]-=0.5;
        }
        if(creatures[i][3]<0) {
            death[i] = true;
        }
        if(death[i]&&!final[i]) {
            score[i] += max_boost[i];
            final[i] = true;
        }
        if(score[i]>highscore[0]) {
            highscore[1] = neural[i];
        }
    }  
    text(neural[sorts(score)],10, 400-5);
    text(store[0],10, 400-65);
    text(store.length,10, 400-45);
    text(store,10, 400-25);
    text(max_boost[0], 10, 400-85);
    text(highscore[1], 10, 400-105);
    if(massdeath) { 
        //implement sort function and neural modification
        generation++;
        //store = neural[sorts(score)];
        for(var i in score) {    
            great = true;
            for(var j in score) {
                if(score[i]<score[j]) {
                    great = false;
                }
            }
            if(great) {
                store = neural[i];
            }
        }
        massdeath = false;
        creatures = [];
        score = [];
        boost = [];
        final = [];
        max_boost = [];
        boost = [];
        neural = [];
        death = [];   
        food = []; 
        bad = [];
        for(var i = 0; i < max_creatures;i++) {
            creatures.push([100, 100, 0, 100]);
            score.push(0);
            death.push(false);
            final.push(false);  
            food.push([300, 100]);
            bad.push([300, 200]); 
            neural.push([store[0], store[1], store[2], store[3], store[4], store[5], store[6], store[7], store[8], store[9], store[10], store[11], store[12], store[13], store[14], store[15], store[16], store[17], store[18], store[19], store[20], store[21], store[22], store[23], store[24], store[25], store[26], store[27], store[28], store[29], store[30], store[31]]);
        }
        for(var i in neural) {
                for(var j in neural[i]) {
                    if(random(0, 50)<mutation_rate) {
                        neural[i][j] = random(-i/705, i/705);
                    }
                    neural[i][j] = limits(neural[i][j], 2);
                }
        }
        //println(neural);
    }   
};

void keyPressed() { 
    
};
	</script>
	<p align="left">
	<canvas id="processing-canvas"></canvas>
	</p>
</body>
</html>

另请参见

如果由于任何原因上述小提琴没有显示任何内容,则有一个可汗学院页面https://www.khanacademy.org/computer-programming/evolution-simulator/6424038986973184

0 个答案:

没有答案