Genetic Algorithm with PyGAD

2.2k Views Asked by At

I'm trying to make a genetic algorithm with PyGAD to find the best value that maximize this function: Z = (3*(x^2 - y)^2 + (100 - x)^2) + (y- x) , x and y between [-4, 4].

Could someone send me an example of something similar to this function? The example I found uses a function with inputs that have already been given: y = f(w1:w6) = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 + 6wx6

I don't know how i can get the fitness value to each individual using the function with two variables

1

There are 1 best solutions below

0
On BEST ANSWER

This is a PyGAD code that solves your problem.

import pygad

def fitness_func(solution, solution_idx):
    x = solution[0]
    y = solution[1]
    Z = -(100*(x**2 - y)**2 + (1 - x)**2)
    return Z

last_fitness = 0
def on_generation(ga_instance):
    global last_fitness
    print("Generation = {generation}".format(generation=ga_instance.generations_completed))
    print("Fitness    = {fitness}".format(fitness=ga_instance.best_solution(pop_fitness=ga_instance.last_generation_fitness)[1]))
    print("Change     = {change}".format(change=ga_instance.best_solution(pop_fitness=ga_instance.last_generation_fitness)[1] - last_fitness))
    last_fitness = ga_instance.best_solution(pop_fitness=ga_instance.last_generation_fitness)[1]

ga_instance = pygad.GA(num_generations=1000,
                       num_parents_mating=5,
                       sol_per_pop=10,
                       num_genes=2,
                       gene_space={"low": -2, "high": 2},
                       mutation_by_replacement=True,
                       fitness_func=fitness_func,
                       on_generation=on_generation)

ga_instance.run()

ga_instance.plot_fitness()

solution, solution_fitness, solution_idx = ga_instance.best_solution(ga_instance.last_generation_fitness)
print("Solution", solution)
print("Fitness value of the best solution = {solution_fitness}".format(solution_fitness=solution_fitness))

Based on your description, here are the values of some parameters:

  • num_genes=2: It is set to 2 because you only have 2 genes.
  • sol_per_pop=10: Set to 10 because you said you have 10 individuals.
  • gene_space={"low": -2, "high": 2}: It restricts the genes to not go beyond the -2:2 range.
  • mutation_by_replacement=True: This makes sure the genes do not go beyond the range after mutation is applied.

You can change the other parameters used according to your preference. For example, you may get better fitness by increasing the number of generations (num_generations).

Please make sure that PyGAD is installed and run the script.