遗传算法提供了一种求解非线性、多模型、多目标等复杂系统优化问题的通用框架。

先从例子开始,慢慢再总结理论。。。

【例】利用遗传算法计算函数f(x)=x*cos(5*pi*x)+3.5在区间[-1,2.5]上的最大值

先在工作区建立上面函数的一个m文件并保存,命名为fun_sigv.m:

function y=fun_sigv(x)
y=x.*cos(5*pi*x)+3.5;

代沟是父代中需要经过选择、交叉、变异得到下一代的比例,例如父代共100个个体,代沟为0.9,表明有90个个体被选中进行上述一系列操作进化到下一代,剩下10%不变、直接进入下一代,也即下一代还是100个个体。

tarce是代数*2的二维矩阵,存储各子代种群最优解和各子代种群平均值

fieldd是区域描述器,有的书中[1]叫译码矩阵。其结构为

  FieldD=[len,lb,ub,code,scale,lbin,ubin]';('代表转置,也就是FieldD是列向量)

  len是每个chrom的长度,lb和ub是行向量,分别指明每个变量使用的下界和上界。

  code是二进制行向量,code(i)=1为标准二进制编码,code(i)=0为格雷码。

  scale是二进制行向量,指明每个子串是否使用对数或算数刻度。0为算数刻度,1为对数刻度。

  lbin和ubin是二进制行向量,指明表示范围中是否包含每个边界。选择lbin=0或ubin=0,从表示范围中去掉边界;lbin=0或ubin=1则表示包含边界。

fieldd在二进制串到实值转换函数bs2rv中用到:Phen=bs2rv(Chrom,FieldD),即根据译码矩阵FieldD将二进制串矩阵Chrom转换为实值向量。返回矩阵Phen包含对应的种群表现型。对于bs2rv函数,如果使用对数刻度,其范围不能包含零。

下面是MATLAB代码:

opt_minmax=1;   %目标优化类型:1最大化、0最小化
num_ppu=50; %种群规模即个体个数
num_gen=60; %最大遗传代数
len_ch=20; %基因长度
gap=0.9; %代沟(Generation gap)
sub=-1; %变量取值下限
up=2.5; %变量取值上限
cd_gray=1; %是否选择格雷码编码方式:1是、0否
sc_log=0; %是否选择对数标度:1是、0否
trace=zeros(num_gen,2); %遗传迭代性能跟踪器
fieldd=[len_ch;sub;up;1-cd_gray;sc_log;1;1]; %区域描述器
chrom=crtbp(num_ppu,len_ch); %初始化生成种群
k_gen=0;
x=bs2rv(chrom,fieldd); %翻译初始化种群为10进制
fun_v=fun_sigv(x); %计算目标函数值
tx=sub:.01:up;
plot(tx,fun_sigv(tx));
xlabel('x');ylabel('y');
title('一元函数优化结果');
hold on; while k_gen<num_gen
fit_v=ranking(-opt_minmax*fun_v); %计算目标函数的适应度
selchrom=select('rws',chrom,fit_v,gap); %使用轮盘赌方式选择
selchrom=recombin('xovsp',selchrom); %交叉
selchrom=mut(selchrom); %变异
x=bs2rv(selchrom,fieldd); %子代个体翻译
fun_v_sel=fun_sigv(x); %计算子代个体对应目标函数值
[chrom,fun_v]=reins(chrom,selchrom,1,1,opt_minmax*fun_v,opt_minmax*fun_v_sel);%根据目标函数值将子代个体插入新种群
[f,id]=max(fun_v); %寻找当前种群最优解
x=bs2rv(chrom,fieldd);
f=f*opt_minmax;
fun_v=fun_v*opt_minmax;
k_gen=k_gen+1;
trace(k_gen,1)=f;
trace(k_gen,2)=mean(fun_v);
end
plot(x(id),f,'r*');
figure;
plot(trace(:,1),'r-*');
hold on;
plot(trace(:,2),'b-o');
legend('各子代种群最优解','各子代种群平均值');
xlabel('迭代次数');ylabel('目标函数优化过程');
title('一元函数优化过程');

  

求函数f(x)=x*sin(10*pi*x)+2.0,x属于[-1,2]的最大值:

opt_minmax=1;   %目标优化类型:1最大化、0最小化
num_ppu=50; %种群规模即个体个数
num_gen=25; %最大遗传代数
len_ch=20; %基因长度
gap=0.9; %代沟(Generation gap)
sub=-1; %变量取值下限
up=2; %变量取值上限
cd_gray=1; %是否选择格雷码编码方式:1是、0否
sc_log=0; %是否选择对数标度:1是、0否
trace=zeros(num_gen,2); %遗传迭代性能跟踪器
fieldd=[len_ch;sub;up;cd_gray;sc_log;1;1]; %区域描述器
chrom=crtbp(num_ppu,len_ch); %初始化生成种群
k_gen=0;
x=bs2rv(chrom,fieldd); %翻译初始化种群为10进制
fun_v=fun_sigv(x); %计算目标函数值
tx=sub:.01:up;
plot(tx,fun_sigv(tx));
xlabel('x');ylabel('y');
title('一元函数优化结果');
hold on; while k_gen<num_gen
fit_v=ranking(-opt_minmax*fun_v); %计算目标函数的适应度,基于秩/排序的适应度计算。
selchrom=select('rws',chrom,fit_v,gap); %使用轮盘赌方式选择
selchrom=recombin('xovsp',selchrom); %交叉
selchrom=mut(selchrom); %变异
x=bs2rv(selchrom,fieldd); %子代个体翻译
fun_v_sel=fun_sigv(x); %计算子代个体对应目标函数值
[chrom,fun_v]=reins(chrom,selchrom,1,1,opt_minmax*fun_v,opt_minmax*fun_v_sel);%根据目标函数值将子代个体插入新种群
[f,id]=max(fun_v); %寻找当前种群最优解
% hold on;
% if id<size(x,1)
% plot(x(id),f,'r*');
% end
x=bs2rv(chrom,fieldd);
f=f*opt_minmax;
fun_v=fun_v*opt_minmax;
k_gen=k_gen+1;
trace(k_gen,1)=f;
trace(k_gen,2)=mean(fun_v);
end plot(x',fun_v','b*');
plot(x(id),f,'rd');
% hold on;
% figure;
% plot(trace(:,1),'r-*');
% hold on;
% plot(trace(:,2),'b-o');
% legend('各子代种群最优解','各子代种群平均值');
% xlabel('迭代次数');ylabel('目标函数优化过程');
% title('一元函数优化过程');

  

[1]:雷英杰,张善文,李续武,等. MATLAB遗传算法工具箱及应用. 西安:西安电子科技大学出版社,2005.

遗传算法MATLAB实现(2):一元函数优化举例的更多相关文章

  1. 遗传算法MATLAB实现(3):多元函数优化举例

    多峰的Shubert为: 求f(x,y)在[-10,10]x[-10,10]上的最大值. MATLAB代码: fun_mutv函数为: function my=fun_mutv(x,y) t1=zer ...

  2. 遗传算法MATLAB工具包简介

    下面介绍的函数都是Sheriffed大学遗传算法工具包内的常用函数 复制矩阵 B=rep(A,RepN) 1 A表示要被复制的矩阵,RepN包含每个方向的复制次数,RepN(1)代表纵向复制次数,Re ...

  3. 遗传算法matlab实现

    我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下运用MATLAB实现遗传算法:   clc clear   %参数 a = 0 ; b = 4 ; e ...

  4. [matlab] 6.粒子群优化算法

    粒子群优化(PSO, particle swarm optimization)算法是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早由Kennedy和Eberhart在19 ...

  5. C# 代码性能优化举例

    普通人如果说什么事情慢,指的是 5 分钟,10 分钟,或者 1 个小时.2 个小时.而程序员要说什么事情慢,他们指的是 2 纳秒. 每个纳秒对程序员来说都是非常宝贵的,所以,要对代码进行优化,优化,再 ...

  6. if-else的优化举例

    共有部分: String bookFrom = null; String sheetFrom = null; String bookTo = null; String sheetTo = null; ...

  7. 遗传算法MATLAB实现(1):工具箱下载及安装

    到官网下载谢菲尔德大学的GA工具箱:http://codem.group.shef.ac.uk/index.php/ga-toolbox(其实蛮不懂为什么有人把这个传到某个网上还需要积分才能下载,人家 ...

  8. 遗传算法Matlab源程序

    参考自: http://blog.163.com/zhaoshuyu_thomas/blog/static/461929072009103034816716/ 大家内容上可以参考上述文章,但其代码有很 ...

  9. 遗传算法(Genetic Algorithm, GA)及MATLAB实现

    遗传算法概述: • 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择.适者生存”的演化法则,它最初由美国Michigan大学的J. Hollan ...

随机推荐

  1. PipeCAD之管道标准库PipeStd(3)

    PipeCAD之管道标准库PipeStd(3) Key Words: PipeCAD, PipeStd, Pipe Design 3D, Linux 1. Introduction    管道标准部件 ...

  2. 装配SpringBean(六)--配置文件加载方式

    spring中的配置文件有两种: 以XML结尾的spring配置文件 以properties结尾的属性配置文件 在spring中有两种方式加载这两种文件: 通过注解+java配置的方式 通过XML的方 ...

  3. 《DSP using MATLAB》Problem 7.28

    又是一年五一节,朋友圈都是晒名山大川的,晒脑袋的,我这没钱的待在家里上网转转吧 频率采样法设计带通滤波器,过渡带中有一个样点 代码: %% ++++++++++++++++++++++++++++++ ...

  4. leetcode 699. Falling Squares 线段树的实现

    线段树实现.很多细节值得品味 都在注释里面了 class SegTree: def __init__(self,N,query_fn,update_fn): self.tree=[0]*(2*N+2) ...

  5. CENTOS 7更换系统启动默认内核

    本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:CENTOS 7更换系统启动默认内核: 环境: CentOS Linux release 7.6.1810 (Core) : 1.查看当前 ...

  6. 如何处理HTML5新标签的浏览器兼容问题?

    方法一 : 1.使用静态资源的html5shiv包 <!--[if lt IE9]> <script src="http://cdn.static.runoob.com/l ...

  7. c++新特性实验(3)声明与定义:constexpr

    1.作用 constexpr 声明一个函数或变量,它的值可以在编译时出现在常量表达式之中. 2.constexpr 变量要求 其类型必须是 字面类型 (LiteralType) . 它必须被立即初始化 ...

  8. copyTo和clone的区别/制作mask的fillpoly函数(有问题)

    OpenCV中mat::copyto( )函数使用方法 OpenCV的fillPoly函数 使用OpenCV库进行图像处理时,经常会用到clone和copyTo函数,这里对两个函数进行介绍. copy ...

  9. bzoj 4004 [JLOI2015]装备购买——拟阵证明贪心+线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4004 看Zinn博客水过去…… 运用拟阵可以证明按价格从小到大买的贪心是正确的.但自己还不会 ...

  10. [转]web计时机制——performance对象

    页面性能一直都是Web开发人员比较关注的领域.但在实际应用中,度量页面性能的指标,是javascript的Date对象.Web Timing API改变了这个局面,让开发人员通过javascript就 ...