98 lines
4.2 KiBLFS
HTML
98 lines
4.2 KiBLFS
HTML
<html>
|
|
<head>
|
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@holoviz/panel@0.13.0-rc.10/dist/panel.min.js"></script>
|
|
<link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
|
|
<script defer src="https://pyscript.net/alpha/pyscript.js"></script>
|
|
</head>
|
|
<body>
|
|
</py-script>
|
|
<py-env>
|
|
- sqlite-utils
|
|
- pygad
|
|
</py-env>
|
|
<h1>Sqlite-utils Example</h1>
|
|
<div id="myplot"></div>
|
|
<py-script>
|
|
import sqlite_utils
|
|
|
|
import pygad
|
|
import numpy
|
|
|
|
"""
|
|
Given the following function:
|
|
y = f(w1:w6) = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 + 6wx6
|
|
where (x1,x2,x3,x4,x5,x6)=(4,-2,3.5,5,-11,-4.7) and y=44
|
|
What are the best values for the 6 weights (w1 to w6)? We are going to use the genetic algorithm to optimize this function.
|
|
"""
|
|
|
|
function_inputs = [4,-2,3.5,5,-11,-4.7] # Function inputs.
|
|
desired_output = 44 # Function output.
|
|
|
|
def fitness_func(solution, solution_idx):
|
|
# Calculating the fitness value of each solution in the current population.
|
|
# The fitness function calulates the sum of products between each input and its corresponding weight.
|
|
output = numpy.sum(solution*function_inputs)
|
|
fitness = 1.0 / numpy.abs(output - desired_output)
|
|
return fitness
|
|
|
|
fitness_function = fitness_func
|
|
|
|
num_generations = 100 # Number of generations.
|
|
num_parents_mating = 7 # Number of solutions to be selected as parents in the mating pool.
|
|
|
|
# To prepare the initial population, there are 2 ways:
|
|
# 1) Prepare it yourself and pass it to the initial_population parameter. This way is useful when the user wants to start the genetic algorithm with a custom initial population.
|
|
# 2) Assign valid integer values to the sol_per_pop and num_genes parameters. If the initial_population parameter exists, then the sol_per_pop and num_genes parameters are useless.
|
|
sol_per_pop = 50 # Number of solutions in the population.
|
|
num_genes = len(function_inputs)
|
|
|
|
last_fitness = 0
|
|
def callback_generation(ga_instance):
|
|
global last_fitness
|
|
print("Generation = {generation}".format(generation=ga_instance.generations_completed))
|
|
print("Fitness = {fitness}".format(fitness=ga_instance.best_solution()[1]))
|
|
print("Change = {change}".format(change=ga_instance.best_solution()[1] - last_fitness))
|
|
last_fitness = ga_instance.best_solution()[1]
|
|
|
|
# Creating an instance of the GA class inside the ga module. Some parameters are initialized within the constructor.
|
|
ga_instance = pygad.GA(num_generations=num_generations,
|
|
num_parents_mating=num_parents_mating,
|
|
fitness_func=fitness_function,
|
|
sol_per_pop=sol_per_pop,
|
|
num_genes=num_genes,
|
|
on_generation=callback_generation)
|
|
|
|
# Running the GA to optimize the parameters of the function.
|
|
ga_instance.run()
|
|
|
|
# After the generations complete, some plots are showed that summarize the how the outputs/fitenss values evolve over generations.
|
|
ga_instance.plot_fitness()
|
|
|
|
# Returning the details of the best solution.
|
|
solution, solution_fitness, solution_idx = ga_instance.best_solution()
|
|
print("Parameters of the best solution : {solution}".format(solution=solution))
|
|
print("Fitness value of the best solution = {solution_fitness}".format(solution_fitness=solution_fitness))
|
|
print("Index of the best solution : {solution_idx}".format(solution_idx=solution_idx))
|
|
|
|
prediction = numpy.sum(numpy.array(function_inputs)*solution)
|
|
print("Predicted output based on the best solution : {prediction}".format(prediction=prediction))
|
|
|
|
if ga_instance.best_solution_generation != -1:
|
|
print("Best fitness value reached after {best_solution_generation} generations.".format(best_solution_generation=ga_instance.best_solution_generation))
|
|
|
|
# Saving the GA instance.
|
|
filename = 'genetic' # The filename to which the instance is saved. The name is without extension.
|
|
ga_instance.save(filename=filename)
|
|
|
|
# Loading the saved GA instance.
|
|
loaded_ga_instance = pygad.load(filename=filename)
|
|
loaded_ga_instance.plot_fitness()
|
|
|
|
|
|
|
|
db = sqlite_utils.Database(memory=True)
|
|
print(list(db.query("select 3 * 5")))
|
|
print('sqlite-version', list(db.query("select sqlite_version()")))
|
|
</py-script>
|
|
</py-script>
|
|
</html> |