Java中遗传算法的轮盘赌选择

时间:2012-10-08 00:24:12

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

我正在实施遗传算法的轮盘赌选择方法。从本质上讲,我的问题非常简单,但我无法将其包裹起来。在我的健身功能中,如果答案非常错误,它可能会返回-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多%,我把它推到了我的排序列表的末尾。

2 个答案:

答案 0 :(得分:2)

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

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

当randNum [应该]减少时会出现一个更严重的问题但是负面的适应值会导致RandNum重新增长。

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

一种简单的方法就是:

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

当-5000被任意选为最负值时,您认为有意义。实际上,这为最不可能的解决方案提供了一种截断选择形式,你试图通过轮盘赌避免这种方式,但显然当前的适应度函数看起来强烈倾向于该范围的负面(或者甚至可能在消极的一面)。

修改,因为已添加的问题片段及您的评论 有效地,通过与Abs合作。值您的rouletteWheelSelection()负责处理我的初始回复中列出的“更严重”问题。
然而,怀疑getFitness()函数非常偏向于负值。其运作范围为[some_potentially_very_negative_value,+ 100] 请参阅代码:返回的最大值为+100,但如果ScratchGA.functionTest(x1,x2)的值与ScratchGA.getDesired()值非常不同,则可能会返回强大的负值。
似乎需要进行一些规范化,以防止负回报大于100(绝对值)。

这个BTW,很好地解释了为什么,具有这样的适应度函数,轮盘赌轮选择()有利于表现不佳的染色体

想象一下,例如,你有5条染色体的群体,各自的适应值分别为80,70,30,20和-250。总和为450,对于具有正适应性的所有四条染色体为200,对于具有负适应性的一条染色体为250。在这个例子中,有机会挑选更糟的染色体! 轮盘赌选择背后的想法是提供选择染色体的可能性,其中选择任何染色体的概率应该与染色体对健康值总和的贡献量成正比。你实现的有效实现了这个问题,但问题在于负面拟合总和的价值似乎与正适应值提供的不成比例。

答案 1 :(得分:0)

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