diff --git a/src/main/java/Enums/VisualizerMethods.java b/src/main/java/Enums/VisualizerMethods.java index 30b14737a58affa1559912bf83de6ebcc29de16e..9bb67731d50c36d5fa8b88f9af46f6cebc33b00b 100644 --- a/src/main/java/Enums/VisualizerMethods.java +++ b/src/main/java/Enums/VisualizerMethods.java @@ -3,5 +3,6 @@ package Enums; public enum VisualizerMethods { Console, Image, - Video + Video, + Log } diff --git a/src/main/java/MainClasses/Config.java b/src/main/java/MainClasses/Config.java index 7cbaee3f9c8c23d7eba9229fadb66105b36c20b7..adebb9c55d3020977199ece05247c60b1b597c46 100644 --- a/src/main/java/MainClasses/Config.java +++ b/src/main/java/MainClasses/Config.java @@ -173,6 +173,9 @@ public class Config { case "video": visualizers[i] = VisualizerMethods.Video; break; + case "log": + visualizers[i] = VisualizerMethods.Log; + break; } } diff --git a/src/main/java/MainClasses/GeneticAlgorithm.java b/src/main/java/MainClasses/GeneticAlgorithm.java index 13be23837ba320743ff1163238862d57ef5ec387..b483b43a141f25d17dbe1632178c87e08c8e813d 100644 --- a/src/main/java/MainClasses/GeneticAlgorithm.java +++ b/src/main/java/MainClasses/GeneticAlgorithm.java @@ -14,6 +14,7 @@ import Selectors.Tournament; import Visualization.Visualizers.BestFoldingToConsole; import Visualization.Visualizers.BestFoldingToImage; +import Visualization.Visualizers.GenerationProgressToLog; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -50,7 +51,6 @@ public class GeneticAlgorithm { this.config = config; this.initializeSettings(); - this.clearLog(); this.population = this.initialGenCreator.initializeDirections(config.getPopulationSize(), this.isHydrophobic.length); this.totalFitness = 0; @@ -70,12 +70,12 @@ public class GeneticAlgorithm { // Settings that are dependant on encoding if (config.getEncodingVariant().equals("NESW")) { int nullCount = 0; - for (int i = 0; i < config.getVisualizers().length; i++) { + /*for (int i = 0; i < config.getVisualizers().length; i++) { if (!config.getVisualizers()[i].equals(VisualizerMethods.Console) && !config.getVisualizers()[i].equals(VisualizerMethods.Image)) { nullCount++; } - } + }*/ this.visualizers = new Visualizer[config.getVisualizers().length - nullCount]; int j = 0; for (VisualizerMethods vm : config.getVisualizers()) { @@ -85,6 +85,9 @@ public class GeneticAlgorithm { } else if (vm.equals(VisualizerMethods.Image)) { this.visualizers[j] = new BestFoldingToImage(isHydrophobic, config); j++; + }else if (vm.equals(VisualizerMethods.Log)) { + this.visualizers[j] = new GenerationProgressToLog(isHydrophobic, config); + j++; } } @@ -123,19 +126,6 @@ public class GeneticAlgorithm { } } - private void clearLog() { - String content = "Generation\tAverage Fitness\tBest Fitness\tOverall Best Fitness\tBonds\tOverlaps\n"; - try { - //TODO This does not belong here - Files.createDirectories(Paths.get(config.getLogfileDirectory())); - String logfilePath = config.getLogfileDirectory() + "/" + config.getJobName() + ".txt"; - Files.write(Paths.get(logfilePath), content.getBytes()); - - } catch (IOException e) { - e.printStackTrace(); - } - } - public void simulateGenerations() { for (int gen = 0; gen < config.getTotalGenerations()-1; gen++) { //TODO Remove with the new Generation class @@ -186,19 +176,6 @@ public class GeneticAlgorithm { } double averageFitness = this.totalFitness / config.getPopulationSize(); - String log = String.format("%d\t%.4f\t%.4f\t%.4f\t %d\t%d\n", - gen, averageFitness, bestFitness, - this.overallBest.getFitness(), - -1, - -1); - - try { - String logfilePath = config.getLogfileDirectory() + "/" + config.getJobName() + ".txt"; - Files.write(Paths.get(logfilePath), log.getBytes(), StandardOpenOption.APPEND); - - } catch (IOException e) { - e.printStackTrace(); - } return bestIndex; } diff --git a/src/main/java/Visualization/Visualizers/GenerationProgressToLog.java b/src/main/java/Visualization/Visualizers/GenerationProgressToLog.java new file mode 100644 index 0000000000000000000000000000000000000000..8feb05324f72f3212c68d9f4f0901c2ff7dfe760 --- /dev/null +++ b/src/main/java/Visualization/Visualizers/GenerationProgressToLog.java @@ -0,0 +1,83 @@ +package Visualization.Visualizers; + +import Evaluators.EvaluatorNESW; +import Interfaces.Visualizer; +import MainClasses.Candidate; +import MainClasses.Config; +import MainClasses.GeneticAlgorithm; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; + +public class GenerationProgressToLog implements Visualizer { + Path logfilePath; + final int[] isHydrophobic; + Config config; + + //TODO Make sure this is initialized or prepare for bugs + Candidate overallBestCandidate; + EvaluatorNESW bondsOverlapsEvaluator; + + public GenerationProgressToLog(int[] isHydrophobic, Config config) { + this.isHydrophobic = isHydrophobic; + this.config = config; + String filename = config.getLogfileDirectory() + "/" + config.getJobName() + ".txt"; + logfilePath = Paths.get(filename); + bondsOverlapsEvaluator = new EvaluatorNESW(1,isHydrophobic); + + //Initialize the logfile + initializeLogfile(); + } + + @Override + public void drawProtein(Candidate[] generation, GeneticAlgorithm geneticAlgorithm) { + //TODO This should be done in the new Generation class + double averageFitness = 0.0; + Candidate bestCandidateOfGeneration = generation[0]; + for(Candidate candidate: generation){ + averageFitness += candidate.getFitness(); + if(candidate.getFitness() > bestCandidateOfGeneration.getFitness()){ + bestCandidateOfGeneration = candidate; + } + } + averageFitness /= generation.length; + + //Find overall best Candidate + if(geneticAlgorithm.generation == 0) { + overallBestCandidate = bestCandidateOfGeneration; + }else if(bestCandidateOfGeneration.getFitness() > overallBestCandidate.getFitness()){ + overallBestCandidate = bestCandidateOfGeneration; + } + + int bonds = bondsOverlapsEvaluator.evaluateBonds(bestCandidateOfGeneration); + int overlaps = bondsOverlapsEvaluator.evaluateBonds(bestCandidateOfGeneration); + + String log = String.format("%d\t%.4f\t%.4f\t%.4f\t %d\t%d\n", + geneticAlgorithm.generation, + averageFitness, + bestCandidateOfGeneration.getFitness(), + overallBestCandidate.getFitness(), + bonds, + overlaps); + + try { + String logfilePath = config.getLogfileDirectory() + "/" + config.getJobName() + ".txt"; + Files.write(Paths.get(logfilePath), log.getBytes(), StandardOpenOption.APPEND); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void initializeLogfile() { + String content = "Generation\tAverage Fitness\tBest Fitness\tOverall Best Fitness\tBonds\tOverlaps\n"; + try { + Files.createDirectories(Paths.get(config.getLogfileDirectory())); + Files.write(logfilePath, content.getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/resources/genetic.properties b/src/main/resources/genetic.properties index 9044afaa3d4d2c9341cd18a97359fbb9f5c5565c..27f864e487ab1ff31515f4f3679c908063816eee 100644 --- a/src/main/resources/genetic.properties +++ b/src/main/resources/genetic.properties @@ -43,7 +43,7 @@ ### Output settings # Type(s) of visualization to enable, separated with comma [console / image / video] - visualizerType = image,video + visualizerType = log # Name of the job, filenames will be based on this name. If left empty a timestamp is used jobName = example1 # Directory for the image sequence