gpt4 book ai didi

java - 字符串操作 - GA

转载 作者:行者123 更新时间:2023-12-02 05:55:32 24 4
gpt4 key购买 nike

我的遗传算法的突变函数遇到了麻烦(各种不同的麻烦)。我将字符串作为 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,如此长)。它来自这个突变部分,而不是交叉(经过测试)。我认为这是某种愚蠢的错误,但我就是找不到线索。

而且,这种突变对于这种情况是否有效?也许我应该在应用掩码后操纵位来到达该 float 的某些部分。

最佳答案

Mutate 的拼写不带双 tt。由于您调用 random 的方式,您的代码永远不会改变最后一个位置。

问题是 substring(start, end) 返回一个不包含结束索引字符的字符串。所以你失去了一个角色。整个 if block 也是不需要的。如果您尝试进行变异,您可以编写如下函数:

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() 索引处)开始(和结束),它也会返回 ""

这使您可以轻松处理极端情况,而无需 if 语句,如我上面编写的代码所示。

关于java - 字符串操作 - GA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23127386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com