I am having trouble getting the fitness function to work on my code. All that I end up with is the binary String "10101".
I would greatly appreciate it if somebody could assist me as I have spent an extremely long time on this and not gotten anywhere.
Here is the code:
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();
}
}
The fitness function is as follows:
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();
}
}
When I run the program, the output is as follows:
10101
There is nothing more, no matter what I enter for values of the ArrayList...
I have been racking my brain for hours and am still nonethewiser - any help would be greatly appreciated!
Thank you so much.
Mick.
EDIT: The code has now been updated and the complete class is listed - apologies for any confusion.
I don't know exactly how this code is supposed to work, but one piece that looks suspicious to me is the following:
for(int i = 0; i < scasol.length(); i++){
if(i == 0){
L = L += i;
}
if(i == 1){
R = R += i;
}
}//end for
You never examine any of the values in scasol; should you be? i.e. something like
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
The way you have written now, you're comparing the iteration index rather than the value at that index.
The other problem as others mentioned is you don't print the result:
ScalesSolution.scalesFitness(weights);
System.out.println();
should be:
double fitness = ScalesSolution.scalesFitness(weights);
System.out.println(fitness);