Java 字符串操作-GA
我的遗传算法的变异函数有问题(各种各样的问题)。我将字符串作为DNA进行操作,这些字符串来自Java 字符串操作-GA,java,artificial-intelligence,genetic-algorithm,Java,Artificial Intelligence,Genetic Algorithm,我的遗传算法的变异函数有问题(各种各样的问题)。我将字符串作为DNA进行操作,这些字符串来自Integer.toString(Float.floatToIntBits(value))。所有的生物都能很好地交叉繁殖,所以现在是时候进行一些令人讨厌的变异了。现在我有个问题,这是我的变异函数: public void muttate() { Random rand = new Random(); int mutationPoint = rand.nextInt(valueString.
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个左右)。它来自这个突变部分,而不是交叉(测试)。我觉得这是个愚蠢的错误,但我就是找不到线索
还有,这种突变对这种情况有效吗?也许我应该在应用掩码后操纵位,以到达浮点的某些部分。Mutate的拼写没有双精度
tt
。您的代码永远不会因为您调用random的方式而改变最后一个位置
问题是子字符串(开始,结束)
返回不包含结束索引字符的字符串。所以你失去了一个角色。整个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”
子字符串(1,2)
返回“B”
,索引1包含到索引2独占
子字符串(0,string.length())
返回整个字符串
子字符串(0)
返回整个字符串
子字符串(i,i)
返回“
如果子字符串在索引处开始(和结束)超过最后一个字符(在string.length()
index处),它也会返回“”
这使您可以轻松地处理角落案例,而不必像我在上面编写的代码中演示的那样使用if语句。是否缺少Else块中的“+valueString.substring(mutationPoint);”?谢谢,我将折射命名(特别是它必须是我的母语:))。我在处理所有的错误时都很紧张,所以这就是为什么manny ifs会这样。而且mutPos=0仍然有一个错误,但我可以处理它。嗯。。。。不应该是一个错误。对于mutPos=0,您应该得到:
子字符串(0,0)+int+子字符串(1)
,它应该解析为“”+int+除第一个字符以外的所有字符。这可能返回错误的唯一方法是如果字符串为null或长度为0。通过在循环中运行1000000次来测试它,没有抛出错误。错误来自我问题的第二部分,正如我通过艰苦的方式了解到的,在这个浮点数表示法中,更改0位置将使其成为非sens。但是,当然,您的代码很好,再次表示衷心的感谢!