0

我正在为遗传算法实施轮盘赌选择方法。从本质上讲,我的问题非常简单,但我无法完全理解它。在我的适应度函数中,如果答案非常错误,它可能会返回 -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]; 
} 

(此处的原始链接:用 Java 编写的 GA

我让我的 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%,我把它推到排序列表的末尾是负面的。

4

2 回答 2

2

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

对于负值,关于计算 totalFitness 的第一个问题是:这是适应值的代数和还是应该与它的绝对值一起工作。

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

一个建议是改变适应度函数,使其只返回正值。

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

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

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


通过与 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。在这个例子中,有比什至机会挑选更差的染色体!
轮盘选择背后的想法是提供可能性选择小于最佳适应度的染色体,但选择任何染色体的概率应与染色体对适应度值总和的贡献量成正比。您的实现有效地做到了这一点,但问题是对负适应度总和的贡献似乎与正适应度值提供的不成比例。

于 2012-10-08T01:09:54.617 回答
0

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

于 2012-10-09T05:58:38.193 回答