import numpy import matplotlib.pyplot as plt def fitness_fun(indiv_chrom): in_sample = [8, 4, 2, 1] quality = ((15*numpy.sum(indiv_chrom*in_sample)) - (numpy.sum(indiv_chrom*in_sample)*numpy.sum(indiv_chrom*in_sample))) return quality def pop_fitness(pop): qualities = numpy.zeros(pop.shape[0]) for indv_num in range(pop.shape[0]): qualities[indv_num] = fitness_fun(pop[indv_num, :]) return qualities def select_mating_pool(pop, qualities, num_parents): parents = numpy.empty((num_parents, pop.shape[1])) for parent_num in range(num_parents): max_qual_idx = numpy.where(qualities == numpy.max(qualities)) max_qual_idx = max_qual_idx[0][0] parents[parent_num, :] = pop[max_qual_idx, :] qualities[max_qual_idx] = -10000 return parents def crossover(parents, n_individuals=6): new_population = numpy.empty((6, 4)) #Previous parents (best elements). #new_population[0:parents.shape[0], :] = parents new_population[0, 0:2] = parents[0, 0:2] new_population[0, 2:] = parents[2, 2:] new_population[2, 0:2] = parents[2, 0:2] new_population[2, 2:] = parents[0, 2:] new_population[1, 0:2] = parents[1, 0:2] new_population[1, 2:] = parents[3, 2:] new_population[3, 0:2] = parents[3, 0:2] new_population[3, 2:] = parents[1, 2:] new_population[4, :] = parents[2, :] new_population[5, :] = parents[3, :] return new_population def mutation(population): #for idx in range(population.shape[0]): population[0, 1] = numpy.abs(1-population[3, 1]) return population #population size sol_per_pop = 6 #Mating pool size num_parents_mating = 4 #Creating an initial population randomly new_population = numpy.zeros((6,4)) new_population[0, :] = [1, 1, 0, 0] new_population[1, :] = [0, 1, 0, 0] new_population[2, :] = [0, 0, 0, 1] new_population[3, :] = [1, 1, 1, 0] new_population[4, :] = [0, 1, 1, 1] new_population[5, :] = [1, 0, 0, 1] for iteration in range(1): #Measing the fitness of each chromosome in the population qualities = pop_fitness(new_population) #Selecting the best parents in the population for mating parents = select_mating_pool(new_population, qualities,num_parents_mating) #Generating next generation using crossover new_population = crossover(parents, n_individuals=sol_per_pop) #new_population = mutation(new_population) qualities = pop_fitness(new_population) in_sample = [8, 4, 2, 1] new_population2 = numpy.zeros((6)) for k in range (6): print ('x = ') print(numpy.sum(new_population[k, :] * in_sample)) new_population2[k]= numpy.sum(new_population[k, :] * in_sample) print ('fitness = ') print (qualities) x=numpy.linspace(0,15,100) y=15*x - x*x plt.grid(True) plt.xlabel('X') plt.ylabel('Fitness F(x)') plt.plot(x,y,"r--",label="Fitness") for k in range (6): plt.plot(new_population2[k],15*new_population2[k]-new_population2[k]*new_population2[k], marker ="o",color="black") plt.legend() plt.show()