This question answers pseudocode for roulette wheel selection。但这是最大化问题。但我的问题是最小化健身功能的价值。这意味着,具有低适应性的个体比具有高适应性的个体获得更高的被选择概率。我该如何实现呢?
提前致谢。
答案 0 :(得分:4)
使用相同的算法,但要使每个人的比例= maxfitness - fitness
答案 1 :(得分:3)
import java.util.Random;
import java.util.Arrays;
import java.util.Comparator;
class MyComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
Number n1 = (Number) o1;
Number n2 = (Number) o2;
if(n1.jump > n2.jump)
{
return 1;
}
else if(n1.jump < n2.jump)
{
return -1;
}
else
{
return 0;
}
}
}
class Number
{
public double i;
public int pos;
public double jump = 0;
public Random r = new Random();
public Number(int pos)
{
this.pos = pos;
i = r.nextInt();
}
}
public class Temp
{
public static void main(String[] args)
{
Number[] n = new Number[50];
double total = 0;
for(int i=0; i<50; i++)
{
n[i] = new Number(i);
total += n[i].i;
}
for(int i=0; i<50; i++)
{
n[i].jump = n[i].i/total;
}
Arrays.sort(n, new MyComparator());
for(int i=0; i<50; i++)
{
System.out.print(n[i].pos + ", ");
}
System.out.println();
for(int i=0; i<50; i++)
{
n[i].jump = n[i].i / total;
n[i].jump = 1-n[i].jump;
}
Arrays.sort(n, new MyComparator());
for(int i=0; i<50; i++)
{
System.out.print(n[i].pos + ", ");
}
System.out.println();
}
}
在上面的示例中,假设 Number 类是您的个人类, i 是健身,跳是被选为父母的概率。首先,我们计算被选为父母的概率。在此步骤中,更高的适应度将获得更高的概率。然后我们从1中减去概率。这给出了较低的健身个体较高的适应度(为了选择的假适应性)。现在重新计算概率。看,存在的顺序完全相反。
答案 2 :(得分:3)
由于缩放,轮盘赌不能用于最小化。此外,当存在负或零适合度时也不能使用它,因为它们的概率可能是负的或无效。
正如拉里所建议的那样,您可以通过减去每个人的最大适应度来使用局部归一化,但是您必须再次确定最大适应度,使其没有空概率。
我建议你使用比轮盘赌好多倍的锦标赛选择。
答案 3 :(得分:2)
可能为时已晚,但我不推荐max_fitness - fitness
,因为你会丢失最糟糕的元素(它们可以帮助探索)。相反,你可以做一种反转。
def roulette_selection(population):
fs = [fitness(i) for i in population]
sum_fs = sum(fs)
max_fs = max(fs)
min_fs = min(fs)
p = random()*sum_fs
t = max_fs + min_fs
choosen = population[0]
for i in population:
if MAXIMIZATION:
p -= fitness(i)
elif MINIMIZATION:
p -= (t - fitness(i))
if p < 0:
choosen = i
break
return choosen
答案 4 :(得分:1)
将适应度更改为fitness_new = 1 / fitness_old并再次出现最大化问题。如果fitness_old = 0是可能的,则在分母中加1以避免除以零。
答案 5 :(得分:1)
逆转概率顺序的简单方法:
说一个原始的概率列表[p1,p2,p3,...,pn]
是针对人口中的个体的。
要颠倒顺序,对于此列表中的每个pi
,我们得到new_pi = (1-pi) / (n-1)
。
说明:
由于0<=pi<=1
,(1-pi)
的值使较小的概率得到较大的值。
由于(1-pi)
从i
到1
的{{1}}的总和变为n
,所以除以n-1
(归一化)后,确保(n-1)
。
代码示例:
0<=new_pi<=1