Java 字符串操作-GA

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.

我的遗传算法的变异函数有问题(各种各样的问题)。我将字符串作为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个左右)。它来自这个突变部分,而不是交叉(测试)。我觉得这是个愚蠢的错误,但我就是找不到线索


还有,这种突变对这种情况有效吗?也许我应该在应用掩码后操纵位,以到达浮点的某些部分。

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。但是,当然,您的代码很好,再次表示衷心的感谢!