【问题标题】:Roulette Wheel Selection for Genetic Algorithm in JavaJava中遗传算法的轮盘选择
【发布时间】:2012-09-28 05:57:59
【问题描述】:

我正在为遗传算法实施轮盘赌选择方法。从本质上讲,我的问题非常简单,但我无法完全理解它。在我的适应度函数中,如果答案非常错误,它可能会返回 -3000% 左右。我的问题是,当我尝试为我的结果分配概率时,它们会倾向于错误的答案。

例如: 如果我的百分比在数组中并且是 [92, 68, 5, -4, -3546] (从高到低) 我需要让较低指数中的数字比具有较高指数的数字更有可能被选中。

忽略我的适应度函数,如何在考虑大负数的情况下基于此创建概率?

我在另一个问题中发现的一些基本代码:

public Individual rouletteWheelSelection() { 
    double randNum = m_rand.nextDouble() * this.totalFitness; 
    int idx; 
    for (idx=0; idx<POP_SIZE && randNum>0; ++idx) { 
        randNum -= m_population[idx].getFitnessValue(); 
    } 
    return m_population[idx-1]; 
} 

(原文链接:GA written in Java)

我让我的 GA 使用不同的选择方法,但现在我正在尝试修改这个方法来代替它。任何帮助将不胜感激。

***编辑

以下代码是我修改的rouletteWheelSelection:

private Chromosome rouletteWheelSelection(){
    double randNum = Math.abs(rand_num.nextDouble() * totalFitness);
    int idx;
    for (idx=0;idx<NUM_CHROMOSOMES && randNum>0;++idx){
        randNum -= Math.abs(population[idx].getFitness());
    }
    return population[NUM_CHROMOSOMES-idx];
}

这是我的适应度函数:

public double getFitness()
{
    String working = bitString;
    int x1 = Integer.parseInt(working.substring(0,6),2);
    int x2 = Integer.parseInt(working.substring(6),2);
    double result = ScratchGA.functionTest(x1,x2);
    double percentAccuracy = (1- Math.abs(((ScratchGA.getDesired() - result)/ScratchGA.getDesired())))*100;
    if (percentAccuracy <= 100)
    {
    return percentAccuracy;
    }
    else
    {
    return -percentAccuracy;
    }
}

当时的想法是一个值与我需要的值相差超过 100%,我把它推到排序列表的末尾是负面的。

【问题讨论】:

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


    【解决方案1】:

    问题中显示的选择方法隐含地仅适用于正或空适应度值。

    对于负值,关于计算总适应度的第一个问题是:这是适应度值的代数和,还是应该使用其绝对值。

    当 randNum [应该] 减少但不知何故负适应度值导致 RandNum 重新增长时,会出现更严重的问题。

    建议更改适应度函数,使其仅返回正值。

    一个简单的方法是这样的:

    if (fitValue >= -5000)
      fitValue += 5000;
    else
      fitvalue = 0;
    

    -5000 被任意选择为您认为有意义的最负值。实际上,这为最不合理的解决方案提供了一种截断选择形式,这是您试图通过轮盘赌避免的事情,但显然当前的适应度函数似乎严重偏向范围的负侧(或者甚至可能在消极的一面)。

    编辑鉴于添加的有问题的 sn-ps 和您的评论
    有效地,通过与 Abs 合作。 values 您的 版本的rouletteWheelSelection() 处理了我最初的回复中列出的“更严重”的问题。
    然而,怀疑的getFitness() 函数非常偏向于负值。它的操作范围是[some_potentially_very_negative_value, +100]。
    见代码:返回的最大值是+100,但是当ScratchGA.functionTest(x1,x2)的值与ScratchGA.getDesired()的值有很大不同时,有可能返回很大的负值。
    似乎需要对排序进行一些标准化,以防止负回报远大于 100(绝对值)。

    顺便说一句,很好地解释了为什么 具有这样的适应度函数,轮盘赌WheelSelection() 偏爱表现不佳的染色体。

    例如,假设您有 5 条染色体,其适应度值分别为 80、70、30、20 和 -250。总和为 450,所有四个具有正适应度的染色体为 200,而具有负适应度的一个染色体为 250。在这个例子中,有机会挑选出最差的染色体!
    轮盘赌选择背后的想法是提供可能选择不具有最佳适应度的染色体,但选择任何染色体的概率应该与染色体对适应度值总和的贡献量成正比。您的实现有效地做到了这一点,但问题是对负适应度总和的贡献似乎与正适应度值提供的不成比例。

    【讨论】:

    • 我的总适应度,当前计算的是个体适应度绝对值的总和。示例:[20,5,-15] 的 totalFitness 为 40。我处理了 randNum 问题(我认为),确保它是正数并减去适应度的绝对值。
    • 我之所以不将所有百分比准确率返回为正数,是因为我可以根据准确率进行排序,其中 100% 是最佳的......并尝试从我想要的结果中剔除超过 100% 的任何内容。
    • 我并没有解决一个特别困难的问题,但它确实似乎正在快速收敛......在大约四代人中......哈哈。感谢您的帮助。
    【解决方案2】:

    您可以使用窗口化,因为您始终会添加或减去最差适应度的人群。这样选择的范围从 0 扩展到正值。最差的个人将永远没有机会被选中(类似于锦标赛选择)。因为如果您不将您的值视窗化,那么适合度为 98 的个体将具有与具有 95 和 96 的个体几乎相同的选择压力。只要您的群体包括较低质量的解决方案,那很好,但是当所有解决方案都在 90 年代时选择压力将显着降低。随着您的人口收敛到最佳解决方案,您将越来越像随机搜索。如果您考虑人口中越来越精细的细节(差异),您只能进行定向探索。

    【讨论】:

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