-1

我正在为遗传算法实现轮盘选择方法。从本质上讲,我的问题很简单,但我无法围绕这个问题。在我的健身功能中,如果答案是非常错误的,它可能会返回约-3000%。我的问题是,当我尝试为结果分配概率时,他们会错误地回答错误的答案。Java中遗传算法的轮盘选择

例如: 如果我的百分数都是在阵列并[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

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

对于负值,关于计算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,解释得很好,为什么具有这样的适应度函数,rouletteWheelSelection()有利于表现不佳的染色体

想象例如,你有5条染色体的80,70,30,20和-250各自适合度值的群体。总和为450,对于所有四条染色体具有正适应度为200,对于具有负适合度的一条染色体为250。在这个例子中,有更好的机会选择染色体更糟的!
后面赌轮选择的想法是提供具有小于最优适应选择染色体的可能性,但是选择的任何染色体的概率应该是正比于染色体有助于适应值的整体总和的量。你有效地实现了这一点,但问题是负值拟合总和的贡献值与积极适应值提供的值不成比例。

+0

我totalFitness,按照目前的计算是个体适应度的绝对值的总和。示例:totalFitness [20,5,-15]是40 我把randNum问题(我认为),要确保它是积极的,减去适应度的绝对值的照顾。 – Ramrod

+0

我不推荐所有的百分比准确度都是正面的,我可以根据准确性进行排序,100%是最优的,并且试图从我期望的结果中清除超过100%的东西。 – Ramrod

+0

我不是在解决一个特别困难的问题,但它确实似乎正在快速收敛......在四代人中......哈哈。谢谢您的帮助。 – Ramrod

0

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