以(特定的线性方式)将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。
我绞尽脑汁想找到一个简单而高效的解决方案来解决这个问题,但什么也想不出来,所以我需要一些帮助。
我不能通过使用字节或整数来增加/缩小它们来欺骗我的方式
如果在system . numeric中使用BigInteger结构会怎样?
http://msdn.microsoft.com/en-us/library/system.numerics.biginteger (v = vs.110) . aspx