import msrcpsp.evaluation.DurationEvaluator;
import msrcpsp.io.MSRCPSPIO;
import msrcpsp.scheduling.BaseIndividual;
import msrcpsp.scheduling.Resource;
import msrcpsp.scheduling.Schedule;
import msrcpsp.scheduling.Task;
import msrcpsp.scheduling.greedy.Greedy;
import java.util.List;
import java.util.Random;
/**
* Created by Glizda on 19.03.2017.
*/
public class Population {
BaseIndividual[] population;
double crossProb;
double mutProb;
int diver;
int size;
public Population(int size, double crossProb, double mutProb, int diver)
{
this.diver = diver;
population = new BaseIndividual[size];
this.crossProb = crossProb;
this.mutProb = mutProb;
this.size = size;
}
public void initialize
(String definitionFile
)
{
int i = 0;
while(i < size)
{
MSRCPSPIO reader = new MSRCPSPIO();
Schedule sch = reader.readDefinition(definitionFile);
sch = schedule(sch);
DurationEvaluator durEv = new DurationEvaluator(sch);
BaseIndividual b = new BaseIndividual(sch, durEv);
population[i] = b;
setDuration(population[i]);
i++;
}
//System.out.println("Jestem w initialize");
//printPop();
}
public void printPop()
{
int i = 0;
for(BaseIndividual b : population)
{
System.
out.
println(i
++ + ". " + b
);
}
}
public void setDuration(BaseIndividual bi)
{
Greedy greedy = new Greedy(bi.getSchedule().getSuccesors());
greedy.buildTimestamps(bi.getSchedule());
bi.setDurationAndCost();
}
public Schedule schedule(Schedule schedule)
{
for(Task task : schedule.getTasks())
{
List<Resource> capRes = schedule.getCapableResources(task);
Resource r
= capRes.
get((int)(Math.
random() * 100) % capRes.
size());
task.setResourceId(r.getId());
}
return schedule;
}
public BaseIndividual select()
{
BaseIndividual[] temp = new BaseIndividual[diver];
int min;
int ind = 0;
if(diver <= population.length)
{
for(int i = 0; i < diver; i++)
{
int j = rand.nextInt(population.length);
temp[i] = population[j];
}
System.
out.
print("To ten skurwiel ");
System.
out.
println(min
= temp
[0].
getDuration());
System.
out.
println("Jestem w select");
printPop();
for(int k = 0; k < diver; k++)
{
if(temp[k].getDuration() < min)
{
min = temp[k].getDuration();
ind = k;
}
}
}
return temp[ind];
}
public BaseIndividual[] crossOver(BaseIndividual selected, BaseIndividual selected2)
{
boolean done = false;
double d
= Math.
random();
int tasksLength = selected.getSchedule().getTasks().length;
if(d < crossProb - 0.01)
{
done = true;
Task temp;
int mutInd
= (int)(Math.
random() * 100) % tasksLength
;
for(int i = mutInd; i < tasksLength; i++)
{
temp = selected.getSchedule().getTasks()[i];
selected.getSchedule().getTasks()[i] = selected2.getSchedule().getTasks()[i];
selected2.getSchedule().getTasks()[i] = temp;
}
}
return done ? new BaseIndividual[] {selected, selected2} : new BaseIndividual[] {selected};
}
public BaseIndividual mutate(BaseIndividual one)
{
int len = one.getSchedule().getTasks().length;
for(int i = 0; i < len; i++)
{
if(Math.
random() < mutProb
)
{
Task task = one.getSchedule().getTasks()[i];
List<Resource> capRes = one.getSchedule().getCapableResources(task);
Resource r
= capRes.
get((int)(Math.
random() * 100) % capRes.
size());
task.setResourceId(r.getId());
}
}
setDuration(one);
return one;
}
public Population evolve(Population ini)
{
Population fin = new Population(ini.size, crossProb, mutProb, diver);
for(int finLen = 0; finLen < ini.size; finLen++)
{
BaseIndividual bi1 = ini.select();
setDuration(bi1);
System.
out.
println(bi1.
getDuration() + "bi1");
BaseIndividual bi2 = ini.select();
setDuration(bi2);
System.
out.
println(bi2.
getDuration() + "bi2");
BaseIndividual[] crossed = crossOver(bi1, bi2);
//System.out.println("Jestem w evolve po crossie");
//printPop();
for(int j = 0; j < crossed.length; j++)
{
BaseIndividual b = mutate(crossed[j]);
fin.population[finLen] = b;
if(j > 0)
finLen++;
}
//System.out.println("Jestem w evolve po mutate");
//printPop();
}
return fin;
}
public void evolution(int gen)
{
Population p = this;
for(int i = 0; i < gen; i++)
{
System.
out.
println("Populacja nr " + i
);
p = evolve(p);
int j = 0;
for(BaseIndividual b : population)
{
if(b == null)
j++;
}
System.
out.
println("Liczba nulli po generacji: " + j
);
}
}
}