python的强大在于可以安装非常丰富的库,针对遗传算法已经有非常完善的库了,只需要在里面设计即可,我使用的是Geatpy库,这是一个高性能的Python遗传算法库以及开放式进化算法框架,由华南理工大学、华南农业大学、德州奥斯汀公立大学的学生联合团队开发。如何安装及其使用请查看Geatpy的官方文档。
Tkinter、Tix…非常多的选择,我这里使用的是easygui,为什么使用easygui呢?因为我看的第一本python书《父与子学python…》啥的,具体书名记不清了,里面介绍的就是easygui,入手很简单,剩下就是matplotlib和Axes3D当然了离不开我们的numpy
关于遗传算法,我这里不想多讲了,参考我上一篇文章https://blog.csdn.net/quinn1994/article/details/80501542
我做了一个选择的界面,可以选择几个经典的测试函数,如下
这里是Ackley函数的二维描述
def Ackley(Phen):
x1 = Phen[:, [0]]
x2 = Phen[:, [1]]
return -20.0*np.exp(-0.2*np.sqrt((x1**2+x2**2)/2)) - np.exp((np.cos(2.0*np.pi*x1)+np.cos(2.0*np.pi*x2))/2) + 20 + np.e
这个是函数图像选择
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import easygui as g
import sys
import numpy as np
import math
choices = ["McCormick","Sphere","Ackley","Easom","Rosenbrock"]
choices = g.choicebox("请选择测试函数","图像选择",choices)
def McCormick():
X = np.arange(-10, 10, 0.25)
Y = np.arange(-10, 10, 0.25)
X, Y = np.meshgrid(X, Y)
Z=np.sin(X + Y) + (X - Y) ** 2 - 1.5 * X + 2.5 * Y +1
fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap='rainbow', alpha=0.5)
plt.show()
def Sphere():
X = np.arange(-10, 10, 0.25)
Y = np.arange(-10, 10, 0.25)
X, Y = np.meshgrid(X, Y)
#Z=np.sin(X + Y) + (X - Y) ** 2 - 1.5 * X + 2.5 * Y +1
Z=X**2+Y**2
fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap='rainbow', alpha=0.5)
plt.show()
def Ackley():
X = np.arange(-10, 10, 0.25)
Y = np.arange(-10, 10, 0.25)
X, Y = np.meshgrid(X, Y)
#Z=-20.0*math.exp(-0.2*math.sqrt(firstSum/n)) - math.exp(secondSum/n) + 20 + math.e
Z=-20.0*np.exp(-0.2*np.sqrt((X**2+Y**2)/2)) - np.exp((np.cos(2.0*np.pi*X)+np.cos(2.0*np.pi*Y))/2) + 20 + np.e
fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap='rainbow', alpha=0.5)
plt.show()
def Easom():
X = np.arange(-10, 10, 0.25)
Y = np.arange(-10, 10, 0.25)
X, Y = np.meshgrid(X, Y)
Z=-np.cos(X)*np.cos(Y)*np.exp(-(X-np.pi)**2-(Y-np.pi)**2)
fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap='rainbow', alpha=0.5)
plt.show()
def Rosenbrock():
X = np.arange(-10, 10, 0.25)
Y = np.arange(-10, 10, 0.25)
X, Y = np.meshgrid(X, Y)
Z=100*(Y-X**2)**2+(1-X)**2
fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap='rainbow', alpha=0.5)
plt.show()
def Rastrigin():
X = np.arange(-10, 10, 0.25)
Y = np.arange(-10, 10, 0.25)
X, Y = np.meshgrid(X, Y)
Z=X**2-10*np.cos(2*X*np.pi)+10+Y**2-10*np.cos(2*Y*np.pi)+10
fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap='rainbow', alpha=0.5)
plt.show()
if choices=="McCormick":
McCormick()
elif choices=="Sphere":
Sphere()
elif choices=="Ackley":
Ackley()
elif choices=="Easom":
Easom()
elif choices=="Rosenbrock":
Rosenbrock()
elif choices=="Rastrigin":
Rastrigin()
这里的点代表种群,整个是一个动态的过程,我这里只能用图片显示了,不知道怎么插入gift
for gen in range(MAXGEN):
FitnV = ea.ranking(maxormins * ObjV)
SelCh = Chrom[ea.selecting(selectStyle,FitnV,NIND-1),:]
SelCh = ea.recombin(recStyle, SelCh, pc)
SelCh = ea.mutate(mutStyle, Encoding, SelCh, pm)
Chrom = np.vstack([Chrom[best_ind, :], SelCh])
ObjV = Ackley(Phen)
# 记录
best_ind = np.argmin(ObjV)
obj_trace[gen,0]=np.sum(ObjV)/ObjV.shape[0]
#记录当代种群的目标函数均值
obj_trace[gen,1]=ObjV[best_ind]
var_trace[gen,:]=Chrom[best_ind,:]
x=Phen[:,0]
y=Phen[:,1]
z=-20.0*np.exp(-0.2*np.sqrt((x**2+y**2)/2)) - np.exp((np.cos(2.0*np.pi*x)+np.cos(2.0*np.pi*y))/2) + 20 + np.e
sca = ax.scatter(x,y,z, s=200, lw=0, c='red', alpha=0.5) ;plt.pause(0.05)
#fig=plt.figure()
# ax=Axes3D(fig)
# ax.scatter(x,y,z, s=200, lw=0, c='red', alpha=0.5) ;plt.pause(0.05)
plt.ioff(); plt.show()
g.integerbox(msg="请输入种群个体数目(0-100)",title="遗传算法",lowerbound=0,upperbound=100)
差不多就讲到这里吧。