Единый кроссовер дает худшие результаты, чем одноточечный кроссовер?

StackOverflow https://stackoverflow.com/questions/5364403

Вопрос

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

    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.

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

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

Фитнес этого алгоритма очень очень плохая !! Любая помощь вообще была бы очень оценена.

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

Это было полезно?

Решение

Ну, прежде всего Какая информация Вы кодируете и Что ты пытаешься развиваться?

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

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

Другие советы

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

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

if (selected < 1.5)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top