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'、、、、、またはs += '0'、などs.concat("0")を使用してくださいStringBuilder

scasolはあなたのバイナリ文字列であると仮定しているので、それは空であり、ループ内の何もfor一度は呼び出されないので、LとRは両方とも0.0のままであり、最終的に0.0を返します。

于 2011-03-14T20:04:18.927 に答える
0

ランダムな文字列RandomBinaryStringは、「s」を出力するだけで、変更することはないため、関数の合計は「newString()」を返すのと同じです。

別の問題、「L = L +=0」は冗長です。L=0と同じです。常に。

'R = R + = 1'も冗長であり、R +=1と同じです。

于 2011-03-14T20:05:44.937 に答える
0

@DHall scasolコンストラクターのコード:

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 に答える