Trying to work on a genetic algorithm here and I can't figure out why the same Array returns different results a few lines later.
This is the code:
Population(int PopulationSize, ArrayList<Vessel> vessels) {
this.PopulationSize = PopulationSize;
solutions = new ArrayList(PopulationSize);
for (int i = 0; i < PopulationSize; i++) {
Solution s = new Solution(vessels);
solutions.add(s);
System.out.println(i+" : "+solutions.get(i).getFitness());
}
for (int i = 0; i < solutions.size(); i++) {
System.out.println(solutions.get(i).getFitness());
}
}
Here's the output:
0 : 4432.4956
1 : 2673.922
2 : 5166.998
3 : 4396.5454
4 : 5687.8555
5 : 2907.695
6 : 5005.9937
7 : 3289.161
8 : 3302.1948
9 : 5193.338
5193.338
5193.338
5193.338
5193.338
5193.338
5193.338
5193.338
5193.338
5193.338
5193.338
More source code.`
Solution.java
package geneticalgorithm;
import static java.lang.Math.abs;
import java.util.ArrayList;
public class Solution {
ArrayList<Vessel> vessels;
public Solution(ArrayList<Vessel> vessels) {
this.vessels = new ArrayList<>(vessels);
generateSolution();
}
public void generateSolution() {
do {
for (Vessel vessel : vessels) {
vessel.generateParams();
}
} while(!isValid());
}
/* Getters */
public Vessel getIndividual(int index) {
return vessels.get(index);
}
// Save individual
public void saveIndividual(int index, Vessel v) {
vessels.set(index, v);
}
public float getFitness() {
float fitness = 0, BPCost = 0, CHDelay=0, CBDelay=0;
for (Vessel v : vessels) {
BPCost += v.DistancePenaltyCost*abs(v.X-v.LowestCostBerthing);
CHDelay += v.TimePenaltyCost*(abs(2*(v.Y + v.HandlingTime - v.SailingTime))/2);
CBDelay += v.BunkeringDelayCost*v.BunkeringNeeded*(abs(2*(v.BA+v.BunkeringProcessing-v.SailingTime))/2);
}
fitness = BPCost + CHDelay + CBDelay;
return fitness;
}
public boolean isValid() {
boolean XOverlaps, YOverlaps;
for (Vessel vTemp : vessels) {
for (Vessel v : vessels) {
// Initialization
XOverlaps = YOverlaps = false;
// Checking for X overlaps
if(v.X > vTemp.X && v.X < (vTemp.X + vTemp.Length))
XOverlaps = true;
// Checking for Y overlaps
if(v.Y >= vTemp.Y && v.Y <= (vTemp.Y + vTemp.HandlingTime))
YOverlaps = true;
// Breaking the loop
if(XOverlaps && YOverlaps)
return false;
}
}
return true;
}
}
Vessel.java
package geneticalgorithm;
import java.util.Random;
public class Vessel {
Float X,Y,BA;
Byte Z;
Float ETA;
Float Length;
Float LowestCostBerthing;
Float HandlingTime;
Float SailingTime;
Float DistancePenaltyCost;
Float TimePenaltyCost;
Float BunkeringDelayCost;
Byte BunkeringNeeded;
Float BunkeringProcessing;
void generateParams() {
Random rand = new Random();
Float MinBerth = 0.0f, MaxBerth = LowestCostBerthing + Length;
if(LowestCostBerthing - Length > 0)
MinBerth = LowestCostBerthing - Length;
if(MaxBerth > DataLoader.Quay)
MaxBerth = DataLoader.Quay - Length;
X = rand.nextFloat() * (MaxBerth - MinBerth) + MinBerth;
Y = rand.nextFloat() * ((ETA+24) - (ETA+1)) + (ETA+1);
if(BunkeringNeeded==1)
{
Z = (byte) Math.round(Math.random()); // 0 OR 1
if(Z!=0) {
BA = Y;
} else if(Y - ETA < BunkeringProcessing) {
BA = SailingTime;
} else if(Y - ETA > BunkeringProcessing) {
BA = ETA;
}
} else {
Z = 0;
BA = 0.0f;
}
}
}
Any ideas? Thanks!