Search code examples
javafunctionfitness

Java Fitness Function


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.


Solution

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