我为部分作业编写了一个统一的交叉算法,但它无法正常工作。它实际上比我的一点交叉更糟糕的结果。我想有人指出我哪里出错了所以我可以修理它:)。我现在已经尝试了很多年,这是我的最后一招!!
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作为参数。然后创建表示的arraylists - p1和p2。
在for循环中,'nbits'是数组的权重(或数组的长度)。我的单点交叉方法在for循环中使用它,它运行得很好。
然后我生成1/2来确定孩子将从每个父母那里得到哪个基因。
这个算法的适应性非常差!!任何帮助都将非常感激。
非常感谢。
答案 0 :(得分:1)
嗯,首先你在编码什么样的信息,你想要发展什么?
根据您尝试解决的问题,某些交叉策略会阻止您找到好的解决方案。
一个简单的例子:如果您正在寻找的解决方案具有固有的对称性(例如白/黑细胞自动机多数分类器),单点交叉将永远不会给您非常好的结果,因为它是打破遗传算法可能偶然发现的任何对称性(例如,在多数分类器的情况下,它将非常善于分类黑色或白色而不是两者,因此它永远不会比给定的更好 - 相当低 - 适应性)。
答案 1 :(得分:0)
(由于你没有回复我的评论,我会重复一遍作为答案)
您将双精度值与常数进行比较,这对于浮点数而言是有问题的,使用int selected
可能会做得更好,或者如果您需要使用双精度数,请尝试使用以下内容:
if (selected < 1.5)