博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matlab练习程序(差异演化DE)
阅读量:6292 次
发布时间:2019-06-22

本文共 2023 字,大约阅读时间需要 6 分钟。

这两天在看M.Tim Jones的《》,书中不只介绍原理,而且都有相应的c代码实现。

虽然代码不完全,不过缺少的部分完全可以自己补完。

差异演化和昨天实现的PSO很类似,都属于优化算法。

算法步骤:

1.设定种群个体个数和需要迭代的次数。当然也可以设定条件,然后判断是否停止迭代。

2.定义交叉概率CR,个体有一定概率进行变异,如果变异则进行第3步,如果不变异则下一代个体和当前个体一样。

3.在种群中随机选出三个互不相同的个体进行变异,变异公式如下(有博士论文总结了一大堆变异公式):

Xi,g+1=Xr1,g+F(Xr2,g-Xr3,g)

其中X是种群中个体特征向量,这里就是x和y坐标。g是种群的代数。i代表当前个体,r1,r2,r3是和i不同,并且也互不相同的个体。

4.计算变异后个体的适应度,如果变异后适应度不如变异前,那么将变异后个体重新恢复为变异前个体。

5.比较变异后个体适应度和种群最优个体适应度,将适应度高的个体赋给种群最优个体。

最后当然还是需要目标函数才能计算适应度。

算法结果如下图,小绿点代表种群最优个体适应度:

matlab代码如下:

main.m

clear all;close all;clc;[x y]=meshgrid(-100:100,-100:100);sigma=50;img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2)); %目标函数,高斯函数mesh(img);hold on;n=20;   %种群个体的数量%初始化种群,定义结构体par=struct([]);for i=1:n    par(i).x=-100+200*rand();   %个体的x特征在[-100 100]随机初始化    par(i).y=-100+200*rand();   %个体的y特征在[-100 100]随机初始化    par(i).fit=0;               %个体适应度为0初始化endpar_best=par(1);    %初始化种群中最佳个体for k=1:100     %迭代次数    plot3(par_best.x+100,par_best.y+100,par_best.fit,'g*'); %画出最佳个体的位置,+100为相对偏移    [par par_best]=select_and_recombine(par,par_best,n);     %差异演化函数end

select_and_recombine.m

function [next_par par_best]=select_and_recombine(par,par_best,n)    F=0.5;          %加速因子    CR=0.8;         %变异率    next_par=par;   %新种群    for i=1:n                while 1         %在原种群中任选三个互不相同的个体进行交叉变异            r1=floor(1+20*rand());            r2=floor(1+20*rand());            r3=floor(1+20*rand());            if i~=r1 && i~=r2 && i~=r3 &&...               r1~=r2 && r1~=r3 && r2~=r3                break;            end        end                             if rand()
next_par(i).fit next_par(i)=par(i); end %如果变异后适应度高于种群最高适应个体,则更新种群适应度最高个体 if next_par(i).fit>par_best.fit par_best=next_par(i); end end end

compute_fit.m

function re=compute_fit(par)    x=par.x;    y=par.y;    sigma=50;    if x<-100 || x>100 || y<-100 || y>100        re=0;        %超出范围适应度为0    else            %否则适应度按目标函数求解        re=(1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2));     endend

 

转载地址:http://uucta.baihongyu.com/

你可能感兴趣的文章
微信支付
查看>>
CodeBlocks中的OpenGL
查看>>
短址(short URL)
查看>>
第十三章 RememberMe——《跟我学Shiro》
查看>>
mysql 时间函数 时间戳转为日期
查看>>
索引失效 ORA-01502
查看>>
Oracle取月份,不带前面的0
查看>>
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>
如何查看Linux命令源码
查看>>
运维基础命令
查看>>
入门到进阶React
查看>>
SVN 命令笔记
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>