【问题标题】:Genetic algorithm for optimization function优化函数的遗传算法
【发布时间】:2018-04-20 10:35:31
【问题描述】:

请帮帮我, 我尝试在 java 中实现 GA 以解决 (Xi)^2 函数求和的最小化,即 X 值在 [-100,100] 之间是双倍的,i = 1,2,3,...,30 并且有 4 个人口。 我无法得到正确的结果。 Check Source Code 谢谢你

遗传算法.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

【问题讨论】:

  • 请edit您的问题并在此处包含您的代码。有用吗?
  • 请在您的问题中包含任何必要的代码(作为minimal reproducible example)。指向您的 Google 云端硬盘的链接不合适。
  • 它有效,先生,但我不能得到一个好的结果,而且它不是为了所有世代。请在上面的链接上下载我的代码先生
  • 请帮帮我,我不知道是什么问题

标签: java artificial-intelligence genetic-algorithm


【解决方案1】:

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

查看您在 S.O. 上发布的代码 sn-ps,我会做出以下观察:

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

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

此时我看到了以下问题:如果父母双方都是随机选择的,则绝对不能保证您群体中最优秀的个体确实有机会繁殖。相反,我会随机选择两个父母中的一个,以确保每个人至少有一个孩子。

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

请务必记住,crossover() 和 mutate() 都可能对您的人口产生破坏性影响:没有任何地方写明应用这些运算符产生的后代是 比上一代好。

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

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

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 2013-07-02
    • 2011-06-07
    • 1970-01-01
    • 2012-03-27
    • 2021-03-03
    • 2011-05-24
    • 2023-03-15
    相关资源
    最近更新 更多