基于Matlab的函数优化遗传算法程序
更新时间:2023-04-22 21:05:01 阅读量: 实用文档 文档下载
Matlab写的函数优化遗传算法程序
function [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation,options)
% [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation)
% Finds a maximum of a function of several variables.
% fmaxga solves problems of the form:
% max F(X) subject to: LB <= X <= UB
% BestPop--------最优的群体即为最优的染色体群
% Trace-----------最佳染色体所对应的目标函数值
% FUN------------目标函数
% LB--------------自变量下限
% UB--------------自变量上限
% eranum----------种群的代数,取100--1000(默认1000)
% popsize---------每一代种群的规模;此可取50--100(默认50)
% pcross-----------交叉的概率,此概率一般取0.5--0.85之间较好(默认0.8)
% pmutation------变异的概率,该概率一般取0.05-0.2左右较好(默认0.1)
% options--------1×2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编码,option(2)设定求解% 精度(默认1e-4)
%
% 如测试Shaffer's(f=0.5-((sin(sqrt(x(1)^2+x(2)^2)))^2-0.5)/(1+0.001*(x(1)^2+x(2)^2))^2)函数,自变量下限% %[-100,-100],上限[100,100],当x=[0 0]时,取得理想最优MaxF6=1
% 运行得到相当好的结果:自变量为 0.00033379-4.7684e-005 时,最优值 1.000000
% 对应染色体是:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 %1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
T1=clock;
if nargin<3, error('FMAXGA requires at least three input arguments'); end
if nargin==3, eranum=1000;popsize=50;pcross=0.8;pmutation=0.1;options=[0 1e-4];end
if nargin==4, popsize=50;pcross=0.8;pmutation=0.1;options=[0 1e-4];end
if nargin==5, pcross=0.8;pmutation=0.1;options=[0 1e-4];end
if nargin==6, pmutation=0.1;options=[0 1e-4];end
if nargin==7, options=[0 1e-4];end
if find((LB-UB)>0)
error('数据输入错误,请重新输入(LB<UB):');
end
s=sprintf('程序运行需要约%.4f 秒钟时间,请稍等......',(eranum*popsize*40/(1000*50)));
disp(s);
bounds=[LB;UB]';bits=[];
precision=options(2);%由求解精度确定二进制编码长度
bits=ceil(log2((bounds(:,2)-bounds(:,1))' ./ precision));
[Pop]=initpop(popsize,bits);%初始化种群
[m,n]=size(Pop);
pm0=pmutation;
BestPop=zeros(eranum,n);Trace=zeros(eranum,length(bits)+1);%分配初始解空间
i=1;
while i<=eranum
for j=1:m
value(j)=feval(FUN(1,:),(b2f(Pop(j,:),bounds,bits)));%计算适应度
end
[MaxValue,Index]=max(value);
BestPop(i,:)=Pop(Index,:);
Trace(i,1)=MaxValue;
Trace(i,(2:length(bits)+1))=b2f(BestPop(i,:),bounds,bits);
[selectpop]=selectchrom(FUN,Pop,bounds,bits);%选择
[CrossOverPop]=CrossOver(selectpop,pcross);%交叉
[NewPop]=Mutation(CrossOverPop,pmutation);%变异
Pop=NewPop;%更新
pmutation=pm0+(i^4)*(0.6-pm0)/(eranum^4); %随着种群向前进化,逐步增大变异率
p(i)=pmutation;
i=i+1;
end
t=1:eranum;
plot(t,Trace(
:,1)');
title('函数优化的遗传算法');xlabel('进化世代数(eranum)');ylabel('每一代最优适应度(maxfitness)');
[MaxFval,I]=max(Trace(:,1));
X=Trace(I,(2:length(bits)+1))
Matlab写的函数优化遗传算法程序
;
hold on; plot(I,MaxFval,'*');
text(I+5,MaxFval,['FMAX=' num2str(MaxFval)]);
str1=sprintf('进化到 %d 代 ,自变量为 %s 时,得本次求解的最优值 %f\n对应染色体是:%s',...
I,num2str(X),MaxFval,num2str(BestPop(I,:)));
disp(str1);
%figure(2);plot(t,p);%绘制变异值增大过程
T2=clock;
CostTime=T2-T1;
if CostTime(6)<0
CostTime(6)=CostTime(6)+60; CostTime(5)=CostTime(5)-1;
end
if CostTime(5)<0
CostTime(5)=CostTime(5)+60;CostTime(4)=CostTime(4)-1;
end %像这种程序当然不考虑运行上小时啦
str2=sprintf('程序运行耗时 %d 小时 %d 分钟 %.4f 秒',CostTime(4),CostTime(5),CostTime(6));
disp(str2);
%初始化种群,采用二进制编码
function [pop]=initpop(popsize,bits)
len=sum(bits);
pop(1,:)=zeros(1,len);
for i=2:popsize-1
pop(i,:)=round(rand(1,len));
end
pop(popsize,:)=ones(1,len);
%解码
function [fval] = b2f(bval,bounds,bits)
% fval - 表征各变量的十进制数
% bval - 表征各变量的二进制编码串
% bounds - 各变量的取值范围
% bits - 各变量的二进制编码长度
scale=(bounds(:,2)-bounds(:,1))'./(2.^bits-1);
numV=size(bounds,1);
cs=[0 cumsum(bits)];
for i=1:numV
a=bval((cs(i)+1):cs(i+1));
fval(i)=sum(2.^(size(a,2)-1:-1:0).*a)*scale(i)+bounds(i,1);
end
%计算各个体的适应度并采用轮盘赌进行选择
function [selectpop]=selectchrom(FUN,pop,bounds,bits)%采用轮盘赌选择方法
[m,n]=size(pop);
for i=1:m
fit(i)=feval(FUN(1,:),(b2f(pop(i,:),bounds,bits)));%以函数值为适应度
end
selectprob=fit/sum(fit);%选择概率
prob=cumsum(selectprob);%累计选择概率
sumprob=[0 prob];
for i=1:m
selectpop(i,:)=pop(length(find(rand>=sumprob)),:);
end
%交叉操作
function [NewPop]=CrossOver(OldPop,pcross)%OldPop为父代种群,pcross为交叉概率
[m,n]=size(OldPop);
r=rand(1,m);
y1=find(r<pcross);
y2=find(r>=pcross);
len=length(y1);
if len>2&mod(len,2)==1%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数
y2(length(y2)+1)=y1(len);
y1(len)=[];
end
if length(y1)>=2
for i=0:2:length(y1)-2
[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:));
end
end
NewPop(y2,:)=OldPop(y2,:);
function [children1,children2]=EqualCrossOver(parent1,parent2)
%采用均匀交叉 例:
%父1:0 1 1 1 0 0 1 1 0 1 0
%父2:1 0 1 0 1 1 0 0 1 0 1
%掩码:0 1 1 0 0 0 1 1 0 1 0
%交叉后新个体:
%子1:1 1 1 0 1 1 1 1 1 1 1
%子2:0 0 1 1 0 0 0 0 0 0 0
L=length(parent1);
hidecode=round(rand(1,L));%随机生成掩码,如hidecode=[0 1 1 0 0 0 1 1 0 1 0];
children1=zeros(1,L);
children2=zeros(1,L);
children1(find(hidecode==1))=parent1(find(hidecode==1));%掩码为1,父1为子1提供基因
children1(find(hidecode==0))=parent2(find(hidecode==0));%掩码
为0,父2为子1提供基因
children2(find(hidecode==1))=parent2(find(hidecode==1));%掩码为1,父2为子2提供基因
children2(find(hidecode==0))=parent1(find(hidecode==0));%
Matlab写的函数优化遗传算法程序
掩码为0,父1为子2提供基因
%变异操作
function [NewPop]=Mutation(OldPop,pmutation)
[m,n]=size(OldPop);
r=rand(1,m);
position=find(r<=pmutation);
len=length(position);
if len>=1
for i=1:len
k=unidrnd(n,1,1); %设置变异点数,一般设置1点
for j=1:length(k)
if OldPop(position(i),k(j))==1
OldPop(position(i),k(j))=0;
else
OldPop(position(i),k(j))=1;
end
end
end
end
NewPop=OldPop;
程序运行需要约40.0000 秒钟时间,请稍等......
进化到 774 代 ,自变量为 -0.0078678 -0.0052929 时,得本次求解的最优值 0.999910
对应染色体是:0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0
程序运行耗时 0 小时 0 分钟 41.7400 秒
see_moonlight edited on 2005-03-14 11:51
--------------------------------------------------------------------------------
临江仙
陈夕往事益归去,
古道西风依旧.
人生长河水长东,
春去遇秋来,
天际寻鹄鸿.
日月星移话沧桑,
是非功过何在?
一路风雨兼程行,
唯清风明月,
独在情怀中.
作者 Re:【共享】基于Matlab的函数优化遗传算法程序 [Re:liaomch]
gough
论坛游民
发贴: 2
技术分: 0
积分:2
于 2005-03-14 11:03
--------------------------------------------------------------------------------
我想应输入
x=[0 0];
FUN==0.5-((sin(sqrt(x(1)^2+x(2)^2)))^2-0.5)/(1+0.001*(x(1)^2+x(2)^2))^2;
LB=-100;
UB=100;
[bestpop,Trace] = fmaxga(FUN,LB,UB)
结果出来
??? Error using ==> feval
Argument must contain a string or fun
ction_handle.
Error in ==> C:\MATLAB6p5\work\fmaxga.m
On line 43 ==> value(j)=feval(FUN(1,:),(b2f(Pop(j,:),bounds,bits)));%计算适应度
正在阅读:
基于Matlab的函数优化遗传算法程序04-22
员工个人岗位调动申请书范文03-24
2018年医药行业风险分析报告03-28
《中级财务会计》综合练习题04-27
发展经济学 课后练习题(含答案)09-29
公司规章制度201505-21
《卡比利亚之夜》影评精选10篇12-12
如何激发青年员工的积极性12-10
初一下册地理试卷及答案105-31
Lesson Plan - 图文12-01
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 遗传
- 算法
- 函数
- 基于
- 优化
- 程序
- Matlab
- 北京海洋馆活动方案
- 《有趣的0》幼儿园中班数学优质课教案
- 社会再适应评定量表中生活事件及生活改变值无表格部分
- 优秀入党积极分子自传范文3000字
- 消防控制室上墙内容
- 1教师乘车安全协议书Microsoft Word 文档
- 16春东财《企业纳税实务》在线作业三
- 4radical-chain initiation 3
- 优秀党务工作者事迹材料1
- 关于离散点集的三维凸包的研究
- 工贸企业安全生产标准化评审办法和评审实务
- 丹佛斯变频器_VLT2800_操作手册
- 有理数的混合运算补救练习
- 基于映射方法的柔性制造系统建模及仿真程序设计
- 2013年最新电大西方经济学本科计算题
- 目 录(高考英语语法)
- 荣耀归于真神 中英文
- 您好:与oracle 数据库连接,读写相关方法如下:
- 2015年黑龙江省教师资格证小学《综合素质》写作预测及优秀范文十
- 九年级英语unit13教案