From cf408e0e4647057ac1b9ab4ca296ba8df040ed70 Mon Sep 17 00:00:00 2001 From: Lennart Eichhorn <lennart@madmanfred.com> Date: Fri, 29 May 2020 20:19:38 +0200 Subject: [PATCH] Removed protein information from Candidate. --- src/main/java/Evaluators/EvaluatorNESW.java | 8 ++++--- .../java/InitialGenerationCreators/Curl.java | 9 ++++---- .../RandomDirection.java | 9 ++++---- .../StraightLine.java | 9 ++++---- src/main/java/Interfaces/Evaluator.java | 4 ---- .../Interfaces/InitialGenerationCreator.java | 2 +- src/main/java/Interfaces/Visualizer.java | 6 ++--- src/main/java/MainClasses/Candidate.java | 9 +++----- .../java/MainClasses/GeneticAlgorithm.java | 22 +++++++++---------- src/main/java/MainClasses/Vertex.java | 4 +--- .../java/Selectors/FitnessProportional.java | 2 +- src/main/java/Selectors/OnlyBest.java | 2 +- src/main/java/Selectors/Tournament.java | 2 +- .../Visualizers/VisualizerNESWtoConsole.java | 6 +++-- .../Visualizers/VisualizerNESWtoFile.java | 6 +++-- 15 files changed, 47 insertions(+), 53 deletions(-) diff --git a/src/main/java/Evaluators/EvaluatorNESW.java b/src/main/java/Evaluators/EvaluatorNESW.java index 35d5763..dd4d9e6 100644 --- a/src/main/java/Evaluators/EvaluatorNESW.java +++ b/src/main/java/Evaluators/EvaluatorNESW.java @@ -8,9 +8,11 @@ import MainClasses.Vertex; public class EvaluatorNESW implements Evaluator { final int POINTS_PER_BOND; + final int[] isHydrophobic; - public EvaluatorNESW(int pointsPerBond) { + public EvaluatorNESW(int pointsPerBond, int[] isHydrophobic) { this.POINTS_PER_BOND = pointsPerBond; + this.isHydrophobic = isHydrophobic; } @Override @@ -36,10 +38,10 @@ public class EvaluatorNESW implements Evaluator { for (int i = 0; i < candidate.vertexList.size() - 2; i++) { Vertex toCompare = candidate.vertexList.get(i); - if (toCompare.isHydrophobic) { + if (isHydrophobic[i]==1) { for (int j = i + 2; j < candidate.vertexList.size(); j++) { Vertex vertex = candidate.vertexList.get(j); - if (vertex.isHydrophobic) { + if (isHydrophobic[j]==1) { if (toCompare.neighbouringPosition(vertex)) { bonds++; } diff --git a/src/main/java/InitialGenerationCreators/Curl.java b/src/main/java/InitialGenerationCreators/Curl.java index 798da72..56fd59a 100644 --- a/src/main/java/InitialGenerationCreators/Curl.java +++ b/src/main/java/InitialGenerationCreators/Curl.java @@ -14,19 +14,18 @@ public class Curl<T extends Enum<?>> implements InitialGenerationCreator { } @Override - public Candidate[] initializeDirections(int populationSize, int[] isHydrophobic) { + public Candidate[] initializeDirections(int populationSize, int sequenceLength) { Candidate[] population = new Candidate[populationSize]; - int proteinLength = isHydrophobic.length; int[] candidateDirections; if (isFRLEncoding(possibleDirections) && populationSize > 0) { - candidateDirections = curlFRL(proteinLength); + candidateDirections = curlFRL(sequenceLength); } else { - candidateDirections = curlNESW(proteinLength); + candidateDirections = curlNESW(sequenceLength); } for (int i = 0; i < populationSize; i++) { - population[i] = new Candidate(isHydrophobic, candidateDirections); + population[i] = new Candidate(candidateDirections); } return population; diff --git a/src/main/java/InitialGenerationCreators/RandomDirection.java b/src/main/java/InitialGenerationCreators/RandomDirection.java index 63bd16d..ecdc775 100644 --- a/src/main/java/InitialGenerationCreators/RandomDirection.java +++ b/src/main/java/InitialGenerationCreators/RandomDirection.java @@ -17,16 +17,15 @@ public class RandomDirection<T extends Enum<?>> implements InitialGenerationCre } @Override - public Candidate[] initializeDirections(int populationSize, int[] isHydrophobic) { + public Candidate[] initializeDirections(int populationSize, int sequenceLength) { Candidate[] population = new Candidate[populationSize]; - int proteinLength = isHydrophobic.length; for (int i = 0; i < populationSize; i++) { - int[] candidateDirections = new int[proteinLength]; - for (int j = 0; j < proteinLength; j++) { + int[] candidateDirections = new int[sequenceLength]; + for (int j = 0; j < sequenceLength; j++) { candidateDirections[j] = this.randomDirection(this.possibleDirections); } - population[i] = new Candidate(isHydrophobic, candidateDirections); + population[i] = new Candidate(candidateDirections); } return population; diff --git a/src/main/java/InitialGenerationCreators/StraightLine.java b/src/main/java/InitialGenerationCreators/StraightLine.java index abdde5c..63bd1e7 100644 --- a/src/main/java/InitialGenerationCreators/StraightLine.java +++ b/src/main/java/InitialGenerationCreators/StraightLine.java @@ -12,17 +12,16 @@ public class StraightLine implements InitialGenerationCreator { } @Override - public Candidate[] initializeDirections(int populationSize, int[] isHydrophobic) { + public Candidate[] initializeDirections(int populationSize, int sequenceLength) { Candidate[] population = new Candidate[populationSize]; - int proteinLength = isHydrophobic.length; - int[] candidateDirections = new int[proteinLength]; - for (int j = 0; j < proteinLength; j++) { + int[] candidateDirections = new int[sequenceLength]; + for (int j = 0; j < sequenceLength; j++) { candidateDirections[j] = 0; // Default starting direction is set by Enum } for (int i = 0; i < populationSize; i++) { - population[i] = new Candidate(isHydrophobic, candidateDirections); + population[i] = new Candidate(candidateDirections); } return population; diff --git a/src/main/java/Interfaces/Evaluator.java b/src/main/java/Interfaces/Evaluator.java index c386943..1e9ccb4 100644 --- a/src/main/java/Interfaces/Evaluator.java +++ b/src/main/java/Interfaces/Evaluator.java @@ -5,8 +5,4 @@ import MainClasses.Candidate; public interface Evaluator { double evaluateFitness(Candidate candidate); - - int evaluateBonds(Candidate candidate); - - int evaluateOverlaps(Candidate candidate); } diff --git a/src/main/java/Interfaces/InitialGenerationCreator.java b/src/main/java/Interfaces/InitialGenerationCreator.java index 182069c..c905701 100644 --- a/src/main/java/Interfaces/InitialGenerationCreator.java +++ b/src/main/java/Interfaces/InitialGenerationCreator.java @@ -4,5 +4,5 @@ import MainClasses.Candidate; public interface InitialGenerationCreator { - Candidate[] initializeDirections(int populationSize, int[] isHydrophobic); + Candidate[] initializeDirections(int populationSize, int sequenceLength); } diff --git a/src/main/java/Interfaces/Visualizer.java b/src/main/java/Interfaces/Visualizer.java index 50dbf16..f1440a5 100644 --- a/src/main/java/Interfaces/Visualizer.java +++ b/src/main/java/Interfaces/Visualizer.java @@ -14,13 +14,13 @@ public interface Visualizer { static ArrayList<Vertex> deepCopyVertexList (List<Vertex> vertexListOriginal) { ArrayList<Vertex> vertexList = new ArrayList<>(); for (Vertex v : vertexListOriginal) { - Vertex vNew = new Vertex(v.x, v.y, v.isHydrophobic, v.outgoingDirection); + Vertex vNew = new Vertex(v.x, v.y, v.outgoingDirection); vertexList.add(vNew); } return vertexList; } - static Cell[][] convertProteinTo2DArray(ArrayList<Vertex> vertexList) { + static Cell[][] convertProteinTo2DArray(ArrayList<Vertex> vertexList, int[] isHydrophobic) { // Determine size int minX = 0; int maxX = 0; @@ -61,7 +61,7 @@ public interface Visualizer { for (int i = 0; i < vertexList.size(); i++) { Vertex vertex = vertexList.get(i); - if (vertex.isHydrophobic) { + if (isHydrophobic[i]==1) { cellArray[vertex.y][vertex.x].addState(State.Hydrophobic); } else { cellArray[vertex.y][vertex.x].addState(State.Hydrophilic); diff --git a/src/main/java/MainClasses/Candidate.java b/src/main/java/MainClasses/Candidate.java index 985f542..10683bb 100644 --- a/src/main/java/MainClasses/Candidate.java +++ b/src/main/java/MainClasses/Candidate.java @@ -5,13 +5,11 @@ import java.util.Arrays; public class Candidate { - int[] isHydrophobic; // 0 = no | 1 = yes public int[] outgoingDirection; // 0 = North | 1 = East | 2 = South | 3 = West public ArrayList<Vertex> vertexList; public double fitness; - public Candidate(int[] isH, int[] oD) { - this.isHydrophobic = isH; + public Candidate(int[] oD) { this.outgoingDirection = oD; this.vertexList = constructVertexes(); @@ -23,9 +21,8 @@ public class Candidate { int currentX = 0; int currentY = 0; - for (int currentVertex = 0; currentVertex < isHydrophobic.length; currentVertex++) { - vertexList.add(new Vertex(currentX, currentY, - isHydrophobic[currentVertex] == 1, outgoingDirection[currentVertex])); + for (int currentVertex = 0; currentVertex < outgoingDirection.length; currentVertex++) { + vertexList.add(new Vertex(currentX, currentY, outgoingDirection[currentVertex])); // Update position if (outgoingDirection[currentVertex] == 0) { diff --git a/src/main/java/MainClasses/GeneticAlgorithm.java b/src/main/java/MainClasses/GeneticAlgorithm.java index e6dd179..654517b 100644 --- a/src/main/java/MainClasses/GeneticAlgorithm.java +++ b/src/main/java/MainClasses/GeneticAlgorithm.java @@ -45,7 +45,7 @@ public class GeneticAlgorithm { this.initializeSettings(); this.clearLog(); - this.population = this.initialGenCreator.initializeDirections(Config.POPULATION_SIZE, this.isHydrophobic); + this.population = this.initialGenCreator.initializeDirections(Config.POPULATION_SIZE, this.isHydrophobic.length); this.totalFitness = 0; this.fitness = new double[Config.POPULATION_SIZE]; this.overallBestFitness = 0; @@ -71,10 +71,10 @@ public class GeneticAlgorithm { int j = 0; for (VisualizerMethods vm : Config.VISUALIZERS) { if (vm.equals(VisualizerMethods.Console)) { - this.visualizers[j] = new VisualizerNESWtoConsole(); + this.visualizers[j] = new VisualizerNESWtoConsole(isHydrophobic); j++; } else if (vm.equals(VisualizerMethods.Image)) { - this.visualizers[j] = new VisualizerNESWtoFile(Config.IMAGE_SEQUENCE_PATH); + this.visualizers[j] = new VisualizerNESWtoFile(Config.IMAGE_SEQUENCE_PATH,isHydrophobic); j++; } } @@ -99,7 +99,7 @@ public class GeneticAlgorithm { } } - this.evaluator = new EvaluatorNESW(Config.POINTS_PER_BOND); + this.evaluator = new EvaluatorNESW(Config.POINTS_PER_BOND, isHydrophobic); } else { // TODO: initialization for FRL settings @@ -154,29 +154,29 @@ public class GeneticAlgorithm { bestIndex = i; } } - int bonds = this.evaluator.evaluateBonds(this.population[bestIndex]); - int overlaps = this.evaluator.evaluateOverlaps(this.population[bestIndex]); for (Visualizer v : this.visualizers) { v.setFilename(String.format("gen_%d.png", gen)); - v.drawProtein(this.population[bestIndex].getVertexList(), bestFitness, bonds, overlaps, gen); + //TODO Print real bond and overlap amount + v.drawProtein(this.population[bestIndex].getVertexList(), bestFitness, -1, -1, gen); } + //TODO Print real bond and overlap amount System.out.println("The fitness is: " + bestFitness - + " [hydrophobicBonds = " + bonds + " | overlaps = " + overlaps + "]"); + + " [hydrophobicBonds = " + -1 + " | overlaps = " + -1 + "]"); // Save the overall best if (bestFitness >= this.overallBestFitness) { this.overallBestFitness = bestFitness; - this.overallBest = new Candidate(this.isHydrophobic, this.population[bestIndex].getOutgoing()); + this.overallBest = new Candidate(this.population[bestIndex].getOutgoing()); } double averageFitness = this.totalFitness / Config.POPULATION_SIZE; String log = String.format("%d\t%.4f\t%.4f\t%.4f\t %d\t%d\n", gen, averageFitness, bestFitness, this.evaluator.evaluateFitness(overallBest), - this.evaluator.evaluateBonds(overallBest), - this.evaluator.evaluateOverlaps(overallBest)); + -1, + -1); try { Files.write(Paths.get(Config.LOGFILE), log.getBytes(), StandardOpenOption.APPEND); diff --git a/src/main/java/MainClasses/Vertex.java b/src/main/java/MainClasses/Vertex.java index 7c90580..ee55b92 100644 --- a/src/main/java/MainClasses/Vertex.java +++ b/src/main/java/MainClasses/Vertex.java @@ -4,13 +4,11 @@ package MainClasses; public class Vertex { public int x; public int y; - public boolean isHydrophobic; public int outgoingDirection; - public Vertex(int x, int y, boolean isHydrophobic, int outgoingDirection) { + public Vertex(int x, int y, int outgoingDirection) { this.x = x; this.y = y; - this.isHydrophobic = isHydrophobic; this.outgoingDirection = outgoingDirection; } diff --git a/src/main/java/Selectors/FitnessProportional.java b/src/main/java/Selectors/FitnessProportional.java index b5c0c08..68225ac 100644 --- a/src/main/java/Selectors/FitnessProportional.java +++ b/src/main/java/Selectors/FitnessProportional.java @@ -33,7 +33,7 @@ public class FitnessProportional implements Selector { j++; picked -= proportionalFitness[j]; } - newPopulation[i] = new Candidate(this.isHydrophobic, population[j].getOutgoing()); + newPopulation[i] = new Candidate(population[j].getOutgoing()); } return newPopulation; diff --git a/src/main/java/Selectors/OnlyBest.java b/src/main/java/Selectors/OnlyBest.java index 6193a62..fff027f 100644 --- a/src/main/java/Selectors/OnlyBest.java +++ b/src/main/java/Selectors/OnlyBest.java @@ -31,7 +31,7 @@ public class OnlyBest implements Selector { int[] bestFolding = population[bestIndex].getOutgoing(); for (int i = 0; i < populationSize; i++) { - newPopulation[i] = new Candidate(this.isHydrophobic, bestFolding); + newPopulation[i] = new Candidate(bestFolding); } return newPopulation; diff --git a/src/main/java/Selectors/Tournament.java b/src/main/java/Selectors/Tournament.java index e39e8fc..3cb928d 100644 --- a/src/main/java/Selectors/Tournament.java +++ b/src/main/java/Selectors/Tournament.java @@ -35,7 +35,7 @@ public class Tournament implements Selector { tournamentChoosenIndex = nextIndex; } } - newPopulation[i] = new Candidate(this.isHydrophobic, population[tournamentChoosenIndex].getOutgoing()); + newPopulation[i] = new Candidate(population[tournamentChoosenIndex].getOutgoing()); } return newPopulation; diff --git a/src/main/java/Visualization/Visualizers/VisualizerNESWtoConsole.java b/src/main/java/Visualization/Visualizers/VisualizerNESWtoConsole.java index 22af4d1..fa9de95 100644 --- a/src/main/java/Visualization/Visualizers/VisualizerNESWtoConsole.java +++ b/src/main/java/Visualization/Visualizers/VisualizerNESWtoConsole.java @@ -17,17 +17,19 @@ public class VisualizerNESWtoConsole implements Visualizer { int maxHeight; int maxWidth; + final int[] isHydrophobic; - public VisualizerNESWtoConsole() { + public VisualizerNESWtoConsole(int[] isHydrophobic) { this.maxHeight = 0; this.maxWidth = 0; + this.isHydrophobic = isHydrophobic; } public void drawProtein(ArrayList<Vertex> vertexListOriginal, double fit, int bond, int over, int gen) { // Copy VertexList to be able to manipulate it ArrayList<Vertex> vertexList = Visualizer.deepCopyVertexList(vertexListOriginal); - Cell[][] cellArray = Visualizer.convertProteinTo2DArray(vertexList); + Cell[][] cellArray = Visualizer.convertProteinTo2DArray(vertexList, isHydrophobic); for (int yIndex = cellArray.length-1; yIndex >= 0; yIndex--) { for (int xIndex = 0; xIndex < cellArray[0].length; xIndex++) { diff --git a/src/main/java/Visualization/Visualizers/VisualizerNESWtoFile.java b/src/main/java/Visualization/Visualizers/VisualizerNESWtoFile.java index 78d8cfe..15ba9a6 100644 --- a/src/main/java/Visualization/Visualizers/VisualizerNESWtoFile.java +++ b/src/main/java/Visualization/Visualizers/VisualizerNESWtoFile.java @@ -25,20 +25,22 @@ public class VisualizerNESWtoFile implements Visualizer { int pixelsPerCell = 40; int margin = pixelsPerCell * 2; int outline = 2; + final int[] isHydrophobic; - public VisualizerNESWtoFile(String folder) { + public VisualizerNESWtoFile(String folder, int[] isHydrophobic) { this.folder = folder; this.filename = "image.png"; // Default this.maxHeight = 0; this.maxWidth = 0; + this.isHydrophobic = isHydrophobic; } public void drawProtein(ArrayList<Vertex> vertexListOriginal, double fit, int bond, int over, int gen) { // Copy VertexList to be able to manipulate it ArrayList<Vertex> vertexList = Visualizer.deepCopyVertexList(vertexListOriginal); - Cell[][] cellArray = Visualizer.convertProteinTo2DArray(vertexList); + Cell[][] cellArray = Visualizer.convertProteinTo2DArray(vertexList, this.isHydrophobic); int height = (cellArray.length * pixelsPerCell) + margin * 2; int width = (cellArray[0].length * pixelsPerCell) + margin * 2; -- GitLab