0

作为实验室的一部分,我有一个健身功能,并希望将其应用于一组“权重”(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

如果您想为整个班级编写代码,请告诉我。

非常感谢大家的时间。

米克。

4

3 回答 3

2

在我看来,您总是从中返回一个空白字符串RandomBinaryString()-您打印出一些数字,但实际上从未附加它们。使用s = s+'0', or s += '0', or s.concat("0"),or 使用StringBuilder, 等等...

我假设scasol是你的二进制字符串,所以它是空的,然后你的for循环中没有任何东西被调用一次,所以 L 和 R 都保持在 0.0,你最终返回 0.0。

于 2011-03-14T20:04:18.927 回答
0

您的随机字符串 RandomBinaryString 只打印 's' 它永远不会改变它,因此函数的总和等于返回 'new String()'。

另一个问题,“L = L += 0”是多余的。它与 L = 0 相同。总是。

'R = R+=1' 也是多余的,它与 R += 1 相同。

于 2011-03-14T20:05:44.937 回答
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);
    }
}

如果这没有帮助,我可以发布课程的代码。

谢谢。

米克。

于 2011-03-14T20:23:27.787 回答