Reputation: 7530
I have a fitness function as part of a lab and wish to apply it to a set of 'weights' (ArrayList weights). I have created the array and stored some values in it. I have created random binary strings (which have an 'x' at the end in order to generate random values) which I wish to also apply the fitness function to; however, the problem I am having is that the fitness function always returns a value of 0. Am I missing something here?
The fitness function is as follows:
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);
}
Random binary string method:
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);
}
Main method (in separate class):
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));
}
Once run, the random binary strings work perfectly well, yet the fitness function fails to change from 0. Here is a sample output:
1101100
1100111
0001111
1001010
1110000
0011111
1100111
1011001
0000110
1000000
Fitness: 0.0
If you wish to code for the whole class(es), then please let me know.
Thank you all so much for your time.
Mick.
Upvotes: 0
Views: 895
Reputation: 7530
@DHall Code for scasol constructor:
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);
}
}
If this is not of help I can post the code for the class up.
Thanks.
Mick.
Upvotes: 0
Reputation: 393
Looks to me like you're always returning a blank String from RandomBinaryString()
- you print out some digits but never actually append them. Use s = s+'0'
, or s += '0'
, or s.concat("0")
,or use a StringBuilder
, etc...
I'm assuming scasol
is your binary string, so that's empty, then nothing in your for
loop gets called once, so L and R both stay at 0.0, and you wind up returning 0.0.
Upvotes: 2
Reputation: 1680
Your random string RandomBinaryString only ever prints 's' it never alters it so the sum of the function is equivalent to returning 'new String()'.
Another issue, 'L = L += 0' is redundant. It is the same as L = 0. Always.
'R = R+=1' is also redundant, it is the same as R += 1.
Upvotes: 0