遗传算法的手工模拟计算示例(通俗易懂)(包含遗传算法原理、遗传算法代码)
下面是关于“遗传算法”的几个不错的学习资源
遗传算法介绍及手工模拟计算示例(文字版)
遗传算法介绍及手工模拟计算示例(视频讲解版)遗传算法原理介绍(包含二进制编码、解码原理,算法实现,视频讲解版)并分析了选择、交叉、变异的一些思路
学习笔记:
遗传算法简介
遗传算法(Genetic Algorithm,GA)是借鉴生物界进化规律(适者生存和优胜劣汰遗传机制)而演化出来的一类随机搜索算法。最早由美国Michigan大学的Holland教授于20世纪70年代首次提出,起源于60年代对自然和人工自适应系统的研究。复制该算法非常适合于处理传统优化方法难以解决的复杂的和非线性的优化问题。
遗传算法流程
ps概念:
基因:对应每个解的组成分量;
个体:单个个体,相当于待求解优化问题的一个解;
种群:很多个体组成的群体;
适应度:度量某个物种对于生存环境的适应程度;
选择:以一定的概率从种群中选择若干个个体,让其基因有机会遗传给下一代。一般来说,选择过程是一种基于适应度的优胜劣汰的过程;
交叉:两个染色体的某一相同位置DNA被切断,前后两串分别交叉组合成两个新的染色体,也即是基因重组或杂交;
变异:以一定概率将种群中一些交叉后的个体进行变异,产生新的染色体,也即是改变基因。
由遗传算法流程图可以看出,使用上述三种遗传算子(选择算子、交叉算子、变异算子)的遗传算法的主要运算过程如下所述:
- 初始化种群。设置迭代次数(进化代数)计数器t←0;设置最大迭代次数(进化代数)T;随机生成M个个体作为初始群体P(0)。
- 计算种群上每个个体适应度值。计算第t代群体P(t)中各个个体的适应度。
- 选择运算。将选择算子作用于群体。
- 交叉运算。将交叉算子作用于群体,按概率Pc进行交叉操作。
- 变异运算。将变异算子作用于群体,按概率Pm进行变异操作。第t代群体P(t)经过选择、交叉、变异运算之后得到下一代(t+1代)群体P(t+1)。
- 终止条件判断。若t≤T,则:t←t+1,转到步骤2;若t>T,则以进化过程中得到的具有最优适应度的个体作为问题的满意解或最优解输出,终止计算。
**PS:启发式算法背后的思想都是一样的——择优进化,即根据一定的策略使差的解向好的方向发展,使好的解变得更好。其中可以利用保底机制,即下一代的解若比上一代差,则不更新;下一代的解若比上一代好,则更新。 保底机制+更新策略+启发式思想=最优解/近似最优解
%% 遗传算法Matlab代码(此时示例的目标函数为f(x)=x.^2),求最小值)
%% 采用二进制编码方式;选择算子采用轮盘赌方式;交叉算子采用两点交叉法;变异算子采用基本位变异算子(即对于二进制编码符号串所表示的个体,若需要进行变异操作的某一基因座上的原有基因值为0,则将其变为1)
%% 参考up https://www.bilibili.com/video/BV14a411C7s8?spm_id_from=333.880.my_history.page.click&vd_source=77722e5d7039d559546697b243150ac0%% 主程序
function GA()clc
clear
popsize = 30; % 种群大小
chromlength = 20; % 串的长度(个体长度)
pc = 0.6; % 交叉概率
pm = 0.2; % 变异概率
xlim = [0,50]; % 求解范围
Maxiter = 200; % 迭代次数
% x = zeros(1,Maxiter); % 记录每代个体最优位置
% y = zeros(1,Maxiter); % 记录每代最优个体对应的函数值pop = round(rand(popsize,chromlength)); % 随机产生初始种群 直接生成的二进制串
% rand(popsize,chromlength)生成一个由介于 0 和 1 之间,即取值(0,1)的均匀分布的随机数组成的 popsize×chromlength 矩阵
% round(X) 将X的每个元素四舍五入为最近的整数。在对等情况下,即有元素的小数部分恰为 0.5 时,round 函数会偏离零四舍五入到具有更大幅值的整数。
% 这样随机生成的初试种群的值 非0即1
decpop = bintodec(pop,popsize,chromlength,xlim); % 计算初始解对应的十进制
fx = calobjvalue(decpop); % 计算初始解的函数值,形状为1×popsize的矩阵
plotfig(decpop,fx,xlim,1); % 画出初始函数图
[y(1),I] = min(fx); %[M,I] = mix(A) 返回 A 中最小值,以及最小值对应的索引。
x(1) = decpop(I); % 获取最小值对应的变量xfor i = 2:Maxiterdecpop = bintodec(pop,popsize,chromlength,xlim); % 计算上一代解对应的十进制fx = calobjvalue(decpop); % 计算上一代解的函数值fitvalue = calfitvalue(fx); % 适应度映射newpop = copyx(pop,fitvalue,popsize); % 复制newpop = crossover(newpop,pc,popsize,chromlength); %交叉newpop = mutation(newpop,pm,popsize,chromlength); % 变异% 这时的newpop是经过复制交叉变异产生的新一代群体% 下面进行选择择优保留(即优胜劣汰)newdecpop = bintodec(newpop,popsize,chromlength,xlim);new_fx = calobjvalue(newdecpop); % 计算新解目标函数new_fitvalue = calfitvalue(new_fx); % 计算新群体中所有个体的适应度index = find(new_fitvalue < fitvalue); % find(X) 返回一个包含数组X中每个非零元素的线性索引的向量。即若新解的值小于更新前解的值,获取新解的索引(本示例是求最小值)pop(index,:) = newpop(index,:) % 更新得到最新解decpop = bintodec(pop,popsize,chromlength,xlim); % 计算新解的十进制fx = calobjvalue(decpop); % 计算结果plotfig(decpop,fx,xlim,i); % 绘制新解的图% 找出更新后的个体最优函数值[bestindividual,bestindex] = min(fx);y(i) = bestindividual; % 记录每一代的最优函数值x(i) = decpop(bestindex); % 十进制解subplot(1,2,2);plot(1:i,y);title('适应度进化曲线');i = i+1;
end
[ymin,min_index] = min(y);
disp(['最优解对应的位置为:', num2str(x(min_index))])
disp(['最优解为:', num2str(ymin)])
end%% 计算适应度
function fitvalue = calfitvalue(fx)
% 这里求最小值,并且函数值又都大于等于0,所以直接使用函数值本身作为适应度值
% 不同的问题构造适应度函数的方法不同
fitvalue = fx;
end%% 复制操作 按适应度大小映射为概率,进行轮盘赌复制
% 轮盘赌基本思想:适应度越高的解,按道理越应该高概率的进行复制,且复制的份数应该越多
function newx = copyx(pop,fitvalue,popsize) % 传进来二进制串和对应适应度值
% 利用轮盘赌策略对个体进行复制
newx = pop; % 只是起到申请size为pop大小空间的作用,newx之后要更新的
i = 1; j = 1;
p = fitvalue / sum(fitvalue); % 对于每个个体,计算对应适应度.即被选择的概率
Cs = cumsum(p);
% cumsum(A) 从 A 中的第一个其大小不等于 1 的数组维度开始返回 A 的累积和
% 如p为 0.2 0.1 0.4 0.3 则对应 Cs 为0.2 0.3 0.7 1.0
R = sort(rand(popsize,1)); % 每个个体的复制概率,升序排序
while j <= popsizeif R(j) < Cs(i)newx(j,:) = pop(i,:);j = j+1;elsei = i+1;end
end
end%% 交叉操作 1和2,3和4,以一定概率决定是否交叉。若交叉,则两者选择随机一个段进行交叉
function newx = crossover(pop,pc,popsize,chromlength)
% 12 34 56交叉方式,随机选择交叉位点
% 注意个体数为奇数偶数的区别
i = 2;
newx = pop; % 申请空间
while i+2 <= popsize% 将第i与i-1进行随机位点交叉if rand < pcx1 = pop(i-1,:); % 第i-1个个体x2 = pop(i,:); % 第i个个体r = randperm(chromlength,2); % 返回范围内两个整数 p = randperm(n,k)返回行向量,其中包含在 1 到n之间随机选择的k个唯一整数。r1 = min(r); r2 = max(r); % 交叉复制的位点newx(i-1,:) = [x1(1:r1-1),x2(r1:r2),x1(r2+1:end)];newx(i,:) = [x2(1:r1-1),x1(r1:r2),x2(r2+1:end)];endi = i + 2; % 更新i 2,4,6,8...
end
end%% 变异 按照一定概率决定该个体是否变异,若变异,随机选择一个位点进行变异:按位取反
function newx = mutation(pop,pm,popsize,chromlength)
i = 1;
while i <= popsizeif rand < pmr = randperm(chromlength,1);pop(i,r) = ~ pop(i,r); % 按位取反endi = i+1;
endnewx = pop; % 将变异后的结果返回
end%% 二进制转十进制函数
function dec = bintodec(pop,popsize,chromlength,xlim)
dec = zeros(1,chromlength);
index = chromlength-1:-1:0; % chromlength=10 chromlength-1:-1:0 为 9 8 7 6 ... 0
for i = 1:popsizedec(i) = sum(pop(i,:).*(2.^index)); % 将二进制数转成十进制
end
dec = xlim(1) + dec*(xlim(2) - xlim(1)) / (2 ^ chromlength -1); % 获得二进制串对应的实值解
end%% 绘制图像
function plotfig(decpop,fx,xlim,k)
f = @(x) (x.^2);
x = xlim(1):0.05:xlim(2);
y = f(x);
subplot(1,2,1);
plot(x,y,decpop,fx,'o');
title(['第',num2str(k),'次迭代进化'])
pause(0.1); % pause(n) 暂停执行 n 秒,然后继续执行。必须启用暂停,此调用才能生效。
end%% 目标函数
function fx = calobjvalue(decpop) % 参数为十进制
f = @(x) (x.^2);
fx = f(decpop);
end
上面程序结果
遗传算法解决TSP问题代码实例
遗传算法的手工模拟计算示例(通俗易懂)(包含遗传算法原理、遗传算法代码)相关推荐
- tensor如何实现转置_PyTorch中的傅立叶卷积:通过FFT有效计算大核卷积的数学原理和代码实现...
卷积 卷积在数据分析中无处不在.几十年来,它们已用于信号和图像处理.最近,它们已成为现代神经网络的重要组成部分. 在数学上,卷积表示为: 尽管离散卷积在计算应用程序中更为常见,但由于本文使用连续变量证 ...
- 最通俗易懂的YOLOv3原理及代码解析
YOLO是一种端到端的目标检测模型.YOLO算法的基本思想是:首先通过特征提取网络提取输入特征,得到特定大小的特征图输出.输入图像分成13×13的网格单元,接着如果真实框中某个对象的中心坐标落在某个网 ...
- 蒙特卡罗模拟_Stata博文 | 使用蒙特卡罗模拟计算功率part 1:基础知识
功率和样本大小的计算是科学研究计划的重要组成部分.可以使用Stata的power命令来计算许多常用统计测试的功率和样本大小需求.但对于更复杂的模型是没有简单公式的,如多层/纵向模型和结构方程模型(SE ...
- 【计算机网络】物理层 : 调制 ( 数字数据 调制 模拟信号 | 调幅 | 调频 | 调相 | 调幅 + 调相 QAM | 计算示例 | 模拟信号 调制为 模拟信号 )
文章目录 一. 数字数据调制技术 二. 调幅 三. 调频 四. 调相 五. QAM 调制 和 计算示例 六.模拟信号 调制为 模拟信号 一. 数字数据调制技术 数字数据调制 技术 : ① 调制 : 发 ...
- 【计算理论】下推自动机 PDA 及 计算示例
文章目录 一. 下推自动机 二.下推自动机 计算过程 三.下推自动机 计算结果 四.下推自动机 计算示例 一. 下推自动机 1 . 下推自动机 由来 : 下推自动机 ( PDA ) 是在 确定性有限自 ...
- 【数据挖掘】卷积神经网络 ( 视觉原理 | CNN 模仿视觉 | 卷积神经网络简介 | 卷积神经网络组成 | 整体工作流程 | 卷积计算图示 | 卷积计算简介 | 卷积计算示例 | 卷积计算参数 )
文章目录 I . 人类的视觉原理 II . 卷积神经网络 模仿 视觉原理 III . 卷积神经网络简介 IV . 卷积神经网络 组成 V . 卷积神经网络 工作流程 VI . 降低样本参数数量级 VI ...
- 第9节 蒙卡模拟计算美式期权价格(b)
第9节 蒙卡模拟计算美式期权价格(b) 9.1 简介 9.2 参数化执行边界算法 9.3 算法Python代码实现 9.4 计算示例 9.5 参考资料 9.1 简介 使用蒙卡模拟计算美式期权价格除了最 ...
- 第7节 蒙卡模拟计算路径依赖型期权价格
第7节 蒙卡模拟计算路径依赖型期权价格 7.1 简介 7.2 蒙卡模拟计算回望/亚式期权算法 7.3 算法 Python 代码实现 7.4 计算示例 7.5 相关说明 7.5.1 由均匀分布产生正态分 ...
- 第8节 蒙卡模拟计算美式期权价格(a)
第8节 蒙卡模拟计算美式期权价格(a) 8.1 简介 8.2 最小二乘法计算美式期权价格 8.3 算法Python代码实现 8.4 计算示例 8.5 相关说明 8.5.1 美式看涨期权不会被提前行使 ...
- IO-Link工业总线型汽车撑杆装配线RFID写卡器CK-FR05-IO计算示例
TAT 计算公式(单位:毫秒) TAT = 命令传送时间+通信时间+响应传送时间 命令和响应传送时间根据所发送的字符数和通信条件产生变化. 寄存器数量 2) (13 波特率( ) 10 1000 读操 ...
最新文章
- 数字图像处理:图像就是函数的解读
- linux打开文件命令occ,Linux系统查看文件内容的命令有哪些?
- 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA
- Arcgis for Javascript实现两个地图的联动
- SQLServer基本函数(转)
- c语言程序设计教程岳莉答案,C++程序设计教程
- python程序员脱单攻略_520 情人节 :属于 Python 程序员的脱单攻略大合集(视频版)...
- 指针右左法则----复杂指针解析
- html 经常会用到的英语名词
- 07-异常处理——动手动脑
- vue实践06-项目实践
- 基于Ext Core的包含校验功能的表单提交扩展Ext.ux.submit
- VC中,如何将十六进制字符串转换为十进制数?
- C++--第26课 - 异常处理 - 下
- css摇杆,【宅家呗专题】Virtual Joystick虚拟摇杆插件教程
- 网吧母盘网上精华+个人总结=超详细
- 在Oracle中,什么是物理读和逻辑读?
- 小日期时间型_利于就业的汽车拆解技术服务师证报名时间、考试流程分几个级别?...
- 大数据管理神器:Ambari自定义stack和服务二次开发详细教程
- linux归档和压缩的区别,文件的归档和压缩
热门文章
- C++ stack(STL stack)
- C++中this指针
- 【我的Android进阶之旅】Realm数据库学习资料汇总(持续更新)
- 安全公司-* * * *-面试题:_ 安卓逆向分析分享
- 基础的数据处理(1)—出租车数据的基础处理,由gps生成OD(pandas)
- java反编译有什么用处_Java反编译工具有什么用,Java反编译工具使用解析
- kali linux下sqlmap使用教程
- Ansible - 自动化运维工具
- vs2019轻松完成python项目创建
- 微信开发者工具下载及公众号使用介绍