Функция пригодности Java

#java #function #fitness

#java #функция #Фитнес

Вопрос:

У меня возникли проблемы с получением функции пригодности для работы в моем коде. Все, что у меня в итоге получается, это двоичная строка «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' amp;amp; 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 …

Я часами ломал голову, но все еще не переборщил — любая помощь была бы с благодарностью!

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

Мик.

РЕДАКТИРОВАТЬ: теперь код обновлен, и полный класс приведен в списке — приносим извинения за любую путаницу.

Комментарии:

1. Я не разбираю k это весь код, поскольку единственным результатом являются два пустых println, а результат scalesFitness не используется

2. Этот код не будет компилироваться.

3. Да, в коде есть несколько пробелов: т. Е. конструктор ScalesSolution, который принимает строку, метод ScalesSolution.println()…

4. Я предлагаю вам сократить свой код до того, что вы можете скомпилировать, а затем отладить с помощью отладчика. Ваша randomombinarystring выглядит как случайно сгенерированный код, он не делает ничего подобного тому, что предлагает. 😉

5. @Mick: Я должен признать, что это было понятнее в вашей предыдущей «сокращенной» версии.

Ответ №1:

Я не знаю точно, как должен работать этот код, но одна часть, которая кажется мне подозрительной, заключается в следующем:

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

Комментарии:

1. Большое вам спасибо; однако всякий раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке «Метод get(int) не определен для типа String».

2. @Mick обновлено, извините, думал, что это список массивов, а не строка.

3. Это фантастика, спасибо! Всякий раз, когда я запускаю программу, я обнаруживаю, что выходные данные вычисляют, сколько существует единиц и 0, и выдают результат между -5 (где все значения = 1) и 0 (где все значения = 0). Как вы сказали, это зависит от того, верен ли другой алгоритм. Я ввел алгоритм из следующих спецификаций: «Для каждого возможного места в строке (их n) вы генерируете CS2004.UI (0,1). Это случайным образом сгенерирует ноль или единицу. Если вы получаете ноль, добавьте символ ‘0’ в конец строки, в противном случае добавьте ‘1’. Вам нужно будет использовать цикл For.» Что вы об этом думаете?

Ответ №2:

Я думаю, что ваша проблема в пустом System.out.println(); . Я бы попробовал следующий:

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

Вам нужно сохранить возвращаемое значение в переменной, а затем передать эту переменную в методы, в которых вы хотите использовать это значение (в данном случае, напечатав его в выводе состояния консоли с помощью println метода).

Комментарии:

1. По крайней мере, в отношении того, почему он всегда получает один и тот же результат. Правильный ли другой алгоритм — это другой вопрос

Ответ №3:

завершен ли этот код??

в начале вы вызываете

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

и я не могу найти конструктор или метод s.prinln();

но похоже, что вы печатаете свою входную строку, а не какую-либо двоичную вещь

Ответ №4:

Вы нигде не используете и даже не печатаете результат своего ScalesSolution.scalesFitness(weights); вызова, поэтому неудивительно, что он ничего не напечатает.