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

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

    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 ответа

Решение

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

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

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

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

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

if (selected < 1.5)
Другие вопросы по тегам