diff --git a/src/main/java/Evaluators/EvaluatorNESW.java b/src/main/java/Evaluators/EvaluatorNESW.java index 35d57634110b49d3322545d90ef14f49c47b2e86..dd4d9e62988f11321bc136166a5b037c9e2970b0 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 798da729bd724aa7f2c014c31872d598951be3e4..56fd59a8ee897f702648df9cd240e2e890d839f6 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 63bd16d24b592eb566b2051f0b661720906fbcbc..ecdc7756f8ff1ed738a33d0b0cf378cc3ad4ba13 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 abdde5c504779dabe7488e4e63d44cd05c1efb1d..63bd1e7bfa2c3a974e02eee0e2caab705f91019b 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 c386943c8d0b7083294d7433c2e09b7bc004b8e7..1e9ccb4491596ba9c6c4e73a191d6fd9f7ce1e39 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 182069c21397b50fb7d237f38b6280f592c9a2f2..c905701b5cdd6d1fbf77b26f0ede15b2dff967c4 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 50dbf16ba7fdcfcbd12de2d221f30794f38cfb05..f1440a5b2f56545599f8749308e593b746914d3f 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 985f542302ff1a20f900d515022d406ccc9fff97..10683bb60ed9d382184ce299e8cb7ddd2a9a80f5 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 e6dd179025b96a7053951cef662351cd0e60bf92..654517b93e4198d916a7c0702500fb69036bbeaa 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 7c90580a5820b37828af529ef13fcd780569e5ec..ee55b92d5f44b95dfaddd0df0194188aba78d0b8 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 b5c0c08e0cd6ac5e9b3d91d55456a1e88a536dce..68225ac6d1134f43fd4573997405b0fe6fe16e05 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 6193a623b6a6b0401aad2187e776c7ff87d45953..fff027fa565b70d4994a3a2cf26d8226b4a0b087 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 e39e8fcbdd224b602c2c88da6769f3b2bca50bff..3cb928dca54fc23316db2d14988536bcb3a23732 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 22af4d1bcd05f8687644ed651c6443a795ba3616..fa9de950167aaae715b6373085426012e4156490 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 78d8cfe1827d18529a9dcae7509a6e569c4b06cf..15ba9a6a5231cd7d7ae5d792d34b0fb8a03918d5 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;