优化函数的遗传算法



请帮助我, 我尝试在 java 中实现 GA 以解决 (Xi)^2 函数的总和的最小化,该函数的 X 值在 [-100,100] 之间翻倍,i = 1,2,3,...,30 并且有 4 个群体。 我无法得到正确的结果。 检查源代码 谢谢

遗传算法.java

....
public Population evolvePopulation(Population population) { 
Population newPopulation = new Population(population.size());
for (int i = 0; i < population.size(); ++i) {
Individual firstIndividual = randomSelection(population);
Individual secondIndividual = randomSelection(population);
Individual newIndividual = crossover(firstIndividual, secondIndividual);
newPopulation.saveIndividual(i, newIndividual);
}
for (int i = 0; i < newPopulation.size(); ++i) {
mutate(newPopulation.getIndividual(i));
}
return newPopulation;
}

遗传算法.java

public Individual randomSelection(Population population) {
Population newPopulation = new Population(Constants.TOURNAMENT_SIZE);
for (int i = 0; i < Constants.TOURNAMENT_SIZE; ++i) {
int randomIndex = (int)(Math.random()*population.size());
newPopulation.saveIndividual(i, population.getIndividual(randomIndex));
}
Individual fittestIndividual = newPopulation.getFittestIndividual();
return fittestIndividual;
}   

人口.java

...
public Population evolvePopulation(Population population) { 
Population newPopulation = new Population(population.size());
for (int i = 0; i < population.size(); ++i) {
Individual firstIndividual = randomSelection(population);
Individual secondIndividual = randomSelection(population);
Individual newIndividual = crossover(firstIndividual, secondIndividual);
newPopulation.saveIndividual(i, newIndividual);
}
for (int i = 0; i < newPopulation.size(); ++i) {
mutate(newPopulation.getIndividual(i));
}
return newPopulation;
}
...

个人.java

public void generateIndividual() {
df = new DecimalFormat(".##");
for (int i = 0; i < Constants.CHROMOSOME_LENGTH; i++) {
String gen = df.format((randomGenerator.nextDouble()*(201))-100);
double gene  = Double.parseDouble(gen);
genes[i] = gene;
}
}

结果:

世代:1 - 适者是:187840.0388

世代:2 - 适者是:145642.2474

世代:3 - 适者是:143804.0066

世代:4 - 优胜劣汰是:164595.30819999994

代次:5 - 优胜劣汰是:192525.51659999997

世代:6 - 适者是:176011.80959999998

世代:7 - 优胜劣汰是:165286.99679999996

世代:8 - 优胜劣汰是:181544.71279999998

世代:9 - 适者是:180144.33559999996

世代:10 - 适者是:178226.74199999994

首先,基因搜索不能保证在任何有限的时间内找到最佳解决方案,尽管它可能在其附近收敛得非常快。此外,基因探索并不能证明给定的解决方案实际上是最优的,因此只有在足够好的解决方案很好时才应该使用它。

看看你在S.O.上发布的代码片段,我会提出以下观察:

  • randomSelection()中,您随机选择初始总体的子集,然后返回该组中的最佳个体。我的看法是,你想给那些根据适应度函数携带更好基因组的个体提供生殖优势。这是对的吗?

  • evolvePopulation()中,您随机选择两个父项,然后将它们与交叉步骤组合在一起。然后,您将随机突变应用于生成的基因组,并将其添加到新群体中。

在这一点上,我看到以下问题:如果父母双方都是随机选择的,绝对不能保证您种群中最好的个体实际上有机会繁殖。相反,我只会随机选择两个父母中的一个,以确保每个人都至少有一个孩子。

我也不清楚,因为它没有显示,mutate()是否总是改变基因组的某些部分,或者这是否只是在给定的低概率下完成的。

重要的是要记住,crossover()mutate()都会对您的种群产生破坏性影响:任何地方都没有写到应用这些运算符产生的后代比上一代更好

因此,您似乎错过了selection()一步。一个人应该产生比它打算留在新一代内部更多的个体,然后在让它们再次繁殖之前杀死所有最糟糕的个体。

此外,如果你不希望你的搜索暂时退化,你应该在随后的两代中保存最好的个体(或最好的前N个个体)。

最新更新