实值遗传算法求解函数极值问题(基于MATLAB)

声明:

1.本文源代码来自书目《智能优化算法及其MATLAB实例(第3版)》,目的在于为MATLAB初学者提供更简明的代码解析,方便读者了解算法及MATLAB编程基本原理。

2.文中代码每一行后都有相应注释,因此本文是一篇适合所有代码水平的学习者阅读的文章。

在例2.1中我们采用的是标准遗传算法,即采用二进制来进行基因编码。而另一种常用的编码方式为实值编码,即每个基因位不再是0或1,变成了一个实数。本文就是讨论在这样的编码机制下,利用MATLAB编程求解函数的极值问题。
补充知识:”君主法“选择交叉方式
在定义适应度函数后,对种群按适应度值升序排列,选取最优个体作为君主染色体,并按照排列后的顺序选取偶数位的染色体依次与君主染色体交叉,完成交叉过程。将得到的子代与父代合并后,再次按适应度值排序后取前NP个染色体作为下一次循环的种群,这就完成了选择过程。

例2.2 计算函数f(x)=x12+x22+···xn2(-20<=xi<=20)的最小值,其中个体x的维数n=10。这是一个简单的平方和函数,只有一个极小点在0处取得为0。

基于实值遗传算法的MATLAB求解代码如下:

%%%%%实值遗传算法求解求和函数极值问题%%%%%%%%
%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%
clear all;             %清除所有变量
close all;             %清图
clc;                   %清屏
D=10;                  %单条染色体上基因数目为10
NP=100;                %染色体数目,即种群规模或取样样本数目
Xs=20;                 %上限
Xx=-20;                %下限
G=1000;                %最大遗传代数
f=zeros(D,NP);         %创建并初始化初始种群二维数组
nf=zeros(D,NP);        %创建并初始化子代种群二维数组由于我们选择和交叉采用君主方案,所以每代数目都为NP
Pc=0.8;                %交叉概率
Pm=0.1;                %变异概率
f=rand(D,NP)*(Xs-Xx)+Xx;%随机生成初始种群,rand(A,B)表示生成A行B列【0,1】随机小数矩阵
%%%%%%%%%%%%按适应度升序排列%%%%%%%%%%%%%%%%
for np=1:NP            %对于初始种群中的每条染色体FIT(np)=func2(f(:,np));%定义第np个体的适应度函数,以第np个个体的染色体基因序列数组为自变量
end
[SortFIT,Index]=sort(FIT);%按照升序对适应度函数值排序,%返回的SortFIT是排序好的适应度函数值数组,%返回Index是新数组中元素对应原索引值数组。
Sortf=f(:,Index);         %sortf为排序好的种群矩阵
%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%
for gen=1:G%%%%%%%采用君主方案进行选择和交叉操作%%%%%%%%%%%%%%Emper=Sortf(:,1);     %选出君主染色体数组(由于最终求的是最小值,故适应度最低的是最优个体)NoPoint=round(D*Pc);  %每次交叉点的个数,round为四舍五入取整PoPoint=randi([1,D],NoPoint,NP/2);%随机生成发生交叉的偶数染色体上发生交叉基因的位置矩阵nf=Sortf;for i=1:NP/2          %进行交叉nf(:,2*i-1)=Emper;%在排序好的种群中把所有奇数位(不参与交叉的那些)替换为君主染色体nf(:,2*i)=Sortf(:,2*i);for k=1:NoPoint nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);%奇数位和偶数位染色体在前面求得的交叉位置发生交叉     nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));endend%%%%%%%%变异操作%%%%%%%%%%%%%for m=1:NP          %对种群中每一个个体for n=1:D       %对第m个个体的第n个基因位r=rand(1,1);%生成一个【0,1】随机数if r<Pmnf(n,m)=rand(1,1)*(Xs-Xx)+Xx;%若满足变异条件,则随机生成题述范围内的实值替换相应位置完成变异endendend%%%%%%%子种群按适应度升序排列%%%%%%%%%for np=1:NP         %模仿对初始种群操作即可NFIT(np)=func2(nf(:,np));end[NSortFIT,Index]=sort(NFIT);NSortf=nf(:,Index);%%%%%%产生新种群%%%%%%%%%%%%%%%%%%%%%%f1=[Sortf,NSortf];  %先对父代和子代进行合并FIT1=[SortFIT,NSortFIT];%对父代和子代的适应度值合并[SortFIT1,Index]=sort(FIT1);%对新的适应度函数值数组进行升序排列Sortf1=f1(:,Index);      %按适应度排列个体SortFIT=SortFIT1(1:NP); %排序后取前NP个个体构成下一次循环种群适应度值数组Sortf=Sortf1(:,1:NP);   %下一次循环种群矩阵trace(gen)=SortFIT(1);  %记录历代最优适应度值
end
Bestf=Sortf(:,1)            %输出最优个体基因序列数组,即取最小值时的【xi】取值
disp(['最终得到最优个体适应度值,即函数最小值为:']);
trace(end)                 %命令行中输出函数最小值(想要把值输出来就不要加分号)
figure                      %画出适应度进化曲线
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%%%%%%%%适应度进化函数%%%%%%%%%%%%%
function result=func2(x)
summ=sum(x.^2);%以目标函数作为适应度函数
result=summ;
end

最终运行结果如下所示:

实值遗传算法求解函数极值问题(基于MATLAB)相关推荐

  1. python实现遗传算法求解函数极值问题

    python实现遗传算法求解函数极值问题 import random import numpy as np #定义染色体类 class chromosome:def __init__(self,chr ...

  2. 【优化求解】基于matlab禁忌搜索算法求解函数极值问题【含Matlab源码 1204期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [优化求解]基于matlab禁忌搜索算法求解函数极值问题[含Matlab源码 1204期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

  3. 【建模算法】基于遗传算法求解TSP问题(matlab求解)

    [建模算法]基于遗传算法求解TSP问题(matlab求解) TSP (traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增 ...

  4. 【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1337期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab遗传算法求解旅行商问题[含Matlab源码 1337期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  5. 【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1909期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[GA TSP]基于matlab遗传算法求解旅行商问题[含Matlab源码 1909期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  6. matlab遗传算法非线性约束,遗传算法求解约束非线性规划和Matlab实现.pdf

    维普资讯 第21卷第 1期 大 学 数 学 Vo1.21,№ .1 2005年 2月 CoLLEGE M ATHEMATICS Feb.2005 遗传算法求解约束非线性规划及 Matlab实现 倪金林 ...

  7. 运用遗传算法求解函数极值(fortran)

    运用遗传算法求解函数极值(fortran) 写在前面 遗传算法的前世今生 算法步骤简介 遗传算法的主体结构 开始求解: 结果显示: 最后再来说一些需要注意的地方 写在前面 这篇文章适合一些应急学习最优 ...

  8. 利用遗传算法求解函数极值

    1.利用遗传算法求解函数极值 例1 利用遗传算法求函数 f(x) = 11sin(6x) + 7cos(5x),x∈[- π,π]的最大值点. 解:在MATLAB中编制绘制函数曲线的代码,运行得到题中 ...

  9. 人工智能 遗传算法 计算函数极值问题

    人工智能 遗传算法 计算函数极值问题 系列文章 人工智能 倒啤酒问题 python解法 人工智能 水壶问题 python解法 A*算法之八数码问题 python解法 A*算法之野人传教士问题 pyth ...

最新文章

  1. android 上传到了maven,但是报错找不到jar
  2. SQL-Oracle游标
  3. phpVirtualBox – 用浏览器操作虚拟机
  4. 前端裁剪头像框_不懂技术和工艺,当心高功率激光焊接头“热”过头
  5. docker运行jar包
  6. redhat7 上安装dummynet
  7. 小米平板4刷recovery教程_小米4刷第三方recovery教程和方法
  8. itextpdf使用总结
  9. Endnote插入Word参考文献国标格式
  10. vue 调用移动录像_vue H5项目调用手机摄像头录像并上传
  11. 如何构建稳的商期货cary合
  12. 何恺明组新论文:只用ViT做主干也可以做好目标检测
  13. 简述观察法的优缺点_各种观察法的优缺点
  14. 【手把手教你如何从Tushare库下载股票数据,并保存在硬盘当中,第一篇数据过滤】
  15. 利用自媒体推广实用好方法!
  16. python学习教程12-从文本中获取电话号码2
  17. java毫秒值转换成日期_Java学习笔记day08
  18. 线程的 run() 和 start() 有什么区别?
  19. 无人直播慢直播设备介绍
  20. (一)白皮书、绿皮书、蓝皮书和黄皮书的区别

热门文章

  1. 案例解读 | 重蹈美国制造业空心化老路,波音数字化出了啥问题?
  2. vue实现点击按钮,复制图片、文本到粘贴板
  3. js 获取某一年第多少天是周几
  4. 测试开发是什么?什么是测试开发工程师?软件测试开发详谈
  5. FpML to QuantLib 外滙美式選擇權估值
  6. 在职研究生报考条件2020年
  7. 触摸屏式温控器参数笔记(五)(di设定)
  8. bash shell中的退出状态码
  9. 高级数据结构一书中的内容来源
  10. 高等数学(第七版)同济大学 习题9-8 个人解答