From fe4f088a72d3ec9d9cc1b4c917f37ff6d48b9e54 Mon Sep 17 00:00:00 2001 From: istkabra <kyrill.abrams@stud.h-da.de> Date: Tue, 2 Jun 2020 17:31:10 +0200 Subject: [PATCH] * Global bending of proteins is now working on singlePoint mutations * Closes #9 --- src/main/java/Enums/MutatorMethods.java | 1 + src/main/java/MainClasses/Config.java | 2 ++ .../java/MainClasses/GeneticAlgorithm.java | 11 +++++---- ...ntBend.java => SinglePointGlobalBend.java} | 23 +++++++++++++++---- 4 files changed, 27 insertions(+), 10 deletions(-) rename src/main/java/Mutators/{SinglePointBend.java => SinglePointGlobalBend.java} (57%) diff --git a/src/main/java/Enums/MutatorMethods.java b/src/main/java/Enums/MutatorMethods.java index 3ec0bb1..fe3a5ef 100644 --- a/src/main/java/Enums/MutatorMethods.java +++ b/src/main/java/Enums/MutatorMethods.java @@ -2,5 +2,6 @@ package Enums; public enum MutatorMethods { SinglePoint, + SinglePointGlobal, Crossover } diff --git a/src/main/java/MainClasses/Config.java b/src/main/java/MainClasses/Config.java index 58f1b75..96f17dc 100644 --- a/src/main/java/MainClasses/Config.java +++ b/src/main/java/MainClasses/Config.java @@ -134,6 +134,8 @@ public class Config { mutatorMethods[i] = MutatorMethods.SinglePoint; } else if (mutatorsToUse[i].equals("crossover")) { mutatorMethods[i] = MutatorMethods.Crossover; + } else if (mutatorsToUse[i].equals("singlePointGlobal")) { + mutatorMethods[i] = MutatorMethods.SinglePointGlobal; } } diff --git a/src/main/java/MainClasses/GeneticAlgorithm.java b/src/main/java/MainClasses/GeneticAlgorithm.java index 5951276..45ec810 100644 --- a/src/main/java/MainClasses/GeneticAlgorithm.java +++ b/src/main/java/MainClasses/GeneticAlgorithm.java @@ -8,15 +8,12 @@ import InitialGenerationCreators.StraightLine; import Interfaces.*; import Mutators.Crossover; import Mutators.SinglePoint; +import Mutators.SinglePointGlobalBend; import Selectors.FitnessProportional; import Selectors.OnlyBest; import Selectors.Tournament; -import Visualizers.BestFoldingToConsole; -import Visualizers.BestFoldingToImage; +import Visualizers.*; -import Visualizers.BestFoldingsToVideo; -import Visualizers.GenerationOverviewToConsole; -import Visualizers.GenerationProgressToLog; import java.util.Random; public class GeneticAlgorithm { @@ -105,6 +102,10 @@ public class GeneticAlgorithm { } else if (config.getMutatorMethods()[i].equals(MutatorMethods.Crossover)) { this.mutators[i] = new Crossover<>(DirectionNESW.class, this.rand, config.getCrossoverAttemptsPerCandidate(), config.getCrossoverChance(), config.getCrossoverMinimalChance(), config.getCrossoverMultiplier()); + + } else if (config.getMutatorMethods()[i].equals(MutatorMethods.SinglePointGlobal)) { + this.mutators[i] = new SinglePointGlobalBend<>(DirectionNESW.class, this.rand, + config.getMutationAttemptsPerCandidate(), config.getMutationChance(), config.getMutationMinimalChance(), config.getMutationMultiplier()); } } diff --git a/src/main/java/Mutators/SinglePointBend.java b/src/main/java/Mutators/SinglePointGlobalBend.java similarity index 57% rename from src/main/java/Mutators/SinglePointBend.java rename to src/main/java/Mutators/SinglePointGlobalBend.java index 1fc4146..ab03523 100644 --- a/src/main/java/Mutators/SinglePointBend.java +++ b/src/main/java/Mutators/SinglePointGlobalBend.java @@ -2,9 +2,10 @@ package Mutators; import Interfaces.Mutator; import MainClasses.Candidate; + import java.util.Random; -public class SinglePointBend<T extends Enum<?>> implements Mutator { +public class SinglePointGlobalBend<T extends Enum<?>> implements Mutator { // TODO: Maybe this should just extend SinglePoint boolean isFRL; Class<T> possibleDirections; @@ -14,8 +15,8 @@ public class SinglePointBend<T extends Enum<?>> implements Mutator { double mutationMinimalChance; double mutationMultiplier; - public SinglePointBend(Class<T> possibleDirections, Random rand, int mutationAttemptsPerCandidate, - double mutationChance, double mutationMinimalChance, double mutationMultiplier) { + public SinglePointGlobalBend(Class<T> possibleDirections, Random rand, int mutationAttemptsPerCandidate, + double mutationChance, double mutationMinimalChance, double mutationMultiplier) { this.possibleDirections = possibleDirections; this.isFRL = Mutator.isFRLEncoding(possibleDirections); this.rand = rand; @@ -38,11 +39,23 @@ public class SinglePointBend<T extends Enum<?>> implements Mutator { for (int j = 0; j < this.mutationAttemptsPerCandidate; j++) { if (this.mutationChance > this.rand.nextDouble()) { int mutationPlace = this.rand.nextInt(proteinLength); - // TODO Do complete bend instead of local bend if (this.isFRL) { mutatedFolding[mutationPlace] = this.rand.nextInt(3); } else { - mutatedFolding[mutationPlace] = this.rand.nextInt(4); + int oldDirection = mutatedFolding[mutationPlace]; + if (mutationPlace == 0) { + // Allow any direction in the first position + mutatedFolding[mutationPlace] = this.rand.nextInt(4); + } else { + // Make sure there can never be a backtracking overlap while mutating + mutatedFolding[mutationPlace] = + ((mutatedFolding[mutationPlace-1] - 1 + this.rand.nextInt(3)) + 4 ) % 4; + } + // Also bend the following amino acids in the right way to achieve a "global" bend + int offset = (mutatedFolding[mutationPlace] - oldDirection + 4) % 4; + for (int r = mutationPlace + 1; r < mutatedFolding.length; r++) { + mutatedFolding[r] = (mutatedFolding[r] + offset) % 4; + } } } } -- GitLab