这个问题回答了轮盘赌选择的伪代码。但是它是针对最大化问题的。我的问题是最小化适应度函数的值。也就是说,适应度较低的个体被选中的概率比适应度较高的个体更高。我该如何实现这一点?
提前感谢。
这个问题回答了轮盘赌选择的伪代码。但是它是针对最大化问题的。我的问题是最小化适应度函数的值。也就是说,适应度较低的个体被选中的概率比适应度较高的个体更高。我该如何实现这一点?
提前感谢。
maxfitness - fitness
。将适应度改为适应度_new = 1 / 适应度_old,您再次拥有了最大化问题。如果可能的话,若适应度_old = 0,则在分母中加1以避免除以零。
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();
}
}
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
简单的逆转概率顺序方法:
假设原始的概率列表 [p1,p2,p3,...,pn]
是针对人群中的个体。
为了逆转顺序,对于列表中的每个pi
,我们得到new_pi = (1-pi) / (n-1)
。
解释:
由于0<=pi<=1
,因此(1-pi)
的值使较小的概率获得较大的值。
由于i
从1
到n
的(1-pi)
之和变为n-1
,在除以(n-1)
(归一化)后,我们确保0<=new_pi<=1
。
代码示例:
def rouletteWheelSelect(population):
fitnessSum = 0
for individual in population:
fitnessSum += individual.fitness
for individual in population:
individual.selectProb = individual.fitness / fitnessSum
probSum = 0
wheelProbList = []
if MAXIMIZATION_PROBLEM:
for individual in population:
probSum += individual.selectProb
wheelProbList.append(probSum)
elif MINIMIZATION_PROBLEM:
for individual in population:
probSum += (1-individual.selectProb) / (POPULATION_SIZE-1)
wheelProbList.append(probSum)
r = random.random() # 0<=r<1
for i, p in enumerate(wheelProbList):
if r < p:
return population[i]
return None