遗传算法python代码(附详细注释)
#代码参考:https://blog.youkuaiyun.com/ha_ha_ha233/article/details/91364937
import numpy as np #用于数据操作:【X = np.linspace(*X_BOUND, 100) #将列表传入收集参数,完成解包】【 Y = np.linspace(*Y_BOUND, 100)】【X, Y = np.meshgrid(X, Y) #生成网格点坐标矩阵,每个二维矩阵表示一个维度】
import matplotlib.pyplot as plt #用于画图,可画二维【fig = plt.figure()】、三维【ax = fig.add_subplot(111, projection='3d')】;亦可上色【ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap = plt.get_cmap('rainbow'))】
from matplotlib import cm #绘制3d曲面时用于给图上色:【ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = cm.coolwarm)】
from mpl_toolkits.mplot3d import Axes3D #用于画三维图,将二维图变换为三维图: 【fig = plt.figure()】 【ax = Axes3D(fig)】
DNA_SIZE = 24
POP_SIZE = 200
CROSSOVER_RATE = 0.8
MUTATION_RATE = 0.005
N_GENERATIONS = 50
X_BOUND = [-3, 3]
Y_BOUND = [-3, 3]
def F(x, y):
return 3 * (1 - x) ** 2 * np.exp(-(x ** 2) - (y + 1) ** 2) - 10 * (x / 5 - x ** 3 - y ** 5) * np.exp(
-x ** 2 - y ** 2) - 1 / 3 ** np.exp(-(x + 1) ** 2 - y ** 2)
def translateDNA(pop): # pop表示种群矩阵,一行表示一个二进制编码表示的DNA,矩阵的行数为种群数目
x_pop = pop[:, 1::2] # 奇数列表示X
y_pop = pop[:, ::2] # 偶数列表示y
'''
dot()表示矩阵相乘;*表示点积与MATLAB.*相似
'''
# pop:(POP_SIZE,DNA_SIZE)*(DNA_SIZE,1) --> (POP_SIZE,1)
x = x_pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2 ** DNA_SIZE - 1) * (X_BOUND[1] - X_BOUND[0]) + X_BOUND[0] #dot()表示矩阵相乘;*表示点积与MATLAB.*相似
y = y_pop.dot(2 ** np.arange(DNA_SIZE)[::-1