From 5c5b645c30f8b6df7a2747808960cb8f716af2c4 Mon Sep 17 00:00:00 2001 From: danielwilczak101 <44122838+danielwilczak101@users.noreply.github.com> Date: Fri, 6 Nov 2020 02:11:06 -0500 Subject: [PATCH] Added graphing capablities. It only graphs total fitness of generation. --- setup.py | 2 ++ src/EasyGA.py | 34 ++++++++++++++++++++++++++ src/attributes.py | 3 ++- src/database.db | Bin 0 -> 253952 bytes src/database/database.py | 50 ++++++++++++++++++++++++--------------- src/database/graph.py | 0 src/run_testing.py | 12 +++++----- 7 files changed, 75 insertions(+), 26 deletions(-) create mode 100644 src/database.db delete mode 100644 src/database/graph.py diff --git a/setup.py b/setup.py index eeca904..4b4a251 100644 --- a/setup.py +++ b/setup.py @@ -26,6 +26,8 @@ setup( "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", "Operating System :: OS Independent", ], + install_requires = ["matplotlib ~= 3.3.2", + ], extra_require = { "dev": [ "pytest>=3.7", diff --git a/src/EasyGA.py b/src/EasyGA.py index de96100..5b73dd2 100644 --- a/src/EasyGA.py +++ b/src/EasyGA.py @@ -23,6 +23,9 @@ from attributes import Attributes from database import database from sqlite3 import Error +# Graphing package +import matplotlib.pyplot as plt + class GA(Attributes): """GA is the main class in EasyGA. Everything is run through the ga @@ -154,3 +157,34 @@ 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 graph_scatter(self): + """Show a scatter plot of the database information.""" + + # Query the X data + generations = self.database.query_one_item("SELECT COUNT(DISTINCT generation) FROM data;") + + # Create the generations array + X = list(range(0, generations)) + + #Query the Y data + Y_data = self.database.query_all("SELECT SUM(fitness) FROM data GROUP BY generation;") + + # Format the Y data so we can use it to plot + Y = [i[0] for i in Y_data] + + # Set the plot size + plt.figure(figsize=[5, 5]) + + plt.scatter(X,Y) + # x and y labels + plt.xlabel('Generation') + plt.ylabel('Generation Total Fitness') + plt.title('Relationship Between Generations and Generation Total Fitness') + + # Show the plot + plt.show() + + + def graph_line(self): + pass diff --git a/src/attributes.py b/src/attributes.py index 6d84dba..ec5441a 100644 --- a/src/attributes.py +++ b/src/attributes.py @@ -24,6 +24,7 @@ from crossover import Crossover_Methods from database import database from sqlite3 import Error + class Attributes: """Default GA attributes can be found here. If any attributes have not been set then they will fall back onto the default attribute. All @@ -60,7 +61,7 @@ class Attributes: termination_impl = Termination_Methods.fitness_and_generation_based, database = None, database_name = 'database.db', - sql_create_data_structure = """CREATE TABLE IF NOT EXISTS data ( + sql_create_data_structure = """CREATE TABLE IF NOT EXISTS data ( id integer PRIMARY KEY, generation integer NOT NULL, fitness DOUBLE, diff --git a/src/database.db b/src/database.db new file mode 100644 index 0000000000000000000000000000000000000000..d8f80b16c2a02d96828ed984e41b5f0ab7256a5b GIT binary patch literal 253952 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

OG@>t@N*z{0c}TYo&j!^sklvJ*>JV57EC? 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 literal 0 HcmV?d00001 diff --git a/src/database/database.py b/src/database/database.py index 7596288..78cd66a 100644 --- a/src/database/database.py +++ b/src/database/database.py @@ -5,7 +5,7 @@ import os class database: """Main database class that controls all the functionality for input / - out of the database.""" + out of the database.""" def __init__(self): @@ -13,7 +13,7 @@ class database: def create_connection(self, db_file): - """ create a database connection to the SQLite database + """Create a database connection to the SQLite database specified by db_file.""" conn = None @@ -27,11 +27,8 @@ class database: def create_table(self, create_table_sql): - """ create a table from the create_table_sql statement - :param conn: Connection object - :param create_table_sql: a CREATE TABLE statement - :return: - """ + """Create a table from the create_table_sql statement.""" + try: c = self.conn.cursor() c.execute(create_table_sql) @@ -39,20 +36,15 @@ class database: print(e) def insert_chromosome(self, generation, chromosome): - """ - Insert a new chromosome - :param conn: - :param generation: - :param chromosome: - :return: - """ + """ """ # Structure the insert data db_chromosome = (generation, chromosome.fitness, '[chromosome]') - + # Create sql query structure sql = ''' INSERT INTO data(generation,fitness,chromosome) - VALUES(?,?,?) ''' + VALUES(?,?,?) ''' + cur = self.conn.cursor() cur.execute(sql, db_chromosome) self.conn.commit() @@ -61,16 +53,20 @@ class database: def insert_current_population(self, ga): """ Insert current generations population """ + # For each chromosome in the population for chromosome in ga.population.chromosome_list: + # Insert the chromosome into the database self.insert_chromosome(ga.current_generation, chromosome) def create_data_table(self, ga): + """Create the data table that store generation data.""" try: - # Remove old database if there + # Remove old database file if it exists. os.remove(ga.database_name) except: + # If the database does not exist continue pass # create a database connection @@ -81,7 +77,23 @@ class database: # create projects table self.create_table(ga.sql_create_data_structure) - # create tasks table - # create_table(conn, sql_create_tasks_table) else: print("Error! cannot create the database connection.") + + + def query_all(self, query): + """Query for muliple rows of data""" + + cur = self.conn.cursor() + cur.execute(query) + + return cur.fetchall() + + def query_one_item(self, query): + """Query for single data point""" + + cur = self.conn.cursor() + cur.execute(query) + query_data = cur.fetchone() + + return query_data[0] diff --git a/src/database/graph.py b/src/database/graph.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/run_testing.py b/src/run_testing.py index b5f355a..84edc65 100644 --- a/src/run_testing.py +++ b/src/run_testing.py @@ -1,14 +1,14 @@ -import random import EasyGA +import random # Create the Genetic algorithm ga = EasyGA.GA() -ga.population_size = 3 -ga.generation_goal = 10 -# Evolve the genetic algorithm +ga.generation_goal = 200 +ga.population_size = 50 + ga.evolve() -# Print your default genetic algorithm -ga.print_generation() ga.print_population() + +ga.graph_scatter()