将bool []增长为(特定线性方式!=>> ||<<)

时间:2014-07-20 13:03:40

标签: c#

我目前正在使用遗传算法,并试图改善我的突变。目前我正在使用一种相当随机的变异方式,我想实现一个线性的,可预测的基因座突变模型。

我的染色体表示为BitString类,它在内部使用flat bool []来存储这些locuses。根据我在染色体中编码的数据类型,基因座可以是n * 2位长。在这里给出一些上下文是我的变异方法:

internal static BitString Mutate(BitString chromosome, float mutationRate)
{
  var newChromosome = new BitString(chromosome);
  int locusLength = chromosome.LocusLength;
  int numLocuses = chromosome.Length / locusLength;

  float locusMutationRate = mutationRate * 0.25;

  for (int l = 0; l < numLocuses; l++)
  {
    bool[] oldLocus = chromosome[l * locusLength, locusLength];
    bool mutateThis = rnd.NextDouble() <= locusMutationRate;

    if (mutateThis)
    {
      bool[] newlocus = new bool[1]; // fail this one on purpose since !=n*2

      while (!BitString.IsValidLocus(newlocus, chromosome.Type, true))
      {
        newlocus = new bool[locusLength];

        int mutationIndex = rnd.Next(locusLength);

        for (int i = 0; i < locusLength; i++)
        {
          if (i == mutationIndex)
            newlocus[i] = !oldLocus[i];
          else
            newlocus[i] = oldLocus[i];
        }
      }

      newChromosome[l * locusLength, locusLength] = newlocus;
    }
  }

  return newChromosome;
}

正如你在这里看到的那样:

    int mutationIndex = rnd.Next(locusLength);
    for (int i = 0; i < locusLength; i++)
    {
      if (i == mutationIndex)
        newlocus[i] = !oldLocus[i];
      else
        newlocus[i] = oldLocus[i];
    }

突变是纯粹随机的

现在出于这个问题的目的,让我们假设我正在编码一个ASCII字符串,所以每个基因座都是bool [8]位。为了便于阅读,我将它们格式化为ints

oldLocus将是

bool[] {10000000}  

成长oldLocus应该给

bool[] {01000000}  

缩小oldLocus应该给出

bool[] {00000000}  

现在让我们说oldLocus是

bool[] {11100000}  

成长oldLocus应该给

bool[] {00010000}  

缩小oldLocus应该给出

bool[] {01100000}  

再次收缩应该给予

bool[] {10100000}  

再次缩小......

bool[] {00100000} 

再次

bool[] {11000000}

所以你看到我所追求的那种亲/重新。由于locuses可以是任何长度(n * 2),具体取决于dataType,编码我不能欺骗我使用字节或整数来增长/缩小它们。我也不应该认为locus在整个生命周期中永远不会改变它的长度,因为它总是编码相同的valueType。

我一直试图找到一个简单而高效的解决方案来解决这个问题,但却找不到任何东西,所以我可以使用一些帮助。 如果您需要更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

我无法通过使用字节或整数增加/缩小它们来欺骗我

如果您在System.Numerics中使用BigInteger结构怎么办?

http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx