Java 均匀交叉比单点交叉效果差?

Java 均匀交叉比单点交叉效果差?,java,for-loop,genetic-algorithm,genetic-programming,crossover,Java,For Loop,Genetic Algorithm,Genetic Programming,Crossover,我已经为我的部分作业编写了一个统一的交叉算法,但它不能正常工作。事实上,它返回的结果比我的单点交叉更糟糕。我只想有人指出我哪里出了问题,这样我就可以解决它,请:)。我已经试了很久了,这是我最后的选择 private void DoUniformCrossOver(int p1id,int p2id) { ArrayList<Integer> p1 = population.get(p1id).GetRep(); ArrayList<Integer>

我已经为我的部分作业编写了一个统一的交叉算法,但它不能正常工作。事实上,它返回的结果比我的单点交叉更糟糕。我只想有人指出我哪里出了问题,这样我就可以解决它,请:)。我已经试了很久了,这是我最后的选择

    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));
}
private void DoUniformCrossOver(intp1id,intp2id)
{
ArrayList p1=填充.get(p1id).GetRep();
ArrayList p2=填充.get(p2id).GetRep();
ArrayList c1=新的ArrayList();
ArrayList c2=新的ArrayList();
对于(int i=0;i(由于您没有回复我的评论,我将重复它作为答案)

如果要将双精度浮点数字与常数进行比较,则使用
int selected
可能会更好,或者如果需要使用双精度浮点数字,请尝试使用以下方法:

if (selected < 1.5)
if(选择<1.5)

首先,你在编码什么样的信息,你想进化什么

根据你试图解决的问题,某些交叉策略会阻止你找到好的解决方案


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

因此,您正在生成两个列表,其中包含来自第一个或第二个源列表的元素。算法似乎正是这样做的,我看不出它与它试图做的匹配有任何问题。因此,我想问题是您的算法。您试图完成什么,以及/或为什么在您的估计中,这表现不佳。+1你的问题清楚,准备充分。是的。它生成了两个列表(孩子c1和c2),它们是父母(p1和p2)的组合.一个孩子有50%的几率从父母1得到第一个基因,有50%的几率从父母2得到第一个基因…我被告知要实现这个算法,它比单点交叉更有效,但我的单点交叉表现出色,但这并不!!:-S!解释为什么它不那么出色?当你只修改有一项,你将有更好的机会实现你的目标,因为这具有更可预测的爬山特性,然而,单点交叉方法永远不会逃脱解域中的局部极大值,这就是上面的算法将做得更好的地方。谢谢@Pete.Well@MeBigFatGuy我创建了一个适应度函数,越接近对于1,适应度函数越好。单点交叉几乎每次返回1的值,而这一次返回13 25 39 3等。输出中生成的值要大得多!嘿@rsp,对不起,我不会忽略你,我直到现在才看到你的评论。我尝试了你所说的,但没有成功!我已经到了o的结尾我现在有一个实验室!我周二有一个实验室,所以到时候我会问别人的!非常感谢:)@Tamara,你添加调试日志是为了看看这个方法的结果是什么吗?你会得到父母的随机混合吗?(你总是创建镜像孩子这一事实可能会产生意想不到的结果?)你好,我不熟悉调试日志记录?抱歉,我已经为孩子c1和c2以及父母p1和p2做了打印输出,而且算法似乎以这种方式正常工作。我只是觉得它应该返回更好的适应度结果,但它不是=(。