Равномерный кроссовер, дающий худшие результаты, чем одноточечный кроссовер? - PullRequest
2 голосов
/ 19 марта 2011

Я написал единый алгоритм кроссовера для части домашней работы, но он не работает должным образом.Это на самом деле возвращает худшие результаты, чем мой переход на одно очко.Я просто хотел бы, чтобы кто-то указал, где я иду не так, чтобы я мог это исправить, пожалуйста :).Я пытался целую вечность, и это мое последнее средство !!

    private void DoUniformCrossOver(int p1id,int p2id)
{
    ArrayList<Integer> p1 = population.get(p1id).GetRep();
    ArrayList<Integer> p2 = population.get(p2id).GetRep();
    ArrayList<Integer> c1 = new ArrayList<Integer>();
    ArrayList<Integer> c2 = new ArrayList<Integer>();

for (int i=0;i<nbits;++i)
{
    double selected = CS2004.UI(1,2);
    if (selected ==1)
    {
        c1.add(p1.get(i));
        c2.add(p2.get(i));
    }
    else
    {
        c1.add(p2.get(i));
        c2.add(p1.get(i));
    }
}

    population.add(new ScalesChrome(c1));
    population.add(new ScalesChrome(c2));
}

Метод принимает в качестве параметров два родителя, p1id и p2id.Затем создает массивы представления - p1 и p2.

В цикле for nbits - это вес массива (или длина массива).Мой метод одноточечного кроссовера использует его в цикле for, и он прекрасно работает.

Затем я генерирую 1/2, чтобы определить, какой ген от каждого родителя получит ребенок.

пригодность этого алгоритма очень и очень плохая !!Буду признателен за любую помощь.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 21 марта 2011

Ну, в первую очередь какую информацию вы кодируете и что вы пытаетесь развить ?

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

Простой пример : если искомое решение имеет внутреннюю симметрию (например, белый / черный сотовыйавтоматный мажоритарный классификатор), пересечение одной точки никогда не даст вам очень хороших результатов, потому что оно нарушает любую симметрию, на которую мог наткнуться генетический алгоритм (например, в случае мажоритарного классификатора он будет очень хорош при классификации черного илибелый, но не оба, поэтому он никогда не станет лучше, чем данный - довольно низкий - пригодность).

0 голосов
/ 20 марта 2011

(поскольку вы не ответили на мой комментарий, я повторю его как ответ)

Вы сравниваете double с константой, что проблематично для чисел с плавающей запятой, использование int selected, вероятно, будет лучше, или в случае, если вам нужно использовать double, попробуйте использовать что-то вроде:

if (selected < 1.5)
...