Skip to content
Snippets Groups Projects
GeneticAlgorithm.java 6.85 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;
    
    import Visualization.Visualizers.BestFoldingToConsole;
    import Visualization.Visualizers.BestFoldingToImage;
    
    import Visualization.Visualizers.BestFoldingsToVideo;
    
    import Visualization.Visualizers.GenerationOverviewToConsole;
    
    import Visualization.Visualizers.GenerationProgressToLog;
    
    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;
    
        Config config;
    
    
        //TODO Make private again when the Generation class is created
        public int[] isHydrophobic;
        public Candidate[] population;
    
        public double totalFitness;
        public double[] fitness;
    
        public double overallBestFitness;
        public Candidate overallBest;
    
        public InitialGenerationCreator initialGenCreator;
        public Mutator[] mutators;
        public Selector selector;
        public Evaluator evaluator;
        public Visualizer[] visualizers;
    
        //TODO Remove again with the new Generation class
        public int generation;
    
        // Initialize with protein
    
        public GeneticAlgorithm (int[] protein, Config config) {
    
            this.isHydrophobic =  protein;
    
            this.config = config;
    
    istkabra's avatar
    istkabra committed
            this.initializeSettings();
    
    
            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;
    
            this.generation = 0;
    
    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")) {
    
                this.visualizers = new Visualizer[config.getVisualizers().length];
    
    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 BestFoldingToConsole(isHydrophobic, config);
    
    istkabra's avatar
    istkabra committed
                        j++;
                    } else if (vm.equals(VisualizerMethods.Image)) {
    
                        this.visualizers[j] = new BestFoldingToImage(isHydrophobic, config);
    
    istkabra's avatar
    istkabra committed
                        j++;
    
                    }else if (vm.equals(VisualizerMethods.Log)) {
                        this.visualizers[j] = new GenerationProgressToLog(isHydrophobic, config);
                        j++;
    
                    }else if (vm.equals(VisualizerMethods.Generation)) {
                        this.visualizers[j] = new GenerationOverviewToConsole(isHydrophobic, config);
                        j++;
    
                    }else if (vm.equals(VisualizerMethods.Video)) {
                        this.visualizers[j] = new BestFoldingsToVideo(config);
                        j++;
    
                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)) {
    
                this.selector = new FitnessProportional(this.config, this.rand);
    
            } else if (config.getSelectionMethod().equals(SelectionMethods.Tournament)) {
    
                this.selector = new Tournament(this.config, this.rand);
    
            } else if (config.getSelectionMethod().equals(SelectionMethods.OnlyBest)) {
    
                this.selector = new OnlyBest();
    
        public void simulateGenerations() {
    
            evaluateGeneration();
            for (int gen = 0; gen < config.getTotalGenerations(); gen++) {
    
                //TODO Remove with the new Generation class
                generation = gen;
    
                visualizeGeneration();
                filterGeneration();
                mutateGeneration();
    
                evaluateGeneration();
    
    
            visualizeGeneration();
    
        //TODO These should all be in the new Generation class with definitions like
        //     mutateGeneration(Mutator e);
        private void evaluateGeneration() {
    
            for (int i = 0; i < population.length; i++) {
    
                this.population[i] = this.evaluator.evaluateFitness(this.population[i]);
    
        private void visualizeGeneration(){
    
    istkabra's avatar
    istkabra committed
            for (Visualizer v : this.visualizers) {
    
                v.drawProtein(this.population, this);
    
        private void mutateGeneration(){
            for (Mutator m : mutators) { // SinglePoint and Crossover at the moment
                this.population = m.generateMutatedPopulation(this.population);
            }
        }
    
        private void filterGeneration(){
            this.population = this.selector.selectNewPopulation(this.population);
        }
    
    
    istkabra's avatar
    istkabra committed
        public int getMaxH() {
    
    istkabra's avatar
    istkabra committed
            for (Visualizer v : visualizers) {
    
                if(v instanceof BestFoldingToImage){
                    return ((BestFoldingToImage)v).getMaxH();
    
    istkabra's avatar
    istkabra committed
        }
    
        public int getMaxW() {
    
    istkabra's avatar
    istkabra committed
            for (Visualizer v : visualizers) {
    
                if(v instanceof BestFoldingToImage){
                    return ((BestFoldingToImage)v).getMaxW();