#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);
вызова, поэтому неудивительно, что он ничего не напечатает.