如何在GA实现中执行双数交叉?

时间:2013-01-27 22:43:27

标签: c# bit-manipulation genetic-algorithm mutation

简而言之,我该怎么做:

  • double转到位,
  • 然后进行交叉(一点,两点),
  • 并返回double

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

详细说明: Shortest distance from a point to this curve

编辑1:不会减慢程序太多

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

3 个答案:

答案 0 :(得分: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}在两点交叉下(选择两个随机数并将它们之间的基因从一个父母插入另一个)

答案 1 :(得分: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是十字架的最终产品。

答案 2 :(得分:0)

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

  1. 取中间,(1.0 + 2.0)/ 2 = 1.5
  2. 添加一个小突变, 1.5 *随机(0.9,1.0)= 1.57
  3. 混合两个双打的比特可以产生一个与父母双方都不同的儿童双倍。