2

我已经为我的部分作业编写了一个统一的交叉算法,但它不能正常工作。它实际上返回的结果比我的一点交叉更差。我只想有人指出我哪里出错了,所以我可以解决它:)。我已经尝试了很多年了,这是我最后的选择!!

    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 来确定孩子将从每个父母那里得到哪个基因。

这个算法的适应度非常非常差!!任何帮助都将不胜感激。

非常感谢。

4

2 回答 2

1

好吧,首先你要编码什么样的信息,你想要进化什么?

根据您要解决的问题,某些类型的交叉策略会阻止您找到好的解决方案。

一个简单的例子:如果您正在寻找的解决方案具有固有的对称性(例如白色/黑色元胞自动机多数分类器),单点交叉永远不会给您很好的结果,因为它破坏了遗传算法可能偶然发现的任何对称性(例如,在多数分类器的情况下,它将非常擅长分类黑色或白色,但不能同时分类两者,因此它永远不会比给定的 - 相当低 - 适合度更好)。

于 2011-03-21T12:33:37.570 回答
0

(因为你没有回复我的评论,我会重复它作为答案)

您正在将双精度数与对浮点数有问题的常量进行比较,使用int selected可能会做得更好,或者如果您需要使用双精度数,请尝试使用类似的东西:

if (selected < 1.5)
于 2011-03-20T07:27:32.353 回答