总的来说就是广撒网,选择性捕捞(代码在最下方,理论知识到处都有,代码才是最实在的)

遗传算法用途

  • 主要用于寻找目标函数最优解(最大,最小值)
  • 相对退火法,遗传算法更有可能跳出局部最优解,得到全局最优解

遗传算法核心思想(代码的核心四个部分)

  • 遗传算法是仿照了达尔文的生物进化概念:“物竞天择,适者生存

  • 选择:选择更适合生存者,淘汰劣势者。

  • 交叉:下一代获得父母的基因片段,以得到更加优良的基因。

  • 变异:光靠父母的基因不一定能够生存下来,环境等影响会造成基因的变异,使得其能跳出父母基因的限制,得到更适合生存的基因。

  • 经过这样一轮轮的选择,优良的基因(自变量)就被选择出来了。

  • 概率选择:自然界中,越适应的个体就越有可能繁殖后代。但是也不能说适应度越高的就肯定后代越多,只能是从概率上来说更多。对于上述三点“选择,交叉,变异”,遗传算法并不是(并不是劣势者就一定会被淘汰)常规的算法那种得到的值比其他值差就淘汰,而是给一个概率(谁说劣势者就一定会灭亡,它也有生存下去的可能,只是生存的几率低罢了),这个概率取决于个体的适应度大小(优化算法中即所得到的目标函数大小),这里使用轮盘赌来进行选择


  • 适者生存下来的概率大些,但概率小的也不见得不能生存下来。你可以想象一下,我们转动轮盘,轮盘停下来的时候,指针会随机地指向某一个个体所代表的区域,那么非常幸运地,这个个体被选中了(很明显,适应度评分越高的个体被选中的概率越大)。

  • 添加概率选择后,算法便多了可选择性,有了更多的可能,更容易跳出局部最优解。

  • 下图是遗传算法的结构图

  • 其中,GEN是当前代数;M是种群规模,i代表种群数量。

编码处理

如果对代码比较熟练的,上面的介绍应该已经有一个大概的了解了。接下来主要是遗传算法转换成代码的一些细节处理。

  • 遗传算法对于我们来说,主要是想使用一个输入得到一个函数的最优解,所以在这里输入的选择是怎么样的呢?
  • 为了契合生物进化这个概念,对于输入应该进行一个编码,因为大多数遗传算法都使用二进制编码进行运算,所以此文只讨论二进制编码作为输入。
  • 对于一个简单函数:y=x1+x2求最大值, 有两组解x1={1,3,4,2,5},x2={2,4,1,5,3}
  • 当然我们可以直接看出第五个解x1=5,x2=3是最优解,
  • 用二进制进行编码,例如5=0101,3=0011,那么总体编码可以写为01010011。编码只是一种形式,计算还是要以对应的数字进行计算。
  • 想想1在计算机的二进制形式是什么?如果八位来表示的话,是不是就是0000 0001;8是不是就是0000 1000;以此类推,那么我们这里也是这样,把对应的x值换算成这种编码形式,我们这里可以看到x的范围是0-5吧,如果按照计算机这样的方式是不是到0000 0101这里就完事了?想想这样多短,前面五位都没有用上多浪费呀,那么要想都用上怎么办呢?也很简单,我们把0000 0001不认为是1不就可以了吗?因为1111 1111是255,那么如果说每一份为1/255的话,那么0000 0001不就是1/255了吗?这个时候1怎样表示了?不就是1111 1111吗?好了我们把范围扩大一些吧,每一份不是1/255,而是1/255*5,那么这个时候最大值是多少?是不是5,恩,这样x编码的范围就在0-5之间了。
  • 对于精确到多少位小数,这会影响二进制编码位数的选择
  • 明显地,一定长度的二进制编码序列,只能表示一定精度的浮点数。譬如我们要求解精确到六位小数,由于区间长度为2 – (-1) = 3 ,为了保证精度要求,至少把区间[-1,2]分为3 × 106等份。又因为
    所以编码的二进制串至少需要22位。(具体情况具体分析)

代码:目标函数

  • matlab输入下列代码运行:
  • fplot(@(x)4.*cos(2.*x).*sin(6.*x)+10.*sin(5.*x).*sin(3.*x)-3.*abs(x-5)+10,[0 10]);
  • 自己定义所需目标函数。
  • 总共八个m文件
  • 初始种群:initpop.m
%初始化种群大小
%输入变量:
%popsize:种群大小
%chromlength:染色体长度-->>转化的二进制长度
%输出变量:
%pop:种群
function pop=initpop(popsize,chromlength)
pop = round(rand(popsize,chromlength));
%rand(3,4)生成3行4列的0-1之间的随机数
% rand(3,4)
%
% ans =
%
%     0.8147    0.9134    0.2785    0.9649
%     0.9058    0.6324    0.5469    0.1576
%     0.1270    0.0975    0.9575    0.9706
%round就是四舍五入
% round(rand(3,4))=
% 1 1 0 1
% 1 1 1 0
% 0 0 1 1
%所以返回的种群就是每行是一个个体,列数是染色体长度
  • 主函数:main.m
function main()
clear;
clc;
%种群大小
popsize=100;
%二进制编码长度
chromlength=10;
%交叉概率
pc = 0.6;
%变异概率
pm = 0.001;
%初始种群
pop = initpop(popsize,chromlength);for i = 1:100%计算适应度值(函数值)objvalue = cal_objvalue(pop);fitvalue = objvalue;%选择操作newpop = selection(pop,fitvalue);%交叉操作newpop = crossover(newpop,pc);%变异操作newpop = mutation(newpop,pm);%更新种群pop = newpop;objvalue = cal_objvalue(pop);fitvalue = objvalue;%寻找最优解[bestindividual,bestfit] = best(pop,fitvalue);x2 = binary2decimal(bestindividual);x1 = binary2decimal(newpop);y1 = cal_objvalue(newpop);if mod(i,10) == 0pause(1);figure(1);cla;fplot(@(x)4.*cos(2.*x).*sin(6.*x)+10.*sin(5.*x).*sin(3.*x)-3.*abs(x-5)+10,[0 10]);hold on;plot(x1,y1,'*');title(['迭代次数为n=' num2str(i)]);end
end
fprintf('The best X is --->>%5.2f\n',x2);
fprintf('The best Y is --->>%5.2f\n',bestfit);
  • 选择函数:selection.m
%如何选择新的个体
%输入变量:pop二进制种群,fitvalue:适应度值
%输出变量:newpop选择以后的二进制种群
function [newpop] = selection(pop,fitvalue)
%构造轮盘
[px,py] = size(pop);
totalfit = sum(fitvalue);
p_fitvalue = fitvalue/totalfit;
p_fitvalue = cumsum(p_fitvalue);%概率求和排序
ms = sort(rand(px,1));%从小到大排列
fitin = 1;
newin = 1;
while newin<=pxif(ms(newin))<p_fitvalue(fitin)newpop(newin,:)=pop(fitin,:);newin = newin+1;elsefitin=fitin+1;end
end
  • 交叉函数:crossover.m
%交叉变换
%输入变量:pop:二进制的父代种群数,pc:交叉的概率
%输出变量:newpop:交叉后的种群数
function [newpop] = crossover(pop,pc)
[px,py] = size(pop);
newpop = ones(size(pop));
for i = 1:2:px-1if(rand<pc)cpoint = round(rand*py);newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];elsenewpop(i,:) = pop(i,:);newpop(i+1,:) = pop(i+1,:);end
end

变异函数:mutation.m

%函数说明
%输入变量:pop:二进制种群,pm:变异概率
%输出变量:newpop变异以后的种群
function [newpop] = mutation(pop,pm)
[px,py] = size(pop);
newpop = ones(size(pop));
for i = 1:pxif(rand<pm)mpoint = round(rand*py);if mpoint <= 0mpoint = 1;endnewpop(i,:) = pop(i,:);if newpop(i,mpoint) == 0newpop(i,mpoint) = 1;elseif newpop(i,mpoint) == 1newpop(i,mpoint) = 0;endelsenewpop(i,:) = pop(i,:);end
end
  • 二进制转十进制:binary2decimal.m
%二进制转化成十进制函数
%输入变量:
%二进制种群
%输出变量
%十进制数值
function pop2 = binary2decimal(pop)
[px,py]=size(pop);
for i = 1:pypop1(:,i) = 2.^(py-i).*pop(:,i);
end
%sum(.,2)对行求和,得到列向量
temp = sum(pop1,2);
pop2 = temp*10/1023;
  • 目标函数:cal_objvalue.m
%计算函数目标值
%输入变量:二进制数值
%输出变量:目标函数值
function [objvalue] = cal_objvalue(pop)
x = binary2decimal(pop);
%转化二进制数为x变量的变化域范围的数值
objvalue=4.*cos(2.*x).*sin(6.*x)+10.*sin(5.*x).*sin(3.*x)-3.*abs(x-5)+10;
  • 选择最优个体:best.m
%求最优适应度函数
%输入变量:pop:种群,fitvalue:种群适应度
%输出变量:bestindividual:最佳个体,bestfit:最佳适应度值
function [bestindividual bestfit] = best(pop,fitvalue)
[px,py] = size(pop);
bestindividual = pop(1,:);
bestfit = fitvalue(1);
for i = 2:pxif fitvalue(i)>bestfitbestindividual = pop(i,:);bestfit = fitvalue(i);end
end

效果图如下


  • 最终结果:

动态图显示代码

将主函数替换成下述代码,即可生成一个gif动态图显示

for i = 1:100%计算适应度值(函数值)objvalue = cal_objvalue(pop);fitvalue = objvalue;%选择操作newpop = selection(pop,fitvalue);%交叉操作newpop = crossover(newpop,pc);%变异操作newpop = mutation(newpop,pm);%更新种群pop = newpop;objvalue = cal_objvalue(pop);fitvalue = objvalue;%寻找最优解[bestindividual,bestfit] = best(pop,fitvalue);x2 = binary2decimal(bestindividual);x1 = binary2decimal(newpop);y1 = cal_objvalue(newpop);
%     if mod(i,10) == 0pause(1);figure(1);cla;fplot(@(x)4.*cos(2.*x).*sin(6.*x)+10.*sin(5.*x).*sin(3.*x)-3.*abs(x-5)+10,[0 10]);hold on;plot(x1,y1,'*');title(['迭代次数为n=' num2str(i)]);frame=getframe(gcf);imind=frame2im(frame);[imind,cm] = rgb2ind(imind,256);if i==1imwrite(imind,cm,'test.gif','gif', 'Loopcount',inf,'DelayTime',1e-4);elseimwrite(imind,cm,'test.gif','gif','WriteMode','append','DelayTime',1e-4);end
%     end
end
fprintf('The best X is --->>%5.2f\n',x2);
fprintf('The best Y is --->>%5.2f\n',bestfit);

如果觉得麻烦,可在我的下载中直接下载代码

寻优算法(1)-------遗传算法(GA)附Matlab代码(copy可用)相关推荐

  1. 【GA算法】遗传算法原理及其Matlab代码

    翻阅几篇遗传算法的文章,这篇通俗易懂,且逻辑清楚,最适合入门,不用担心遗漏关键点. 遗传算法,先选择,交叉和变异顺序可更换. 轮盘赌部分,参考了另外一篇文章的解释. 此外,还有一些有价值的文献: 选择 ...

  2. 数学建模各类算法学习笔记(附matlab代码)

    目录 插值和拟合 线性规划 综合评价1:层次分析法(Analytic Hierarchy Process)AHP 综合评价2:Topsis(优劣解距离法) 最优解问题1:遗传算法Genitic alg ...

  3. 【WSN定位】基于chan算法、fang算法、taylor算法实现目标定位附Matlab代码

    1 内容介绍 节点定位问题是无线传感器网络(WSN)面临的一个难点,科技的发展与进步使得对无线传感器网络定位的要求也与日俱增.没有合理的定位技术,无线传感器网络的应用范围将受到极大的限制,目前改进定位 ...

  4. 【图像修复】基于criminis算法实现图像修复附matlab代码

    1 内容介绍 该算法出自Criminisi的论文 Region Filling and Object Removal by Exemplar-Based Image Inpainting 该算法只要思 ...

  5. 【车间调度】基于改进帝国企鹅算法求解车间调度问题附matlab代码

    1 内容介绍 传统车间调度问题仅仅考虑工件的分配问题.而柔性车间调度问题在传统车间调度问题上做了一定的延伸,它更接近实际生产过程的原因是由于其在传统车间调度问题中加入了对加工机器的选择.因此对其的研究 ...

  6. 【图像重建】基于布雷格曼迭代(bregman alteration)算法集合ART算法实现CT图像重建附matlab代码

    1 简介 Fluorescence diffuse optical tomography (fDOT) is a noninvasive imaging technique that makes it ...

  7. 【雷达】基于RD、RMA、CS三种算法实现雷达成像附matlab代码

    1 简介 基于RD.RMA.CS三种算法实现雷达成像matlab代码​ 2 完整代码 %Chirp Scaling二维成像仿真. %抛物面聚焦,条带测绘,正侧视工作方式. 匹配滤波.%目标为3个散射点 ...

  8. 【智能优化算法】基于文化和谐和学习算法优化模糊函数FUZZY附matlab代码

    1 简介 This paper studies the constrained optimization problem for nonlinear diesel blending. A new hy ...

  9. nlm算法matlab代码_遗传算法GA的MATLAB代码

    MATLAB 实现算法代码: GA (遗传算法)--整数编码 function [BestGene,aa] = GA(MaxGeneration,GeneSize,GeneNum,pcross,pmu ...

  10. MATLAB算法实战应用案例精讲-【智能优化算法】多目标蚁狮优化算法(MOALO)(附matlab代码实现)

    前言 多目标蚁狮优化算法(Multi-Objective Antlion Optimization,MOALO)是蚁狮优化算法算法的多目标版本,是Mirjalil 等人于2016年提出来的一种多目标优 ...

最新文章

  1. Redis分布式锁实现
  2. UOJ 152 汉诺塔 分治
  3. [Swift]LeetCode781. 森林中的兔子 | Rabbits in Forest
  4. 撒花!中文翻译仓库链接已加入 ML.NET 官方示例网站首页
  5. 优秀Java开发者都在看的书籍
  6. Python使用Pillow(PIL)库实现验证码图片
  7. gta4 l3环境优化补丁_【安全刻不容缓】快给你们的爱7打打补丁吧 俄罗斯大佬的持续更新补丁包来了...
  8. html文本延迟加载,LazyLoad 延迟加载(按需加载)
  9. 区块链(BlockChain)基础概念
  10. Hive教程(01)- 初识Hive
  11. 运放做跟随器有什么要求
  12. canvas绘制五角星
  13. 消防信号总线原理_消防联动工作原理
  14. MCTS (Monte Carlo Tree Search)
  15. Cygwin的安装使用,及其软件包apt-cyg的配置使用,以及apt-cyg错误“/usr/bin/apt-cyg: line 25: $‘\r‘: command not found”解决
  16. Lp_LIBRARY 相关问题解决
  17. 维特比算法(基于李航)
  18. 华为智慧屏 鸿蒙UI 适配荣耀,鸿蒙OS首秀 荣耀智慧屏发布,仅3799元起
  19. 一篇文章让你全面了解TDengine
  20. 服务器sever2008如何取消IE增强安全配置

热门文章

  1. 响铃:揭底滴滴们跨界营销“真相”,再教你玩一出好戏
  2. 解决git报错[remote rejected] HEAD -> master (pre-receive hook declined) error: failed to push some...
  3. android 触摸屏部分失灵,触摸屏失灵修复小技巧
  4. 焦距换算倍率(Focal length ratio)
  5. 逆向工程(MyBatis)
  6. 查询课程数mysql_mysql_数据查询练习
  7. 大数据小项目之电视收视率企业项目05
  8. 任务队列:celery快速入门及django中celery的用法
  9. Docker(五)——Docker镜像仓库
  10. 海康摄像头忘记密码,自己如何快速重置密码