gpt4 book ai didi

java - Flappy Bird 遗传算法种群改进

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:57 27 4
gpt4 key购买 nike

我正在尝试创建一种遗传算法来学习玩飞扬的小鸟。我的游戏正在运行,这是我的 Bird 类:

public class Bird extends Player {

public NNetwork network;

public Bird(float x, float y, float velX, float velY, float width, float height) {
super(x, y, velX, velY, width, height);
NTopology topo = new NTopology(3,5,1);
network = new NNetwork(topo, 0.1f, 0.1f, true);
}

public void reset() {
setAlive(true);
setX(0f);
setY(1000f);
setVelY(0f);
}

/**
* Feeds the parameters into the neural net
* @param dyTop height difference to the top edge
* @param dyBot height difference to the bottom edge
* @param dx distance to the obstacles
* @return true if the bird thinks it would be good to jump
*/
public void jump(float dyTop, float dyBot,float dx) {
network.feed(dyTop, dyBot, dx);
if(network.getOutputs()[0]>0f) super.flap();
}

public void update(float dyTop, float dyBot, float dx) {
super.update();
jump(dyTop, dyBot, dx);
}

public Bird mutate() {
Bird ret = this;
ret.network.mutate();
ret.setAlive(true);
ret.setScore(0f);
ret.setX(0);
ret.setY(1000);
return ret;
}

这些是种群变异函数

public ArrayList<Bird> sortBirds(ArrayList<Bird> birds) {
ArrayList<Bird> ret = birds;
Collections.sort(ret, new Comparator<Bird>() {
@Override
public int compare(Bird bird, Bird t1) {
return bird.getScore() < t1.getScore() ? 1 : -1;
}
});
lastBestScore = ret.get(0).getScore();
return ret;
}


public ArrayList<Bird> repopulate(ArrayList<Bird> birds) {
birds = sortBirds(birds);
Bird bestBird = this.birds.get(0);
Bird[] retA = new Bird[birds.size()];
birds.toArray(retA);
retA[0] = bestBird;
for(int i = 0; i < 3; i++) { //replace the 3 worst birds with mutations of the best one (there are always at least 5 birds)
retA[retA.length-1-i] = bestBird.mutate();
}
ArrayList<Bird> ret = new ArrayList<>(Arrays.asList(retA));
for(Bird b : ret) {b.reset();}
generation++;
return ret;
}

Bird.reset() 函数只是让小鸟复活并将其设置回起点。当每只鸟都死了时,将调用 repopulate()。理论上,随着时间的推移,这些功能应该会改善我的种群数量,但当一只鸟比其他鸟好时,下一代又变坏了。

是我误解了遗传算法的工作原理还是代码中存在错误?(如果您需要更多代码,我可以发布)

最佳答案

首先,您的代码中没有交叉,这很糟糕。它通常会提供更好的结果。

其次,您是否只保留了最好的基因组及其 3 个突变,而其余种群只是从头开始再生? - 这不会很好,因为你需要更多的多样性。

如果你想单独使用突变,我建议将最好的一半克隆到新一代中,而另一半 - 最好的一半的突变。但我敢肯定,在这种情况下,您也会陷入局部最大值,但这比您现在的做法要好得多。

根据我使用 Flappy Bird 的经验,你最好从常量列开始,因为它更容易让鸟儿学习,也更容易调试。

关于java - Flappy Bird 遗传算法种群改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48608511/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com