我遇到麻烦(各种不同的),我的遗传算法的突变功能。我操纵字符串作为DNA,来自Integer.toString(Float.floatToIntBits(value))
。一切都很好地交叉,并且重新填充,所以现在是一些令人讨厌的突变的时间。现在我有一个问题,这是我的突变功能:
public void muttate() {
Random rand = new Random();
int mutationPoint = rand.nextInt(valueString.length()-1);
//int mutationPoint=valueString.length()-1;
//System.out.println(mutationPoint);
if(mutationPoint==0)
valueString = rand.nextInt(10)
+ valueString.substring(0);
else if (mutationPoint == 1)
valueString = valueString.charAt(0)
+ Integer.toString(rand.nextInt(10))
+ valueString.substring(mutationPoint);
else if (mutationPoint != valueString.length()-1)
valueString = valueString.substring(0, mutationPoint-1)
+ Integer.toString(rand.nextInt(10))
+ valueString.substring(mutationPoint);
else
valueString = valueString.substring(0, mutationPoint - 1)
+ Integer.toString(rand.nextInt(10));
changeStringtovalue();
calculateFitnes();
}
当我运行它时,我看到它吃掉了我的DNA(所以长度是9,然后是一段时间后8,这么长)。它来自这个突变部分,而不是交叉(测试)。我认为这是一种愚蠢的错误,但我找不到线索。
而且,这种突变甚至对这种情况有效吗?也许我应该在应用蒙版之后操纵位以获得浮动的某些部分。
答案 0 :(得分:2)
Mutate的拼写没有双tt
。由于你随机调用的方式,你的代码永远不会改变最后的位置。
问题是substring(start, end)
返回不包含结束索引字符的字符串。所以你失去了一个角色。整个if块也是不需要的。
如果你想改变,你可以写一个这样的函数:
public void mutate() {
Random rand = new Random();
int mutPos = rand.nextInt(valueString.length());
valueString = valueString.substring(0, mutPos)
+ rand.nextInt(10) + valueString.substring(mutPos+1);
}
以下是一些提示:
给定字符串"ABC"
。
substring(1,2)
返回"B"
,索引1包含索引2独占。
substring(0, string.length())
返回整个字符串。
substring(0)
返回整个字符串。
substring(i, i)
返回""
如果子串在最后一个字符(""
索引处的索引一处开始(并结束),则子串也返回string.length()
。
这使您可以轻松处理角落案例而无需上述代码中所示的句子。