0

コードで適応度関数を機能させるのに問題があります。最終的には、バイナリ文字列「10101」だけになります。

私はこれに非常に長い時間を費やし、どこにも行かなかったので、誰かが私を助けてくれれば幸いです。

コードは次のとおりです。

public class Fitness{

public static void main(String args[]){

    ScalesSolution s = new ScalesSolution("10101");
    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(5.0);
        weights.add(6.0);
        weights.add(7.0);
        weights.add(17.0);
        weights.add(117.0);
        weights.add(3427.0);
        weights.add(5437.0);
        weights.add(567.0);
        weights.add(7567.0);

    ScalesSolution.scalesFitness(weights);
    System.out.println();

    }
}

適応度関数は次のとおりです。

public class ScalesSolution{

    private static String scasol;
//Creates a new scales solution based on a string parameter
//The string parameter is checked to see if it contains all zeros and ones
//Otherwise the random binary string generator is used (n = length of parameter)
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);
    }
}
private static String RandomBinaryString(int n)
{
    String s = new String();

    for(int i = 0; i < s.length(); i++){
        CS2004.UI(0,1);
            if(i == 0){
                System.out.println(s + "0");
            }
            else if(i == 1){
                System.out.println(s + "1");
            }
    }

    return(s);
}
public ScalesSolution(int n) 
{
    scasol = RandomBinaryString(n); 
}
//This is the fitness function for the Scales problem
//This function returns -1 if the number of weights is less than
//the size of the current solution



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(i == 0){
            L = L += i;
        }
        if(i == 1){
            R = R += i;
        }
    }//end for

    int n = scasol.length();

    return(L-R);

    //return(Math.abs(lhs-rhs));

}
//Display the string without a new line
public void print()
{
    System.out.print(scasol);
}
//Display the string with a new line
public void println()
{
    print();
    System.out.println();
}
}

プログラムを実行すると、出力は次のようになります。

10101

ArrayListの値に何を入力しても、これ以上何もありません...

私は何時間も頭を悩ませてきましたが、それでもなおです-どんな助けでも大歓迎です!

どうもありがとう。

ミック。

編集:コードが更新され、完全なクラスが一覧表示されます-混乱をお詫びします。

4

4 に答える 4

2

このコードがどのように機能するかは正確にはわかりませんが、疑わしいと思われる部分は次のとおりです。

for(int i = 0; i < scasol.length(); i++){
        if(i == 0){
        L = L += i;
    }
    if(i == 1){
        R = R += i;
    }
    }//end for

scasolの値を調べることはありません。あなたはすべきですか?すなわちのようなもの

for(int i = 0; i < scasol.length(); i++){
            if(scasol.getCharAt(i) == '0'){
            L = L += 0;
        }
        else if(scasol.getCharAt(i) == '1'){
            R = R += 1;
        }
        }//end for

今書いたように、あなたはそのインデックスの値ではなく、反復インデックスを比較しています。

他の人が言及した他の問題は、結果を印刷しないことです。

ScalesSolution.scalesFitness(weights);
System.out.println();

する必要があります:

 double fitness = ScalesSolution.scalesFitness(weights);
System.out.println(fitness);
于 2011-03-14T11:39:22.350 に答える
1

私はあなたの問題は空にあると思いますSystem.out.println();。私は次を試してみます:

double returnedValue= ScalesSolution.scalesFitness(weights);
System.out.println(returnedValue);

戻り値を変数に格納してから、この変数を値を使用するメソッドに渡す必要があります(この場合、printlnメソッドを介してコンソールの標準出力に出力します)。

于 2011-03-14T11:42:13.000 に答える
0

そのコードは完全ですか?

最初にあなたは電話します

ScalesSolution s = new ScalesSolution("10101");
s.println();

コンストラクターまたはメソッドs.prinln();が見つかりません。

しかし、入力文字列を出力しているように見えます-バイナリのものではありません

于 2011-03-14T11:39:46.670 に答える
0

ScalesSolution.scalesFitness(weights);あなたはどこにもあなたの呼び出しの結果を使用したり印刷したりしていないので、それが何も印刷しないのも不思議ではありません。

于 2011-03-14T11:40:17.223 に答える