基于python3.7的遗传算法可视化

基于python3.7的遗传算法可视化

    • 需要的库
    • 可视化工具
    • 遗传算法
    • 适应度函数的选择
    • 显示函数图像
    • 动态显示每次种群在函数图中对应的点
    • 可控的参数设置

需要的库

python的强大在于可以安装非常丰富的库,针对遗传算法已经有非常完善的库了,只需要在里面设计即可,我使用的是Geatpy库,这是一个高性能的Python遗传算法库以及开放式进化算法框架,由华南理工大学、华南农业大学、德州奥斯汀公立大学的学生联合团队开发。如何安装及其使用请查看Geatpy的官方文档。

可视化工具

Tkinter、Tix…非常多的选择,我这里使用的是easygui,为什么使用easygui呢?因为我看的第一本python书《父与子学python…》啥的,具体书名记不清了,里面介绍的就是easygui,入手很简单,剩下就是matplotlib和Axes3D当然了离不开我们的numpy

遗传算法

关于遗传算法,我这里不想多讲了,参考我上一篇文章https://blog.csdn.net/quinn1994/article/details/80501542

适应度函数的选择

我做了一个选择的界面,可以选择几个经典的测试函数,如下
基于python3.7的遗传算法可视化_第1张图片
这里是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
基于python3.7的遗传算法可视化_第2张图片

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()

可控的参数设置

基于python3.7的遗传算法可视化_第3张图片
基于python3.7的遗传算法可视化_第4张图片
这个非常简单
范围是0-100

 g.integerbox(msg="请输入种群个体数目(0-100)",title="遗传算法",lowerbound=0,upperbound=100)

差不多就讲到这里吧。

你可能感兴趣的:(python)