遗传算法,其本质上是一种进化算法,相比其他的算法应用范围比较广泛,特别是对于一些非线性、多模型、多目标的函数优化问题,用其他的优化方法较难求解,而遗传算法可以方便的得到较好的结果。不过正如我在PSO粒子群算法的文章中说道,每种算法的应用场景往往和所应用的问题相关,对于特定的问题,某一种优化算法可能展现出其他算法所达不到的效果。

想必遗传算法的原理大家都大概了解,这里就不过多赘述,总之也是一种在迭代中不断进化,探索,想最优情况靠近的一种迭代算法。遗传算法包括三个基本操作:选择、交叉和变异。不同改进的遗传算法,往往都是在这三个基本操作上进行改进。

本文给出的是基本的遗传算法程序,同样也是引自龚纯的这本《精通MATLAB最优计算》,用于求取优化函数的最大值,当然求最小值的情况只需更改目标函数的正负即可。要注意的是,本算法是遗传算法的最基本的格式,只能用于解决一维无约束的优化问题。由于略去了很多操作的原理比如编码操作、轮盘赌选择策略、交叉方法,变异方法等,我在代码上加了详细的备注,由于代码本身并不复杂,需要的读者自己阅读一下即可理解。下面给出基本遗传算法函数的调用格式:

function [xv,fv]=myGA(fitness,a,b,NP,NG,Pc,Pm,eps)

fitness是待优化函数,调用时可以自己编写后使用句柄调用,随后会举例展示调用的方法。除此之外的参数的意义分别是:

a:自变量下界;

b:自变量上界;

NP:种群大小;

Pc:杂交概率;

Pm:变异概率;

eps:自变量离散精度;

xm:目标函数取最大值时的自变量值;

fv:目标函数的最大值。

基本遗传算法的程序为:

function [xv,fv]=myGA(fitness,a,b,NP,NG,Pc,Pm,eps)%待优化的目标函数:fitness
%自变量下界:a
%自变量上界:b
%种群个体数:NP
%最大进化代数:NG
%杂交概率:Pc
%变异概率:Pm
%自变量离散精度:eps
%目标函数取最小值时的自变量值:xm
%目标函数的最小值:fvL = ceil(log2((b-a)/eps+1));               %根据离散精度,确定二进制编码需要的码长
x = zeros(NP,L);                           %NP行L列的全零矩阵
for i=1:NPx(i,:) = Initial(L);                   %种群初始化fx(i) = fitness(Dec(a,b,x(i,:),L));    %个体适应值
end
for k=1:NGsumfx = sum(fx);                       %所有个体适应值之和Px = fx/sumfx;                         %所有个体的选择概率PPx = 0;PPx(1) = Px(1);for i=2:NP                             %从第二个开始PPx(i) = PPx(i-1) + Px(i);         %轮盘赌策略的概率累加endfor i=1:NPsita = rand();                     %sita是0,1之间的随机数for n=1:NPif sita <= PPx(n)SelFather = n;             %根据轮盘赌策略确定的父亲break;endendSelmother = floor(rand()*(NP-1))+1;%随机选择母亲posCut = floor(rand()*(L-2))+1;   %随机群定交叉点r1 = rand();                       %r1为0,1之间随机数if r1<=Pc                          %如果r1小于杂交概率,交叉nx(i,1:posCut) = x(SelFather,1:posCut);           %将切点前编码替换为父亲的nx(i,(posCut+1):L) = x(Selmother,(posCut+1):L);   %将切点后编码替换为母亲的r2 = rand();                   %r2为0,1之间随机数if r2<=Pm                      %如果r2小于变异概率,变异posMut = round(rand()*(L-1)+1);%随机确定变异位nx(i,posMut) = ~nx(i,posMut);  %变异位编码取非endelsenx(i,:) = x(SelFather,:);      %若r1不小于杂交概率,则将该个体替换为父亲的编码end
end
x = nx;
for i=1:NPfx(i) = fitness(Dec(a,b,x(i,:),L));     %子代适应值
end
end
fv = -inf;
for i=1:NPfitx = fitness(Dec(a,b,x(i,:),L));if fitx > fv                            %取个体中的最好值作为最终结果fv = fitx;                          %fv为最优解的函数值xv = Dec(a,b,x(i,:),L);             %xv为最优解的编码end
end
function result = Initial(length)           %初始化函数
for i=1:lengthr = rand();result(i) = round(r);
endfunction y = Dec(a,b,x,L)               %二进制编码转换为十进制编码base = 2.^((L-1):-1:0);y = dot(base,x);y = a+y*(b-a)/(2^L-1);

再次提醒,本程序是最基本的遗传算法程序,只能解决一维无约束的优化问题,若对于多目标问题,其实上文的PSO算法可以完成,或者在本文的遗传算法上做一些更改,之后我也会更新多目标情况下的遗传算法程序。下面举例展示本程序的调用方法,首先将待优化的目标函数在MATLAB中写成函数的形式:

function F = fitness(x)F = x^3-60*x^2+900*x+100;

现在用刚刚的遗传算法代码求该函数的最大值,设置自变量的范围是0-30,可以直接在命令行调用,其调用格式为:

[xv,fv] = myGA(@fitness,0,30,50,100,0.9,0.04,0.01)

运行结果为:

xv =

10.3223

fv =

4.0969e+03

遗传算法求得的结果的精度一方面与离散精度有关,另一方面与个体数目有关,离散精度决定了遗传算法能得到的最大精度,个体数目越大, 求得的结果精度越有可能达到离散精度。同样的迭代次数越大,也越有可能找到更优的解,不过也有可能陷入到局部最优中,所以需要适当的调整杂交概率与变异概率的大小。

MATLAB实现基本的遗传算法(写成函数形式,可调用),优化目标函数,并举例展示相关推荐

  1. 三种方法:写一个函数,每调用一次函数,就会将num的值增加1,&&可能遇到的问题

    写一个函数,每调用一次函数,就会将num的值增加1,以及可能遇到的问题 1.传址 int AddNumAddress(int *p) {return ++(*p); } int main() {int ...

  2. c语言有参有类最小公倍数,【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数...

    程序分析: 在数学中,两个数的最小公倍数=两个数的乘积/两数的最大公约数. 求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N. 如果余数为0,则N即为所求:如果余 ...

  3. 基于Matlab的神经网络结合遗传算法在非线性函数极值寻优中的应用

    本微信图文利用神经网络进行非线性函数数据的拟合并通过遗传算法对训练后的神经网络进行非线性函数极值寻优.

  4. 写出从图的邻接表表示转换成邻接矩阵表示的算法,用c语言写成过程形式,可以用吸毒的方式减肥...

    不变目镜,用吸胞临微镜皮细片时在显察洋葱表下观时装,倍物察先用镜观,调整粗.细准旋若不焦螺,倍物后换镜,中亮度和细胞视野数目是(. 控保制定障方的监合理案,减肥部门保障可能.地点等信息应尽了解监控时间 ...

  5. 【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数

    程序分析: 在数学中,两个数的最小公倍数=两个数的乘积/两数的最大公约数. 求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N. 如果余数为0,则N即为所求:如果余 ...

  6. 遗传算法详细介绍以及基于遗传算法和非线性规划函数的寻优算法—MATLAB实现

    文章目录 一.理论基础 1.非线性规划 2.非线性规划函数 3.遗传算法基本思想 1).算法介绍 2).算法执行过程 3). 相关生物学术语 4) .实现流程 5). 实现细节 5.1.编码 5.1. ...

  7. matlab已知优化目标函数,fmincon函数对目标函数的要求

    matlab非线性规划fmincon函数中目标函数参数传递问题, 使用匿名函数句柄就可以了fmincon需要的函数fun只有一个输入参数fun(x)而你的函数需要多一个能改变的变量那么形式变成myfu ...

  8. matlab 脚本是什么意思,MATLAB提示不能在脚本中定义函数,是什么意思?

    点击查看MATLAB提示不能在脚本中定义函数,是什么意思?具体信息 答:你试图在命令窗口定义函数,这种做法是错误的. 你需要建立一个.m文件,文件名是Chebyshev.m,然后在里面输入源程序. 答 ...

  9. MATLAB --函数编写与调用

    本文来源于网络,作者Yasist,如有侵权请联系小编微信:leeing137 之前写code都是将所有的实现放在同一个.m文件,导致程序很混乱冗长,过了几天容易忘记,不便于后期修改维护,于是开始学习将 ...

最新文章

  1. java设计一个bank类实现银行_SAP银企直连之平安银行(ECC版)
  2. linux查看密码配置文件,如何在Linux上查看和配置密码时效
  3. 单源最短路 Dijkstra算法 和 SPFA算法
  4. 文本分类有哪些论文中很少提及却对性能有重要影响的tricks?
  5. java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量
  6. java system.load()_System.load()与System.loadLibrary()
  7. 正则表达式与html信息提取,基于正则表达式的HTML信息提取.pdf
  8. 服务器主板点不亮排查
  9. python猴子选大王讲解_关于猴子选大王的面试题
  10. 如何保持连接_酒店厨房设备如何保养清洗?
  11. Pycharm快捷键设置(鼠标滚动控制字体大小)
  12. java抽组件,基于Java组件与基于请求的框架
  13. 百度SEO之-关键词的种类
  14. 制作img镜像文件的5种方法
  15. Mac OS 上MPV播放器常用快捷键
  16. 01 牛刀小试【PAT A1046】Shortest Distance
  17. 什么是即时通讯(IM)?
  18. 如何快速将qsv格式转换成mp4
  19. Android高版本P/Q/R源码编译指南
  20. 解决win10睡眠后变卡的问题

热门文章

  1. 《AUTOSAR谱系分解(ETAS工具链)》之Interfaces
  2. thinkphp随机字符串
  3. 2021年安全员-A证考试题及安全员-A证模拟考试题
  4. TopLanguage小组讨论精选[四](2007.12-2008.1)
  5. 代码编程一条街,前端后端谁为先?
  6. win10快捷键及管理用户
  7. Emotet银行木马传播特制感恩节“祝福”
  8. python3小数向上取整_Python小数取整 向下取整、四舍五入、向上取整【分享】
  9. IP地址被恶意域名解析
  10. zookeeper报错length is greater than jute.maxbuffer=1048575