我是学习的最后一年的学生,我想创建一个包含我的项目的网站,向未来的雇主展示我的技能。 我的一个项目有问题:
我试图编写一个AI来解决飞扬的小鸟游戏
所以我用tensorflow js中的模型创建了代理,然后应用了进化算法来训练它们并使它们按照我想要的方式进化。我的问题如下: 我的算法无法正确选择我的代理,并且在必须对其进行操作(新一代的选择,突变和重新分配)时无法识别模型
它是如何工作的: -我创建了一堆代理商 -我让他们玩(tf模型预测他是否必须上升) -当它们死后,我会按顺序存储它们(最差) -当每个经纪人迷路时,我会选择他们中最好的 -我让它们变异(我在tf模型上应用变异) -我将新模型放到了新一代代理商中 -然后我们再次开始,直到进化为我们提供了一种能够正确玩游戏的模型
我试图以不同的方式定义模型,但似乎没有一个起作用。 在一种情况下,浏览器返回下一代时会返回错误: “无法读取未定义的属性'副本'” 我试图用另一种方式定义它,并且有效!但是出现了另一个问题,我的代理人似乎世代相传(显然,这并不是最好的代理人)
我不知道我的问题来自哪里: -我的算法与此特定情况(或其他任何情况)不符 -我没有正确设置代理,并且功能未正确将其更改应用于代理 -选择是有效的,但我对最佳代理商的计算是错误的,因此选择有偏见
我已经考虑了几天,却找不到答案
//我的选择功能
function pickOne() {
let index = 0;
let r = Math.random(1);
while (r > 0) {
r = r - savedBirds[index].fitness;
index++;
}
index--;
let bird = savedBirds[index];
let child = new flappy(bird.brain);
child.mutate();
return child;
}
//创建新一代,但返回“无法读取未定义的属性'copy'”
function nextGeneration() {
console.log('next generation');
//console.log(agents);
calculateFitness();
for (let i = 0; i < number; i++) {
console.log(agents[i]);
agents[i] = pickOne();
}
for (let i = 0; i < number; i++) {
savedBirds[i].dispose();
}
savedBirds = [];
}
//我的张量流神经网络的复制功能
copy() {
return tf.tidy(() => {
const modelCopy = this.createModel();
const weights = this.model.getWeights();
const weightCopies = [];
for (let i = 0; i < weights.length; i++) {
weightCopies[i] = weights[i].clone();
}
modelCopy.setWeights(weightCopies);
return new NeuralNetwork(modelCopy, this.input_nodes, this.hidden_nodes, this.output_nodes);
});
}
通常,选择和变异会在几代之后给我们带来结果,但是即使我尝试了200代,每个特工都是一样的,而且他们确实能够玩这个游戏
希望我足够精确,如果您想了解更多信息,请询问:)