Выбор колеса рулетки для минимизации функций - PullRequest
6 голосов
/ 06 января 2012

Этот вопрос отвечает на псевдокод для выбора колеса рулетки . Но это проблема максимизации. Но моя проблема - минимизировать значение фитнес-функции. Это означает, что люди с низкой физической подготовкой имеют более высокую вероятность выбора, чем люди с высокой физической подготовкой. Как я могу это реализовать?

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 06 января 2012

Используйте тот же алгоритм, но сделайте пропорцию каждого человека = maxfitness - fitness

3 голосов
/ 08 января 2012

Колесо рулетки не может быть использовано для минимизации из-за масштабирования. Кроме того, его также нельзя использовать, когда имеются отрицательные или нулевые значения пригодности, поскольку их вероятность будет отрицательной или нулевой.

Как предположил Ларри, вы можете использовать локальную нормализацию, вычитая до максимальной пригодности вашего населения пригодность каждого индивидуума, но опять же вам придется фиксировать максимальную пригодность, чтобы она не имела нулевой вероятности.

Я предлагаю вам использовать выбор турниров, который оказался в несколько раз лучше рулетки.

3 голосов
/ 06 января 2012
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 class - это ваш индивидуальный класс, i - это пригодность, jump - это вероятность выбора в качестве родителя.Сначала мы вычисляем вероятность выбора в качестве родителя, как и раньше.На этом этапе более высокая приспособленность получит более высокую вероятность.Затем мы вычитаем вероятность из 1. Это дает индивидууму более низкую пригодность (псевдо-пригодность для выбора).Теперь пересчитайте вероятность.Видите, порядок бытия полностью перевернут.

2 голосов
/ 11 октября 2014

Может быть уже слишком поздно, но я не рекомендую 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
1 голос
/ 03 декабря 2014

Измените пригодность на fitness_new = 1 / fitness_old, и у вас снова будет проблема максимизации.Если возможно fitness_old = 0, добавьте 1 к знаменателю, чтобы избежать деления на ноль.

...