我有一个健身功能作为实验室的一部分,并希望将它应用于一组重量' (ArrayList权重)。我创建了数组并在其中存储了一些值。我已经创建了随机二进制字符串(最后有一个' x'以便生成随机值),我希望也应用健身函数;但是,我遇到的问题是,适应度函数总是返回值0.我在这里遗漏了什么吗?
适应度函数如下:
public static double scalesFitness(ArrayList<Double> weights){
if (scasol.length() > weights.size()) return(-1);
double lhs = 0.0,rhs = 0.0;
double L = 0.0;
double R = 0.0;
for(int i = 0; i < scasol.length(); i++){
if(scasol.charAt(i) == '0'){
L = L += 0;
}
else if(scasol.charAt(i) == '1'){
R = R += 1;
}
}//end for
int n = scasol.length();
return(L-R);
}
随机二进制字符串方法:
private static String RandomBinaryString(int n){
String s = new String();
for(int i = 0; i <= n; i++){
int y = CS2004.UI(0,1);
if(y == 0){
System.out.print(s + '0');
}
else if(y == 1){
System.out.print(s + '1');
}
}
return(s);
}
主要方法(在单独的课程中):
public static void main(String args[]){
for(int i = 0; i < 10; i++){
ScalesSolution s = new ScalesSolution("10101x");
s.println();
}
ArrayList<Double> weights = new ArrayList<Double>();
weights.add(1.0);
weights.add(2.0);
weights.add(3.0);
weights.add(4.0);
weights.add(10.0);
System.out.println();
System.out.print("Fitness: ");
System.out.print(ScalesSolution.scalesFitness(weights));
}
一旦运行,随机二进制字符串就可以很好地工作,但是适应度函数无法从0变化。这是一个示例输出:
1101100
1100111
0001111
1001010
1110000
0011111
1100111
1011001
0000110
1000000
Fitness: 0.0
如果您希望为全班编写代码,请告知我们。
非常感谢您的时间。
米克。
答案 0 :(得分:2)
在我看来,你总是从RandomBinaryString()
返回一个空字符串 - 你打印出一些数字,但实际上并没有附加它们。使用s = s+'0'
,s += '0'
或s.concat("0")
,或使用StringBuilder
等...
我假设scasol
是你的二进制字符串,所以它是空的,那么for
循环中的任何内容都不会被调用一次,所以L和R都保持在0.0,你最终返回0.0
答案 1 :(得分:0)
你的随机字符串RandomBinaryString只打印's'它永远不会改变它所以函数的总和相当于返回'new String()'。
另一个问题,'L = L + = 0'是多余的。它与L = 0相同。总是。
'R = R + = 1'也是多余的,它与R + = 1相同。
答案 2 :(得分:0)
scasol构造函数的@DHall代码:
public ScalesSolution(String s)
{
boolean ok = true;
int n = s.length();
for(int i=0;i<n;++i)
{
char si = s.charAt(i);
if (si != '0' && si != '1') ok = false;
}
if (ok)
{
scasol = s;
}
else
{
scasol = RandomBinaryString(n);
}
}
如果这没有帮助,我可以发布课程的代码。
感谢。
米克。