前言
最近接触遗传算法,参考了众多例子,有些又不尽然对,所以自己边理解边修改,然后写出了下面这堆传说中的屎山。。。
PS1:遗传算法原理啥的太多了,就不赘述了,CSDN里面很多帖子都讲得很透彻了;
PS2:要看简洁的,直接油管搜遗传算法,看莫烦的视频。
代码
不废话了,赶紧上车,啊不,上代码。
import math
import numpy as np
import matplotlib.pyplot as plt
import random
class GA(object):
# 目标求解2*sin(x)+cos(x)最大值
def __init__(self, population_size, chromosome_length, pm):
self.population_size = population_size
self.chromosome_length = chromosome_length
self.pm = pm
# 初始化种群
def species_origin(self): # 生成染色体和基因
population = [[]] # 二维列表,包含染色体和基因
for i in range(self.population_size):
temporary = [] # 染色体寄存器
for j in range(self.chromosome_length):
temporary.append(random.randint(0, 1)) # 生成基因,二进制
population.append(temporary) # 将基因添加到染色体中
return population[1:] # 返回种群,包含染色体和基因
# 种群解码,用于适应度判断
def translation(self, population): # 二进制转十进制
chromosome_d_list = [] # 创建染色体十进制列表
for i in range(len(population)):
chromosome_value_d = 0
for j in range(len(population[0])):
chromosome_value_d += population[i][j] * (math.pow(2, len(population[0])-j-1))
chromosome_d_list.append(chromosome_value_d)
return chromosome_d_list
# 适应度计算
def function(self, population, lower_bound, upper_bound):
all_fitness_list = [] # 创建所有染色体适应度列表
fv_list = self.translation(population)
for i in range(len(fv_list)):
x = lower_bound + fv_list[i] * (upper_bound - lower_bound)/(math