问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

function =fmaxgafun,lb,ub,eranum,popsize,pcross怎么用

发布网友 发布时间:2022-05-11 04:19

我来回答

1个回答

热心网友 时间:2024-02-09 04:06

遗传算法程序:
说明: fga.m 为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择,
均匀交叉,变异操作,而且还引入了倒位操作!

function
[BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,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(默认200)
% popsize -
每一代种群的规模;此可取50--200(默认100)
% pcross
- 交叉概率,一般取0.5--0.85之间较好(默认0.8)
% pmutation -
初始变异概率,一般取0.05-0.2之间较好(默认0.1)
% pInversion -
倒位概率,一般取0.05-0.3之间较好(默认0.2)
% options -
1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编
%码,option(2)设定求解精度(默认1e-4)
%
%
------------------------------------------------------------------------

T1=clock;
if nargin<3, error('FMAXGA requires at least three input
arguments'); end
if nargin==3,
eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0
1e-4];end
if nargin==4,
popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end
if
nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end
if
nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];end
if nargin==7,
pInversion=0.15;options=[0 1e-4];end
if find((LB-UB)>0)

error('数据输入错误,请重新输入(LB<UB):');
end
s=sprintf('程序运行需要约%.4f
秒钟时间,请稍等......',(eranum*popsize/1000));
disp(s);

global m n NewPop children1 children2 VarNum

bounds=[LB;UB]';bits=[];VarNum=size(bounds,1);
precision=options(2);%由求解精度确定二进制编码长度
bits=ceil(log2((bounds(:,2)-bounds(:,1))'
./
precision));%由设定精度划分区间
[Pop]=InitPopGray(popsize,bits);%初始化种群
[m,n]=size(Pop);
NewPop=zeros(m,n);
children1=zeros(1,n);
children2=zeros(1,n);
pm0=pMutation;
BestPop=zeros(eranum,n);%分配初始解空间BestPop,Trace
Trace=zeros(eranum,length(bits)+1);
i=1;
while
i<=eranum
for
j=1:m

value(j)=feval_r(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]=NonlinearRankSelect(FUN,Pop,bounds,bits);%非线性排名选择
[CrossOverPop]=CrossOver(selectpop,pCross,round(unidrnd(eranum-i)/eranum));
%采用多点交叉和均匀交叉,且逐步增大均匀交叉的概率

%round(unidrnd(eranum-i)/eranum)

[MutationPop]=Mutation(CrossOverPop,pMutation,VarNum);%变异

[InversionPop]=Inversion(MutationPop,pInversion);%倒位

Pop=InversionPop;%更新
pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4);
%随着种群向前进化,逐步增大变异率至1/2交叉率

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));
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;
elapsed_time=T2-T1;
if
elapsed_time(6)<0
elapsed_time(6)=elapsed_time(6)+60;
elapsed_time(5)=elapsed_time(5)-1;
end
if
elapsed_time(5)<0

elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_time(4)-1;
end
%像这种程序当然不考虑运行上小时啦
str2=sprintf('程序运行耗时 %d 小时 %d 分钟 %.4f
秒',elapsed_time(4),elapsed_time(5),elapsed_time(6));
disp(str2);

%初始化种群
%采用二进制Gray编码,其目的是为了克服二进制编码的Hamming悬崖缺点
function
[initpop]=InitPopGray(popsize,bits)
len=sum(bits);
initpop=zeros(popsize,len);%The
whole zero encoding indivial
for i=2:popsize-1

pop=round(rand(1,len));
pop=mod(([0 pop]+[pop
0]),2);

%i=1时,b(1)=a(1);i>1时,b(i)=mod(a(i-1)+a(i),2)

%其中原二进制串:a(1)a(2)...a(n),Gray串:b(1)b(2)...b(n)

initpop(i,:)=pop(1:end-1);
end
initpop(popsize,:)=ones(1,len);%The whole
one encoding indivial

%解码

function [fval] = b2f(bval,bounds,bits)
% fval -
表征各变量的十进制数
% bval - 表征各变量的二进制编码串
% bounds - 各变量的取值范围
%
bits - 各变量的二进制编码长度
scale=(bounds(:,2)-bounds(:,1))'./(2.^bits-1);
%The range of the variables
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

%选择操作
%采用基于轮盘赌法的非线性排名选择
%各个体成员按适应值从大到小分配选择概率:
%P(i)=(q/1-(1-q)^n)*(1-q)^i,
其中 P(0)>P(1)>...>P(n), sum(P(i))=1

function [selectpop]=NonlinearRankSelect(FUN,pop,bounds,bits)
global m
n
selectpop=zeros(m,n);
fit=zeros(m,1);
for i=1:m

fit(i)=feval_r(FUN(1,:),(b2f(pop(i,:),bounds,bits)));%以函数值为适应值做排名依据
end
selectprob=fit/sum(fit);%计算各个体相对适应度(0,1)
q=max(selectprob);%选择最优的概率
x=zeros(m,2);
x(:,1)=[m:-1:1]';
[y
x(:,2)]=sort(selectprob);
r=q/(1-(1-q)^m);%标准分布基值
newfit(x(:,2))=r*(1-q).^(x(:,1)-1);%生成选择概率
newfit=cumsum(newfit);%计算各选择概率之和
rNums=sort(rand(m,1));
fitIn=1;newIn=1;
while
newIn<=m
if
rNums(newIn)<newfit(fitIn)

selectpop(newIn,:)=pop(fitIn,:);

newIn=newIn+1;

else

fitIn=fitIn+1;
end
end

%交叉操作
function
[NewPop]=CrossOver(OldPop,pCross,opts)
%OldPop为父代种群,pcross为交叉概率
global m n
NewPop
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
if
opts==0

[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:));

else

[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(OldPop(y1(i+1),:),OldPop(y1(i+2),:));

end

end
end
NewPop(y2,:)=OldPop(y2,:);

%采用均匀交叉
function [children1,children2]=EqualCrossOver(parent1,parent2)

global n children1
children2
hidecode=round(rand(1,n));%随机生成掩码
crossposition=find(hidecode==1);
holdposition=find(hidecode==0);
children1(crossposition)=parent1(crossposition);%掩码为1,父1为子1提供基因
children1(holdposition)=parent2(holdposition);%掩码为0,父2为子1提供基因
children2(crossposition)=parent2(crossposition);%掩码为1,父2为子2提供基因
children2(holdposition)=parent1(holdposition);%掩码为0,父1为子2提供基因

%采用多点交叉,交叉点数由变量数决定

function [Children1,Children2]=MultiPointCross(Parent1,Parent2)

global n Children1 Children2
VarNum
Children1=Parent1;
Children2=Parent2;
Points=sort(unidrnd(n,1,2*VarNum));
for
i=1:VarNum

Children1(Points(2*i-1):Points(2*i))=Parent2(Points(2*i-1):Points(2*i));

Children2(Points(2*i-1):Points(2*i))=Parent1(Points(2*i-1):Points(2*i));
end

%变异操作
function [NewPop]=Mutation(OldPop,pMutation,VarNum)

global m n
NewPop
r=rand(1,m);
position=find(r<=pMutation);
len=length(position);
if
len>=1
for i=1:len

k=unidrnd(n,1,VarNum); %设置变异点数,一般设置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;

%倒位操作

function [NewPop]=Inversion(OldPop,pInversion)

global m n
NewPop
NewPop=OldPop;
r=rand(1,m);
PopIn=find(r<=pInversion);
len=length(PopIn);
if
len>=1
for
i=1:len

d=sort(unidrnd(n,1,2));
if
d(1)~=1&d(2)~=n

NewPop(PopIn(i),1:d(1)-1)=OldPop(PopIn(i),1:d(1)-1);

NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1));

NewPop(PopIn(i),d(2)+1:n)=OldPop(PopIn(i),d(2)+1:n);

end
end
end
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
探歌自动启停怎么关闭不了怎么办 探歌停车自动熄火 一汽大众sagitar自动档换档位的时候震动什么原因 大众速滕挂档车身会抖动 大众速腾变速箱挡杆抖动是哪里的问题? 我的爸爸欠了一千多块,妈妈才发现因此很生气,打架怎么办?我好害怕... 我的情况是属于心理障碍吗? 我的爸爸特别喜欢强势,导致我现在非常害怕爸爸,怎么办呢? 我怕我的爸爸妈妈(亲人)死 歌唱祖国的合唱怎么排练,怎么分声部,怎么轮唱重唱领唱比较合理 柯南最后一集是什么?他有没有边会新一? 用c语言编写fun函数求一批数中最大值与最小值的差 请编写一个函数fun,函数的功能是:求出N×M整型数组的最大元素及其行下标和列下标, 下面两种函数fun()的写法哪种是正确的??? n3fun和n3max区别 word argmax下方参数如何输入 C语言二级问题,创建fun函数寻找链表中成绩最大的输出。关于指针的使用double max; STREC *p=h;不明白 FFT分析窗口上的fundermental(50Hz)是什么意思呢? fun max add 函数怎么使用啊?有没有详细的说明啊,怎么我找了好久都找不到啊 2020国家公务员考试报考流程是什么样的? 张家港可以办公积金贷款和商贷的组合贷款吗 哈尔滨到台湾旅游价格多少 台湾旅游购物必买清单 南京住房公积金可以用在张家港贷款贷款吗? 中远之星台湾环岛八日游怎么样 张家港农村住房翻建能不能使用公积金贷款 台湾环岛八日游 跟团 旅行社有什么猫腻 畅谈2020国考报考指南 张家港买房没有房产证可以公积金贷款吗!? 张家港自建房公积金贷款要办哪些手续 台湾自由行十天大概多少钱,手续得提前多久申请?推荐一些特别的地吧 2020国考报名注意事项有哪些? 编写max函数,功能是求一维数组元素的最大值,并将其地址返回,但这个一维数组要在main()。 请教Maxsder的彻底清除方法。 c语言:请编写一个函数fun,函数的功能是:求出N×M整型数组的最大元素及其行下标和列下标 房产经纪人必须了解的东西具体都有啥? (1)编写函数fun,其功能是先找出M行N列数组中各行值的最大数,再在选出的M个数中选出最小数 做房产中介注意什么 科沃斯N3max和N3fun有什么区别? 精益中,FIFO lane的上限(max)计算 为什麽电脑开机进入XP后就显示蓝屏呢? 伍佰的歌曲《突然的自我》中有一句念白“来来来,喝完了这一杯”的下一句是什么 喝酒划拳里的歌词是:兄弟你喝酒呀,哥哥来斟杯呀,喝完了这一杯,在喝下一杯。。。 这是哪里的划拳方式 喝完这一杯回家粤语怎么说 姓曾的女孩名字! 伍佰有首歌里面说“喝完这杯,还有三杯。”什么意思啊 有首歌是说唱的,说的是来来来喝完这杯,还有一杯,再喝完这杯,还有三杯,歌手?,歌名? 歌词有来来来,喝完一杯,还有三杯的是什么歌啊 ,忘记了 水果店起名叫水果篮子算不算侵权? 水果店开业系统的的名字可以跟店名相同吗 超市的水果摊位用的名字和自己开的水果店名字一样怎么办? 苹果apple watch能打电话吗