Java 优化函数的遗传算法

Java 优化函数的遗传算法,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());

请帮帮我, 我尝试在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());

    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个最佳个体)。

请回答您的问题,并在此处包含您的代码。它有效吗?请在你的问题中包含任何必要的代码(作为一个例子)。链接到你的谷歌硬盘是不合适的。它工作,先生,但我不能得到一个好的结果,它不是为了所有的世代。请在上面的链接上下载我的代码。请帮助我,我不知道是怎么回事