【问题标题】:Roulette selection function for a genetic algorithm遗传算法的轮盘赌选择函数
【发布时间】:2011-05-02 03:42:55
【问题描述】:

所以我为我的遗传算法编写了一个轮盘赌选择函数,如下所示:

public String tournament(float fitness, Chromosome pop[], int selection)
{
    // roulette
    if (selection == 1)
    {
        Random random = new Random();
        float slice = random.nextFloat() * fitness;

        float curFitness = 0.0f;

        for (int i = 0; i < initialPopulation; i++)
        {
            curFitness += pop[i].fitness;

            if (curFitness >= slice)
                return pop[i].bits;
        }
    }
    return "";
}

问题是它有时会返回空白字符串,它只是为了满足返回条件而放置的。这通常不是问题,但在某些运行期间,它会导致 GA 终止,因为下一步涉及交叉阶段。有什么想法吗?

【问题讨论】:

  • 在什么情况下你将无法从循环中的语句返回?为什么会这样?放入一些调试行并找出答案。或者使用调试器运行它。
  • 如果出现最小化问题,此代码将失败。
  • 我意识到我参加这个聚会有点晚了,但是使用你传递给这个函数的'fitness'值,它是所有个人适应度的总和吗?只是好奇这是如何工作的。

标签: java genetic-algorithm roulette-wheel-selection


【解决方案1】:

事实证明,突变函数偶尔会将我的一些位字符串归零,这导致总体包含空字符串。

以前是这样的:

public String mutate(String bits)
{   
    Random random = new Random();
    StringBuffer buf = new StringBuffer(bits);
    for (int i = 0; i < bits.length(); i++)
    {
        if (random.nextFloat() < mutationRate)
        {
            if (bits.charAt(i) == '1')
            {
                buf.setCharAt(i, '0');
                                    return buf.toString();

            }
            else
            {
                buf.setCharAt(i, '1');
                                    return buf.toString();
            }
        }
    }
    return "";
}

我把它改成了这样:

public String mutate(String bits)
{   
    Random random = new Random();
    StringBuffer buf = new StringBuffer(bits);
    for (int i = 0; i < bits.length(); i++)
    {
        if (random.nextFloat() < mutationRate)
        {
            if (bits.charAt(i) == '1')
            {
                buf.setCharAt(i, '0');
            }
            else
            {
                buf.setCharAt(i, '1');
            }
        }
    }
    return buf.toString();
}

粗心的错误。

【讨论】:

    【解决方案2】:

    我的猜测是问题在于您的fitness 有时小于您的pop[i].fitnesses 的总和。尝试在for 循环之后但在if 或类似性质的东西内放置一个return "ERROR: " + fitness + " / " + curFitness; 行,看看会返回什么。

    【讨论】:

      猜你喜欢
      • 2014-05-25
      • 2010-09-15
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2012-09-28
      • 2018-07-04
      相关资源
      最近更新 更多