Facebook
From Rude Crocodile, 7 Years ago, written in Java.
This paste is a reply to Untitled from Aqua Earthworm - go back
Embed
Viewing differences between Untitled and Re: Untitled
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 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;
        Random rand = new Random();
        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 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);
        }
    }
}