轮盘赌选择功能最小化

时间:2012-01-06 15:48:55

标签: genetic-algorithm roulette-wheel-selection

This question answers pseudocode for roulette wheel selection。但这是最大化问题。但我的问题是最小化健身功能的价值。这意味着,具有低适应性的个体比具有高适应性的个体获得更高的被选择概率。我该如何实现呢?

提前致谢。

6 个答案:

答案 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)i1的{​​{1}}的总和变为n,所以除以n-1(归一化)后,确保(n-1)

代码示例:

0<=new_pi<=1