我已经为我的部分作业编写了一个统一的交叉算法,但它不能正常工作。它实际上返回的结果比我的一点交叉更差。我只想有人指出我哪里出错了,所以我可以解决它:)。我已经尝试了很多年了,这是我最后的选择!!
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 来确定孩子将从每个父母那里得到哪个基因。
这个算法的适应度非常非常差!!任何帮助都将不胜感激。
非常感谢。