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