字符串操作 - GA

时间:2014-04-17 07:44:32

标签: java artificial-intelligence genetic-algorithm

我遇到麻烦(各种不同的),我的遗传算法的突变功能。我操纵字符串作为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,这么长)。它来自这个突变部分,而不是交叉(测试)。我认为这是一种愚蠢的错误,但我找不到线索。

而且,这种突变甚至对这种情况有效吗?也许我应该在应用蒙版之后操纵位以获得浮动的某些部分。

1 个答案:

答案 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()

这使您可以轻松处理角落案例而无需上述代码中所示的句子。