Java 优化函数的遗传算法
请帮帮我, 我尝试在java中实现GA,以解决X值在[-100100]之间加倍,I=1,2,3,…,30且有4个总体的(Xi)^2函数求和的最小化问题。 我不能得到正确的结果。 谢谢 GeneticAlgorithm.javaJava 优化函数的遗传算法,java,artificial-intelligence,genetic-algorithm,Java,Artificial Intelligence,Genetic Algorithm,请帮帮我, 我尝试在java中实现GA,以解决X值在[-100100]之间加倍,I=1,2,3,…,30且有4个总体的(Xi)^2函数求和的最小化问题。 我不能得到正确的结果。 谢谢 GeneticAlgorithm.java .... public Population evolvePopulation(Population population) { Population newPopulation = new Population(population.size());
....
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;
}
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;
}
。。。。
公共人口演变人口(人口){
Population newPopulation=新人口(Population.size());
对于(int i=0;i
GeneticAlgorithm.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;
}
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;
}
公共个体随机选择(总体){
新人口=新人口(常数。单位大小);
对于(int i=0;i
Population.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;
}
...
。。。
公共人口演变人口(人口){
Population newPopulation=新人口(Population.size());
对于(int i=0;i
Individual.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;
}
}
public void generateIndividual(){
df=新的十进制格式(“.##”);
对于(int i=0;i
结果:
世代:1-适者生存期:187840.0388
第2代-最适合的是:145642.2474
第3代-最适合的is:143804.0066
第4代-最适合的是:164595.308199994
第5代-最适合的是:192525.516599997
世代:6-最适合的是:176011.809599998
第7代-最适合的是:165286.996799996
第8代-最适合的是:181544.712799998
第9代-最适合的是:180144.335599996
世代:10-适者生存是:178226.741999994首先,遗传搜索不一定能在任何有限的时间内找到最优解,尽管它可能在其邻近区域收敛得非常快。此外,遗传探索没有提供任何方法来证明给定的解决方案实际上是最优的,因此只有当足够好的解决方案是好的时才应该使用它 看看您在S.O.上发布的代码片段,我想做以下观察:
- 在
中,随机选择初始总体的子集,然后返回该组中的最佳个体。我的观点是,你想给那些根据适应度函数携带更好基因组的个体带来繁殖优势。对吗randomSelection()
- 在
中,您随机选择两个父项,然后使用交叉步骤将它们组合起来。然后将随机突变应用于产生的基因组,并将其添加到新的群体中evolvePopulation()
mutate()
是否总是改变基因组的某些部分,或者这是否只在给定的低概率情况下完成
重要的是要记住,crossover()
和mutate()
都会对您的种群产生破坏性的影响:没有任何地方写过应用这些操作符产生的后代比上一代更好
因此,您似乎遗漏了一个selection()
步骤。一个人应该在新的一代中产生更多的个体,然后杀死所有最坏的个体,然后让它们再次繁殖
此外,如果您不希望您的搜索暂时退化,您应该在两个后续世代中保存最佳个体(或前N个最佳个体)。请回答您的问题,并在此处包含您的代码。它有效吗?请在你的问题中包含任何必要的代码(作为一个例子)。链接到你的谷歌硬盘是不合适的。它工作,先生,但我不能得到一个好的结果,它不是为了所有的世代。请在上面的链接上下载我的代码。请帮助我,我不知道是怎么回事