0

简而言之,我该怎么做:

  • 从头到尾double
  • 然后做交叉(一点,两点),
  • 然后回到double

我可以开发轮盘赌选择。我看不清楚的是混合两个双打如何给我一个“更好”的双打。这是完全随机的吗?如果我的“最适者”doubles和我的“最弱者”结合起来,他们不会产生一个中点double吗?

详细说明: 从一点到这条曲线的最短距离

编辑 1:不减慢程序太多

编辑 2:我考虑使用 a byte[],但我不知道这是否会违背遗传算法部分。

4

3 回答 3

1

这对我有用:

BitArray BAA1 = new BitArray(BitConverter.GetBytes(a1));
BitArray BAA2 = new BitArray(BitConverter.GetBytes(a2));

    for (int i = r.Next(0, 64); i > 0; i--)
            {
                temp = BAA1.Get(i);
                temp2 = BAA2.Get(i);

                BAA1.Set(i, temp2);
                BAA2.Set(i, temp);


                temp = BAB1.Get(i);
                temp2 = BAB2.Get(i);

                BAB1.Set(i, temp2);
                BAB2.Set(i, temp);
            }

        byte[] tempbytes = new byte[BAA1.Length];

        BAA1.CopyTo(tempbytes, 0);
        double baa1 = BitConverter.ToDouble(tempbytes, 0);

        BAA2.CopyTo(tempbytes, 0);
        double baa2 = BitConverter.ToDouble(tempbytes, 0);

baa1 和 baa2 是十字架的最终产物。

于 2013-02-01T04:15:24.927 回答
1

这里最好的方法确实取决于双重“意味着”什么以及每个双重代表的基因组部分有多大。通常,最好的方法是将双打视为离散的,并一次跨越整个双打。

所以,如果你的父母是 {0.1 0.2 0.3 0.4 0.5} 和 {0.6 0.7 0.8 0.9 1.0} 那么他们可能会产生(例子):

  • {0.1 0.6 0.3 0.4 0.5} 在统一选择下(从随机父母中选择每个基因)
  • 单点交叉下的{0.1 0.2 0.3 0.9 1.0}(从一个亲本中获取前n个基因,从另一个亲本中获取其余基因,其中n是随机数
  • 两点交叉下的{0.1 0.7 0.8 0.4 0.5}(选择两个随机数并将它们之间的基因从一个亲本插入另一个)
于 2013-01-31T12:42:15.197 回答
-1

我认为执行稍微不同的双打交叉可能会更好,例如。如果你有1.02.0,为什么不:

  1. 取中间,(1.0 + 2.0) / 2 = 1.5
  2. 添加一个小突变,1.5 * random(0.9, 1.0) = 1.57

混合两个双打的位可能会产生一个与两个父母中的任何一个都不同的孩子双打。

于 2013-01-27T22:56:41.603 回答