我目前正在使用遗传算法,并试图改善我的突变。目前我正在使用一种相当随机的变异方式,我想实现一个线性的,可预测的基因座突变模型。
我的染色体表示为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。
我一直试图找到一个简单而高效的解决方案来解决这个问题,但却找不到任何东西,所以我可以使用一些帮助。 如果您需要更多详细信息,请与我们联系。
答案 0 :(得分:0)
我无法通过使用字节或整数增加/缩小它们来欺骗我
如果您在System.Numerics中使用BigInteger结构怎么办?
http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx