gpt4 book ai didi

java - Java 遗传算法的轮盘赌选择

转载 作者:行者123 更新时间:2023-12-02 07:32:06 29 4
gpt4 key购买 nike

我正在为遗传算法实现轮盘赌选择方法。从本质上讲,我的问题非常简单,但我无法全神贯注。在我的适应度函数中,如果答案极其错误,它可能会返回 -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%,我将其推到排序列表的末尾。

最佳答案

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

对于负值,在计算 TotalFitness 时会出现第一个问题:这是适应值的代数和还是应该使用其绝对值。

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

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

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

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

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

编辑鉴于添加的相关代码片段和您的评论
有效地,通过与 Abs 合作。 版本的 rouletteWheelSelection() 会处理我最初回复中列出的“更严重”的问题。
然而,正如所怀疑的那样,getFitness() 函数非常偏向于负值。其操作范围是[some_潜在_非常负_值,+100]。
看代码:返回的最大值是+100,但是当 ScratchGA.functionTest(x1,x2) 的值与 的值相差很大时,有可能返回很大的负值ScratchGA.getDesired() 值。
似乎需要进行某种标准化,以防止负返回远大于 100(绝对值)。

顺便说一句,很好地解释了为什么在这样的适应度函数下,rouletteWheelSelection() 会偏向表现较差的染色体

例如,假设您有一个由 5 条染色体组成的群体,各自的适应度值为 80、70、30、20 和 -250。总和为 450,其中所有 4 条具有正适应度的染色体均为 200,而 1 条具有负适应度的染色体则为 250。在这个例子中,有更好的机会选择较差的染色体!
轮盘赌选择背后的想法是提供选择不太适合的染色体的可能性,但是选择任何染色体的概率应该与该染色体对适应值总和的贡献量成正比。您所拥有的实现有效地做到了这一点,但问题是对负适应度总和贡献的值似乎与正适应度值提供的值不成比例。

关于java - Java 遗传算法的轮盘赌选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12774014/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com