From f1f9d70c269bc982093d51af7f58bf8fbecb5ed0 Mon Sep 17 00:00:00 2001 From: SimpleArt <71458112+SimpleArt@users.noreply.github.com> Date: Sat, 7 Nov 2020 12:43:47 -0500 Subject: [PATCH] Fixed graph features - Common graph code made into a method. - No longer needs the user to pass in the ga for graphing. - Changed graph attribute from class to object. - Added ga to the graph object as an attribute on initialization to avoid needing to pass it in every time you graph. - Capitalized database/graph classes. --- src/EasyGA.py | 8 ++++- src/attributes.py | 7 ++-- src/database/database.py | 2 +- src/database/graph.py | 70 +++++++++++++++++++--------------------- src/run_testing.py | 2 +- 5 files changed, 47 insertions(+), 42 deletions(-) diff --git a/src/EasyGA.py b/src/EasyGA.py index b7530d5..5c4f9ca 100644 --- a/src/EasyGA.py +++ b/src/EasyGA.py @@ -50,7 +50,7 @@ class GA(Attributes): # Create the database here to allow the user to change # the database name and structure in the running function. - self.database = database.database() + self.database = database.Database() self.database.create_data_table(self) # Create the initial population @@ -158,3 +158,9 @@ class GA(Attributes): """Prints the best chromosome and its fitness""" print(f"Best Chromosome \t: {self.population.get_chromosome(0)}") print(f"Best Fitness \t: {self.population.get_chromosome(0).get_fitness()}") + + + def print_worst(self): + """Prints the worst chromosome and its fitness""" + print(f"Worst Chromosome \t: {self.population.get_chromosome(-1)}") + print(f"Worst Fitness \t: {self.population.get_chromosome(-1).get_fitness()}") diff --git a/src/attributes.py b/src/attributes.py index 94a8249..522cdc6 100644 --- a/src/attributes.py +++ b/src/attributes.py @@ -71,7 +71,7 @@ class Attributes: fitness DOUBLE, chromosome text ); """, - graph = graph.graph + Graph = graph.Graph ): # Initilization variables @@ -122,7 +122,8 @@ class Attributes: self.sql_create_data_structure = deepcopy(sql_create_data_structure) # Graphing variables - self.graph = deepcopy(graph) + self.graph = Graph(self) + # Getter and setters for all required varibles @property @@ -131,6 +132,7 @@ class Attributes: return self._chromosome_length + @chromosome_length.setter def chromosome_length(self, value_input): """Setter function with error checking for chromosome length""" @@ -147,6 +149,7 @@ class Attributes: return self._population_size + @population_size.setter def population_size(self, value_input): """Setter function with error checking for population size""" diff --git a/src/database/database.py b/src/database/database.py index 6d54357..232ae32 100644 --- a/src/database/database.py +++ b/src/database/database.py @@ -3,7 +3,7 @@ from sqlite3 import Error import os -class database: +class Database: """Main database class that controls all the functionality for input / out of the database.""" diff --git a/src/database/graph.py b/src/database/graph.py index 93cf884..852c4c6 100644 --- a/src/database/graph.py +++ b/src/database/graph.py @@ -4,30 +4,41 @@ import matplotlib.pyplot as plt from database import database from sqlite3 import Error -class graph: +class Graph: """Prebuilt graphing functions to make visual represention of fitness data.""" - def generation_total_fitness(ga,type_of_plot = "line",size = [6,6]): + + def __init__(self, ga): + self.ga = ga + + + def make_plot(self, type_of_plot, size, X, Y): + """Create the plot""" + + # Set the plot size + plt.figure(figsize = size) + + if(type_of_plot == "line"): + plt.plot(X, Y) + elif(type_of_plot == "scatter"): + plt.scatter(X, Y) + elif(type_of_plot == "bar"): + plt.bar(X, Y) + + + def generation_total_fitness(self, type_of_plot = "line", size = [6,6]): """Show a plot of generation by generation total fitness.""" # Query the X data - generations = ga.database.get_total_generations() + generations = self.ga.database.get_total_generations() # Create the generations list - [0,1,2,etc] X = list(range(0, generations)) # Query for Y data - Y = ga.database.get_generation_total_fitness() + Y = self.ga.database.get_generation_total_fitness() - # Set the plot size - plt.figure(figsize=size) - - if(type_of_plot == "line"): - plt.plot(X,Y) - elif(type_of_plot == "scatter"): - plt.scatter(X,Y) - elif(type_of_plot == "bar"): - plt.bar(X,Y) + self.make_plot(type_of_plot, size, X, Y) # x and y labels plt.xlabel('Generation') @@ -37,27 +48,20 @@ class graph: # Show the plot plt.show() - def highest_value_chromosome(ga,type_of_plot = "line",size = [6,6]): + + def highest_value_chromosome(self, type_of_plot = "line", size = [6,6]): """Generation by Max value chromosome """ # Query the X data - generations = ga.database.get_total_generations() + generations = self.ga.database.get_total_generations() # Create the generations list - [0,1,2,etc] X = list(range(0, generations)) # Query for Y data - Y = ga.database.get_highest_chromosome() + Y = self.ga.database.get_highest_chromosome() - # Set the plot size - plt.figure(figsize=size) - - if(type_of_plot == "line"): - plt.plot(X,Y) - elif(type_of_plot == "scatter"): - plt.scatter(X,Y) - elif(type_of_plot == "bar"): - plt.bar(X,Y) + self.make_plot(type_of_plot, size, X, Y) # x and y labels plt.xlabel('Generation') @@ -68,27 +72,19 @@ class graph: plt.show() - def lowest_value_chromosome(ga,type_of_plot = "line",size = [6,6]): + def lowest_value_chromosome(self, type_of_plot = "line", size = [6,6]): """Generation by Min value Chromosome """ # Query the X data - generations = ga.database.get_total_generations() + generations = self.ga.database.get_total_generations() # Create the generations list - [0,1,2,etc] X = list(range(0, generations)) # Query for Y data - Y = ga.database.get_lowest_chromosome() + Y = self.ga.database.get_lowest_chromosome() - # Set the plot size - plt.figure(figsize=size) - - if(type_of_plot == "line"): - plt.plot(X,Y) - elif(type_of_plot == "scatter"): - plt.scatter(X,Y) - elif(type_of_plot == "bar"): - plt.bar(X,Y) + self.make_plot(type_of_plot, size, X, Y) # x and y labels plt.xlabel('Generation') diff --git a/src/run_testing.py b/src/run_testing.py index 603f206..4443b05 100644 --- a/src/run_testing.py +++ b/src/run_testing.py @@ -20,4 +20,4 @@ ga.evolve() ga.print_population() -ga.graph.lowest_value_chromosome(ga) +ga.graph.lowest_value_chromosome()