Skip to content
Snippets Groups Projects
GeneticAlgorithm.java 7.71 KiB
Newer Older
  • Learn to ignore specific revisions
  • istkabra's avatar
    istkabra committed
    package MainClasses;
    
    
    istkabra's avatar
    istkabra committed
    import Enums.*;
    
    istkabra's avatar
    istkabra committed
    import Evaluators.EvaluatorNESW;
    
    istkabra's avatar
    istkabra committed
    import InitialGenerationCreators.Curl;
    
    istkabra's avatar
    istkabra committed
    import InitialGenerationCreators.RandomDirection;
    import InitialGenerationCreators.StraightLine;
    
    istkabra's avatar
    istkabra committed
    import Interfaces.*;
    
    istkabra's avatar
    istkabra committed
    import Mutators.Crossover;
    import Mutators.SinglePoint;
    
    istkabra's avatar
    istkabra committed
    import Selectors.FitnessProportional;
    
    istkabra's avatar
    istkabra committed
    import Selectors.OnlyBest;
    
    istkabra's avatar
    istkabra committed
    import Selectors.Tournament;
    
    istkabra's avatar
    istkabra committed
    import Visualization.Visualizers.VisualizerNESWtoConsole;
    import Visualization.Visualizers.VisualizerNESWtoFile;
    
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.nio.file.StandardOpenOption;
    import java.util.Random;
    
    public class GeneticAlgorithm {
    
    istkabra's avatar
    istkabra committed
        Random rand;
    
    istkabra's avatar
    istkabra committed
        Candidate[] population;
    
    
        double totalFitness;
        double[] fitness;
    
        double overallBestFitness;
    
    istkabra's avatar
    istkabra committed
        Candidate overallBest;
    
    istkabra's avatar
    istkabra committed
        InitialGenerationCreator initialGenCreator;
    
    istkabra's avatar
    istkabra committed
        Mutator[] mutators;
    
    istkabra's avatar
    istkabra committed
        Selector selector;
    
    istkabra's avatar
    istkabra committed
        Evaluator evaluator;
    
    istkabra's avatar
    istkabra committed
        Visualizer[] visualizers;
    
        // Initialize with protein
    
    istkabra's avatar
    istkabra committed
        public GeneticAlgorithm (int[] protein) {
    
            this.isHydrophobic =  protein;
    
    
    istkabra's avatar
    istkabra committed
            this.initializeSettings();
            this.clearLog();
    
    
            this.population = this.initialGenCreator.initializeDirections(Config.POPULATION_SIZE, this.isHydrophobic.length);
    
    istkabra's avatar
    istkabra committed
            this.totalFitness = 0;
            this.fitness = new double[Config.POPULATION_SIZE];
            this.overallBestFitness = 0;
        }
    
        private void initializeSettings() {
            if (Config.SEED != -1) {
                this.rand = new Random(Config.SEED);
            } else {
                this.rand = new Random();
            }
    
            // Settings that are dependant on encoding
            if (Config.ENCODING_VARIANT.equals("NESW")) {
                int nullCount = 0;
                for (int i = 0; i < Config.VISUALIZERS.length; i++) {
                    if (!Config.VISUALIZERS[i].equals(VisualizerMethods.Console)
                            && !Config.VISUALIZERS[i].equals(VisualizerMethods.Image)) {
                        nullCount++;
                    }
                }
                this.visualizers = new Visualizer[Config.VISUALIZERS.length - nullCount];
                int j = 0;
                for (VisualizerMethods vm : Config.VISUALIZERS) {
                    if (vm.equals(VisualizerMethods.Console)) {
    
                        this.visualizers[j] = new VisualizerNESWtoConsole(isHydrophobic);
    
    istkabra's avatar
    istkabra committed
                        j++;
                    } else if (vm.equals(VisualizerMethods.Image)) {
    
                        this.visualizers[j] = new VisualizerNESWtoFile(Config.IMAGE_SEQUENCE_PATH,isHydrophobic);
    
    istkabra's avatar
    istkabra committed
                        j++;
                    }
                }
    
                if (Config.INITIALIZATION_METHOD.equals(InitializationMethods.Curl)) {
                    this.initialGenCreator = new Curl<>(DirectionNESW.class);
                } else if (Config.INITIALIZATION_METHOD.equals(InitializationMethods.Straight)) {
                    this.initialGenCreator = new StraightLine();
                } else if (Config.INITIALIZATION_METHOD.equals(InitializationMethods.Random)) {
                    this.initialGenCreator = new RandomDirection<>(DirectionNESW.class, this.rand);
                }
    
                this.mutators = new Mutator[Config.MUTATOR_METHODS.length];
                for (int i = 0; i < Config.MUTATOR_METHODS.length; i++) {
                    if (Config.MUTATOR_METHODS[i].equals(MutatorMethods.SinglePoint)) {
                        this.mutators[i] = new SinglePoint<>(DirectionNESW.class, this.rand,
    
                                Config.MUTATION_ATTEMPTS_PER_CANDIDATE, Config.MUTATION_CHANCE, Config.MUTATION_MINIMAL_CHANCE, Config.MUTATION_MULTIPLIER);
    
    istkabra's avatar
    istkabra committed
                    } else if (Config.MUTATOR_METHODS[i].equals(MutatorMethods.Crossover)) {
                        this.mutators[i] = new Crossover<>(DirectionNESW.class, this.rand,
    
                                Config.CROSSOVER_ATTEMPTS_PER_CANDIDATE, Config.CROSSOVER_CHANCE, Config.MUTATION_MINIMAL_CHANCE, Config.CROSSOVER_MULTIPLIER);
    
                this.evaluator = new EvaluatorNESW(Config.POINTS_PER_BOND, isHydrophobic);
    
    istkabra's avatar
    istkabra committed
            } else {
                // TODO: initialization for FRL settings
            }
    
    istkabra's avatar
    istkabra committed
            if (Config.SELECTION_METHOD.equals(SelectionMethods.Proportional)) {
                this.selector = new FitnessProportional(this.rand, this.isHydrophobic);
            } else if (Config.SELECTION_METHOD.equals(SelectionMethods.Tournament)) {
                this.selector = new Tournament(this.rand, this.isHydrophobic, Config.K);
            } else if (Config.SELECTION_METHOD.equals(SelectionMethods.OnlyBest)) {
                this.selector = new OnlyBest(this.isHydrophobic);
            }
        }
    
    istkabra's avatar
    istkabra committed
        private void clearLog() {
    
            String content = "Generation\tAverage Fitness\tBest Fitness\tOverall Best Fitness\tBonds\tOverlaps\n";
    
    istkabra's avatar
    istkabra committed
                Files.write(Paths.get(Config.LOGFILE), content.getBytes());
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        public void simulateGenerations() {
    
    istkabra's avatar
    istkabra committed
            for (int gen = 0; gen < Config.TOTAL_GENERATIONS-1; gen++) {
    
    istkabra's avatar
    istkabra committed
                this.evaluateGeneration(gen);
                this.population = this.selector.selectNewPopulation(this.population, this.fitness, this.totalFitness);
    
    istkabra's avatar
    istkabra committed
                for (Mutator m : mutators) { // SinglePoint and Crossover at the moment
    
                    this.population = m.generateMutatedPopulation(this.population);
    
    istkabra's avatar
    istkabra committed
            evaluateGeneration(Config.TOTAL_GENERATIONS-1);
    
        }
    
        private int evaluateGeneration(int gen) {
            // Evaluate current generation
            System.out.println("Generation " + gen + ":");
    
            double bestFitness = 0;
            int bestIndex = 0;
    
    istkabra's avatar
    istkabra committed
            this.totalFitness = 0;
    
    istkabra's avatar
    istkabra committed
            for (int i = 0; i < Config.POPULATION_SIZE; i++) {
    
    istkabra's avatar
    istkabra committed
                this.fitness[i] = this.evaluator.evaluateFitness(this.population[i]);
    
    istkabra's avatar
    istkabra committed
                this.totalFitness += this.fitness[i];
    
    istkabra's avatar
    istkabra committed
                if (this.fitness[i] > bestFitness) {
                    bestFitness = this.fitness[i];
    
    istkabra's avatar
    istkabra committed
            for (Visualizer v : this.visualizers) {
    
    istkabra's avatar
    istkabra committed
                v.setFilename(String.format("gen_%d.png", gen));
    
                //TODO Print real bond and overlap amount
    
    Lennart Eichhorn's avatar
    Lennart Eichhorn committed
                v.drawProtein(this.population[bestIndex].getVertices(), bestFitness, -1, -1, gen);
    
            //TODO Print real bond and overlap amount
    
    istkabra's avatar
    istkabra committed
            System.out.println("The fitness is: " + bestFitness
    
                        + " [hydrophobicBonds = " + -1 + " | overlaps = " + -1 + "]");
    
    istkabra's avatar
    istkabra committed
            if (bestFitness >= this.overallBestFitness) {
                this.overallBestFitness = bestFitness;
    
    Lennart Eichhorn's avatar
    Lennart Eichhorn committed
                this.overallBest = new Candidate(this.population[bestIndex].getFolding());
    
    istkabra's avatar
    istkabra committed
            double averageFitness = this.totalFitness / Config.POPULATION_SIZE;
    
            String log = String.format("%d\t%.4f\t%.4f\t%.4f\t %d\t%d\n",
    
    istkabra's avatar
    istkabra committed
                    gen, averageFitness, bestFitness,
                    this.evaluator.evaluateFitness(overallBest),
    
    istkabra's avatar
    istkabra committed
                Files.write(Paths.get(Config.LOGFILE), log.getBytes(), StandardOpenOption.APPEND);
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return bestIndex;
        }
    
    istkabra's avatar
    istkabra committed
    
        public int getMaxH() {
    
    istkabra's avatar
    istkabra committed
            int maxHAcrossVisualiszators = 0;
            for (Visualizer v : visualizers) {
                if (maxHAcrossVisualiszators < v.getMaxH()) {
                    maxHAcrossVisualiszators = v.getMaxH();
                }
            }
            return maxHAcrossVisualiszators;
    
    istkabra's avatar
    istkabra committed
        }
    
        public int getMaxW() {
    
    istkabra's avatar
    istkabra committed
            int maxWAcrossVisualiszators = 0;
            for (Visualizer v : visualizers) {
                if (maxWAcrossVisualiszators < v.getMaxW()) {
                    maxWAcrossVisualiszators = v.getMaxW();
                }
            }
            return maxWAcrossVisualiszators;