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