Skip to content
Snippets Groups Projects
GeneticAlgorithm.java 8.19 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.text.SimpleDateFormat;
    import java.util.Date;
    
    import java.util.Random;
    
    public class GeneticAlgorithm {
    
    istkabra's avatar
    istkabra committed
        Random rand;
    
        Config config;
    
    
        int[] isHydrophobic;
    
    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;
    
        String jobName;
    
    
        // Initialize with protein
    
        public GeneticAlgorithm (int[] protein, Config config) {
    
            this.isHydrophobic =  protein;
    
            this.config = config;
    
    istkabra's avatar
    istkabra committed
            this.initializeSettings();
            this.clearLog();
    
    
            this.population = this.initialGenCreator.initializeDirections(config.getPopulationSize(), this.isHydrophobic.length);
    
    istkabra's avatar
    istkabra committed
            this.totalFitness = 0;
    
            this.fitness = new double[config.getPopulationSize()];
    
    istkabra's avatar
    istkabra committed
            this.overallBestFitness = 0;
    
    
            //TODO Maybe specify jobName in config
            SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyyHHmmss");
            Date date = new Date();
            jobName = formatter.format(date);
    
    istkabra's avatar
    istkabra committed
        }
    
        private void initializeSettings() {
    
            if (config.getSeed() != -1) {
                this.rand = new Random(config.getSeed());
    
    istkabra's avatar
    istkabra committed
            } else {
                this.rand = new Random();
            }
    
            // Settings that are dependant on encoding
    
            if (config.getEncodingVariant().equals("NESW")) {
    
    istkabra's avatar
    istkabra committed
                int nullCount = 0;
    
                for (int i = 0; i < config.getVisualizers().length; i++) {
                    if (!config.getVisualizers()[i].equals(VisualizerMethods.Console)
                            && !config.getVisualizers()[i].equals(VisualizerMethods.Image)) {
    
    istkabra's avatar
    istkabra committed
                        nullCount++;
                    }
                }
    
                this.visualizers = new Visualizer[config.getVisualizers().length - nullCount];
    
    istkabra's avatar
    istkabra committed
                int j = 0;
    
                for (VisualizerMethods vm : config.getVisualizers()) {
    
    istkabra's avatar
    istkabra committed
                    if (vm.equals(VisualizerMethods.Console)) {
    
                        this.visualizers[j] = new VisualizerNESWtoConsole(isHydrophobic, config);
    
    istkabra's avatar
    istkabra committed
                        j++;
                    } else if (vm.equals(VisualizerMethods.Image)) {
    
                        this.visualizers[j] = new VisualizerNESWtoFile(isHydrophobic, config);
    
                if (config.getInitializationMethod().equals(InitializationMethods.Curl)) {
    
    istkabra's avatar
    istkabra committed
                    this.initialGenCreator = new Curl<>(DirectionNESW.class);
    
                } else if (config.getInitializationMethod().equals(InitializationMethods.Straight)) {
    
    istkabra's avatar
    istkabra committed
                    this.initialGenCreator = new StraightLine();
    
                } else if (config.getInitializationMethod().equals(InitializationMethods.Random)) {
    
    istkabra's avatar
    istkabra committed
                    this.initialGenCreator = new RandomDirection<>(DirectionNESW.class, this.rand);
                }
    
    
                this.mutators = new Mutator[config.getMutatorMethods().length];
                for (int i = 0; i < config.getMutatorMethods().length; i++) {
                    if (config.getMutatorMethods()[i].equals(MutatorMethods.SinglePoint)) {
    
    istkabra's avatar
    istkabra committed
                        this.mutators[i] = new SinglePoint<>(DirectionNESW.class, this.rand,
    
                                config.getMutationAttemptsPerCandidate(), config.getMutationChance(), config.getMutationMinimalChance(), config.getMutationMultiplier());
    
                    } else if (config.getMutatorMethods()[i].equals(MutatorMethods.Crossover)) {
    
    istkabra's avatar
    istkabra committed
                        this.mutators[i] = new Crossover<>(DirectionNESW.class, this.rand,
    
                                config.getCrossoverAttemptsPerCandidate(), config.getCrossoverChance(), config.getCrossoverMinimalChance(), config.getCrossoverMultiplier());
    
                this.evaluator = new EvaluatorNESW(config.getPointsPerBond(), isHydrophobic);
    
    istkabra's avatar
    istkabra committed
            } else {
                // TODO: initialization for FRL settings
            }
    
            if (config.getSelectionMethod().equals(SelectionMethods.Proportional)) {
    
    istkabra's avatar
    istkabra committed
                this.selector = new FitnessProportional(this.rand, this.isHydrophobic);
    
            } else if (config.getSelectionMethod().equals(SelectionMethods.Tournament)) {
                this.selector = new Tournament(this.rand, this.isHydrophobic, config.getK());
            } else if (config.getSelectionMethod().equals(SelectionMethods.OnlyBest)) {
    
    istkabra's avatar
    istkabra committed
                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";
    
                Files.write(Paths.get(config.getLogfile()), content.getBytes());
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        public void simulateGenerations() {
    
            for (int gen = 0; gen < config.getTotalGenerations()-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);
    
            evaluateGeneration(config.getTotalGenerations()-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;
    
            for (int i = 0; i < config.getPopulationSize(); 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) {
    
                v.setFilename(String.format("%s_gen_%d.png", jobName, 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());
    
            double averageFitness = this.totalFitness / config.getPopulationSize();
    
            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),
    
                Files.write(Paths.get(config.getLogfile()), 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;