Функция Java Fitness не работает - PullRequest
0 голосов
/ 14 марта 2011

У меня есть фитнес-функция как часть лаборатории, и я хочу применить ее к набору «весов» (весов 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

Если вы хотите написать код для всего класса (классов), пожалуйста, дайте мне знать.

Большое вам спасибо за ваше время.

Мик.

Ответы [ 3 ]

2 голосов
/ 14 марта 2011

Похоже, вы всегда возвращаете пустую строку из RandomBinaryString() - вы распечатываете некоторые цифры, но фактически не добавляете их. Используйте s = s+'0', или s += '0', или s.concat("0"), или используйте StringBuilder и т. Д. *

Я предполагаю, что scasol - это ваша двоичная строка, так что она пустая, тогда ничего в вашем цикле for не вызывается один раз, так что L и R оба остаются равными 0,0, и вы возвращаете 0.0.

0 голосов
/ 14 марта 2011

@ 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);
    }
}

Если это не поможет, я могу выложить код для класса вверх.

Спасибо.

Мик.

0 голосов
/ 14 марта 2011

Ваша случайная строка RandomBinaryString только печатает 's', она никогда не изменяет ее, поэтому сумма функции эквивалентна возвращению 'new String ()'.

Другая проблема, 'L = L + = 0', является избыточной. Это то же самое, что L = 0. Всегда.

'R = R + = 1' также является избыточным, то же самое, что и R + = 1.

...