以(特定的线性方式)将bool[]增加为位!= >>| | & lt; & lt)

本文关键字:lt 增加 线性 方式 bool | 更新日期: 2023-09-27 18:13:57

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

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

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]位。为了便于阅读,我将它们格式化为int

oldLocus将是

bool[] {10000000}  

growing oldLocus应该给予

bool[] {01000000}  

收缩oldLocus应该给出

bool[] {00000000}  

现在我们设oldLocus为

bool[] {11100000}  

growing oldLocus应该给予

bool[] {00010000}  

收缩oldLocus应该给出

bool[] {01100000}  

再次收缩应该得到

bool[] {10100000}  

再次缩小…

bool[] {00100000} 

bool[] {11000000}

所以你看到了我想要的那种递进/递进。由于locs可以是任何长度(n*2),这取决于编码的数据类型,我不能通过使用字节或整型来增加/缩小它们来欺骗我的方式。我也不应该说轨迹在整个生命周期中永远不会改变它的长度,因为它总是编码相同的valueType。

我绞尽脑汁想找到一个简单而高效的解决方案来解决这个问题,但什么也想不出来,所以我需要一些帮助。

以(特定的线性方式)将bool[]增加为位!= >>| | & lt; & lt)

我不能通过使用字节或整数来增加/缩小它们来欺骗我的方式

如果在system . numeric中使用BigInteger结构会怎样?

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