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