文章目录

  • 一、遗传算法的实现思路
  • 二、基于二进制编码方式的遗传算法的实现
    • 1、库的导入
    • 2、目标函数
    • 3、个体编码函数
    • 4、个体解码函数
    • 5、选择函数
    • 6、交叉函数
    • 7、变异函数
    • 8、算法主流程

一、遗传算法的实现思路

遗传算法(Genetic Algorithm,GA)是一种借鉴生物进化理论,仿照生物的多代遗传过程的随机搜索算法,它以目标问题的不同解作为不同的个体生成种群,然后对种群进行选择、交配、变异操作来寻求最优个体以实现对目标问题的求解。
其主要算法步骤如下:
1)编码生成种群个体,编码方式一般为实数编码或二进制编码;
2)计算种群个体适应度值;
3)选择操作,选出种群中适应度较高的个体,一般使用轮盘赌方法或比例选择法进行选择;
4)交叉操作,根据交叉概率对经过选择后的种群个体进行个体间基因片段的交换,交叉概率一般为固定值;
5)变异操作,根据变异概率对经过选择后的种群个体进行基因片段的改变,变异概率一般为固定值。
6)重复步骤3到步骤5,当达到最大迭代次数或满足停止条件后停止迭代,然后输出种群中的最优个体。

二、基于二进制编码方式的遗传算法的实现

待求解问题Rastrigin函数:
f(x)=20+x^2-10 cos⁡(2πx)+y^2-10cos⁡(2πy)
求最小值,取值范围:x∈[-5,5],y∈[-5,5],精度精确到小数点后五位。

1、库的导入

NumPy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。
这两个库需要提前安装在当前python路径下,在cmd中执行安装指令即可安装在当前python路径,指令如下:

pip install numpy
pip install matplotlib

库的导入指令如下:

import numpy as np
import matplotlib.pyplot as plt

2、目标函数

将上述问题中的x,y视作种群中的一个个体X,待求解问题f(x)即为目标函数,同时作为适应度函数。

def fitness_func(X):pi = np.pix = X[:, 0]y = X[:, 1]return 20 + x ** 2 - 10 * np.cos(2 * pi * x) + y ** 2 - 10 * np.cos(2 * pi * y)

3、个体编码函数

将二进制编码的每个个体转换成十进制编码,由于for函数是从第0位开始,而二进制转换成十进制需要从个位数开始,因此需要另外的计算将其转换成原数值。

def decode(x, a, b):xt = 0for i in range(len(x)):xt = xt + x[i] * np.power(2, i)return a + xt * (b - a) / (np.power(2, len(x)) - 1)

4、个体解码函数

调用3中的解码统一函数decode(),将每个个体解码成由x,y组成的数组形式。

def decode_X(X: np.array):# X.shape[0]为50,即个体数量X2 = np.zeros((X.shape[0], 2))for i in range(X.shape[0]):#获得x的十进制数xi = decode(X[i, :20], -5, 5)#获得y的十进制数yi = decode(X[i, 20:], -5, 5)#将x、y组成的个体赋给数组X2X2[i, :] = np.array([xi, yi])return X2

5、选择函数

使用比例选择法,由于是求最小值,因此要取倒数来评价适应度值,适应度值越大,选择的概率越大。

def select(X, fitness):fitness = 1 / fitness  # fitness越小表示越优秀,被选中的概率越大,因此取倒数做1/fitness 处理fitness = fitness / fitness.sum()  # 获得每个个体的概率# 将X的每一行(也就是每个个体)选取出来,并排排在一起生成一个新的列表,然后将列表转换成一维数组idxidx = np.array(list(range(X.shape[0])))# 从idx中按照适应度值随机选出50个个体,生成一维数组X2_idx,每个个体被选中的概率与其适应度大小相关X2_idx = np.random.choice(idx, size=X.shape[0], p=fitness)# 将X2_idx里的每一列取出来作为数组X的每一行,之后将数组X赋给X2X2 = X[X2_idx, :]return X2

6、交叉函数

每两个个体为一组,针对每组个体的每个基因,随机生成0-1之间的随机数,与交叉概率比较,若小于交叉概率,则对该基因进行交换,完成交换后,新的一组个体取代原先的一组个体。

def crossover(X, c):for i in range(0, X.shape[0], 2):xa = X[i, :]xb = X[i + 1, :]# X.shape[1]为40,即二进制编码长度for j in range(X.shape[1]):# 产生0-1区间的均匀分布随机数,判断是否需要进行交叉替换if np.random.rand() < c:# 如果进行交叉,则将对应的第j个位置的数进行交叉xa[j], xb[j] = xb[j], xa[j]# 用新的个体取代原先的个体        X[i, :] = xaX[i + 1, :] = xbreturn X

7、变异函数

针对种群中的每个个体的每个基因,随机生成0-1之间的随机数,与变异概率比较,若小于变异概率,则对该基因进行变异,即0变成1,1变成0,完成变异后,新的个体取代原先的个体。

def mutation(X, m):for i in range(X.shape[0]):for j in range(X.shape[1]):if np.random.rand() < m:# 0变成1,1变成0X[i, j] = (X[i, j] + 1) % 2return X

8、算法主流程

将交叉概率设为0.3、变异概率设为0.05,种群数量为50,每个个体都是由x,y组成,且x,y都是二进制编码,由于x与y取值范围在[-5,5]之间,且精确到小数点后五位,因此x、y的编码长度均为20,即每个个体的编码长度为40。
二进制编码随机初始化种群个体后进入循环迭代过程,迭代次数为100次,每次迭代过程中依次进行选择、交叉、变异操作,之后将种群解码并计算适应度值,然后保存此次迭代中的最优适应度值(best_fitness)以及对应的最优个体(best_xy),然后将此时的种群作为下一次迭代时的初始种群。
每次迭代过程中输出当前迭代次数以及最优适应度值。
迭代结束后输出最优适应度值以及对应的个体取值。

c = 0.3  # 交叉概率
m = 0.05  # 变异概率
best_fitness = []  # 记录每次迭代最优适应度值
best_xy = [] # 记录每次迭代最优个体
iter_num = 100  # 最大迭代次数
X0 = np.random.randint(0, 2, (50, 40))  # 随机初始化种群,50个个体,每个个体编码长度为40,为50*40的0-1矩阵
for i in range(iter_num):X1 = decode_X(X0)  # 染色体解码fitness = fitness_func(X1)  # 计算个体适应度X2 = select(X0, fitness)  # 选择操作X3 = crossover(X2, c)  # 交叉操作X4 = mutation(X3, m)  # 变异操作# 将二进制转换成十进制,分别获得x,yX5 = decode_X(X4)# 计算适应度值fitness = fitness_func(X5)# 计算结果最小的即为最优适应度值,保存到best_fitness中best_fitness.append(fitness.min())# 将最优个体保存到best_xy中x, y = X5[fitness.argmin()]best_xy.append((x, y))# 将此次的种群作为新一次迭代过程中的初始种群X0 = X4# 输出当前迭代最优效果print("当前迭代次数:", i+1)print("最优适应度值是:", best_fitness[i])
#迭代结束后的最终效果
print("最优值是:%.5f" % best_fitness[-1])
print("最优解是:x=%.5f, y=%.5f" % best_xy[-1])

9、结果绘图
将best_fitness(每次迭代的最优适应度值)进行绘图并保存,可通过图片查看迭代过程中最优适应度值的变化情况。

plt.plot(best_fitness, color='r')
plt.savefig("GA.png")
plt.show()

图中横轴为迭代次数,纵轴为最优适应度值。

参考源码

遗传算法实数编码参考:
智能优化算法之遗传算法(GA)的实现(基于实数编码,Python附源码)

智能优化算法之遗传算法(GA)的实现(基于二进制编码,Python附源码)相关推荐

  1. 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)

    [优化算法]遗传算法GA求解混合流水车间调度问题(附C++代码) 00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算 ...

  2. 详解智能优化算法:遗传算法和蚁群算法

    摘要:智能优化算法又称现代启发式算法,是一种具有全局优化性能.通用性强且适合于并行处理的算法.本文主要为大家带来遗传算法和蚁群算法的详细解读. 本文分享自华为云社区<智能优化算法(1)--遗传算 ...

  3. 智能优化算法之灰狼优化算法(GWO)的实现(Python附源码)

    文章目录 一.灰狼优化算法的实现思路 1.社会等级结构分级 2.包围猎物 3.攻击猎物 4.搜索猎物 二.算法步骤 三.实例 一.灰狼优化算法的实现思路 灰狼优化算法(Grey Wolf Optimi ...

  4. 智能优化算法之鸟群算法(BSA)的实现(Python附源码)

    文章目录 一.鸟群算法的实现思路 1.飞行行为 2.生产者行为 3.乞讨者行为 4.觅食行为 5.保持警戒行为 二.算法步骤 三.实例 一.鸟群算法的实现思路 鸟群算法(Bird Swarm Alog ...

  5. 智能优化算法之萤火虫算法(FA)的实现(Python附源码)

    一.萤火虫算法的实现思路 萤火虫算法(Firefly Algorithm,FA)是由Yang于2010年提出的一种群智能优化算法,在自然界中,萤火虫之间通过自身发光来吸引异性前来交配以及吸引猎物进行捕 ...

  6. 智能优化算法之果蝇优化算法(FOA)的实现(Python附源码)

    一.果蝇优化算法的实现思路 果蝇优化算法(Fruit Fly Optimization Algorithm,FOA)是潘文超于2011年提出的一种群智能优化算法,它模拟自然界中的果蝇进行觅食时的方式, ...

  7. 【特征选择】基于亨利气体溶解度优化算法求解二进制特征选择问题(HGSO)含Matlab源码

    1 简介 最近已经开发了几种元启发式优化算法来解决现实世界的问题.本文提出了一种新的元启发式算法,称为亨利气体溶解度优化 (HGSO),它模仿亨利定律支配的行为来解决具有挑战性的优化问题.亨利定律是一 ...

  8. 智能优化算法:遗传算法(GA)

    目录 目录 1.遗传算法原理介绍及其算子选择 2.算法步骤 3.案例分析 4. 代码实现 1.遗传算法原理介绍及其算子选择 遗传算法(Genetic Algorithm,GA)起源于对生物系统所进行的 ...

  9. 【LEACH协议】基于matlab蝴蝶优化算法WSN安全分簇路由设计【含Matlab源码 2567期】

    ⛄一.蝴蝶优化算法(MBO)简介 1 介绍 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算法.该算法受 ...

最新文章

  1. NSDate获取当前时区的时间
  2. Javascript的IE跟Firefox(火狐)兼容性-转
  3. Python之精心整理的二十五个文本提取及NLP相关的处理案例
  4. 零元学Expression Blend 4 - Chapter 36 来玩捉迷藏吧!!!看看ScrollBar的Disabled与Hidden之差异...
  5. c语言高低位拷贝_C语言中的大小端转换与高低位颠倒
  6. 最少步数(信息学奥赛一本通-T1330)
  7. 跑linux编译什么CPU速度快,linux 加快编译速度
  8. perl的my,our,local等用法
  9. C语言实现栈的进栈与出栈、输出栈顶元素、元素个数、销毁栈
  10. 数值分析·学习 | 平方根法和追赶法matlab实现
  11. 如何获取股票数据接口?
  12. ftp服务器文件编码类型,ftp服务器编码格式
  13. xrandr 只有一个显示屏_特斯拉Model 3显示屏拆解分析
  14. 揭秘3D游戏模型贴图师
  15. pip命令卸载所有库
  16. 《西虹市首富》给我们技术人带来的思考
  17. Python/gensim主题模型库
  18. IDEA使用archetype创建Maven项目(只有两个archetype)
  19. IIS如何设置默认访问https
  20. 陆奇:一个完美主义者的退出

热门文章

  1. 3dmax:3dmax的软件两大常用工具之基本二维图形(线、圆、椭圆、弧、多边形、星形、文本、螺旋线、截面、扩展样条线)之详细攻略
  2. Oracle 访问SQL Server的数据 (通过Oracle gataway)
  3. 动态给div背景图片赋值
  4. Java实现 蓝桥杯 算法提高 扶老奶奶过街
  5. PHP fwrite写入文件,记事本打开乱码
  6. airpods耳机敲击没反应_苹果airpods蓝牙耳机使用感受与使用方法
  7. 漫谈数据库领域职业定位与发展
  8. PIN、PAN、PIN block说明
  9. Dobot相关资料汇总(随时更新)
  10. AURIX Development Studio常用快捷键