威望0
积分7946
贡献0
在线时间762 小时
UID1
注册时间2021-4-14
最后登录2024-11-21
管理员
- UID
- 1
- 威望
- 0
- 积分
- 7946
- 贡献
- 0
- 注册时间
- 2021-4-14
- 最后登录
- 2024-11-21
- 在线时间
- 762 小时
|
[mw_shl_code=applescript,true]function [Result,Solution]=GA(FUN,MaxT,popsize,pCross,pMutation)
D=10;
NP=popsize;
%% 初始化种群
[XPop]=InitPop_GA(NP,D); %初始化种群
%% 最好值初始化
Fit_best=inf; % 适应值
X_best=[]; % 解
%% 循环代数
NC=1;
while NC<=MaxT
% NC
%% 求所有个体适应值
value=feval(FUN,XPop);
%% 更新全局最优解
[f_best,index]=min(value);
if f_best<Fit_best
Fit_best=f_best;
X_best=XPop(index,;
end
% Fit_best
%% 遗传操作
[SelectPop]=NonlinearRankSelect(XPop,value); %选择
[CrossPop]=CrossOver(SelectPop,pCross); %交叉
[MutationPop]=Mutation(CrossPop,pMutation); %变异
%pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4); %随着种群向前进化,逐步增大变异率至1/2交叉率
%%
XPop=MutationPop; %更新种群
NC=NC+1;
end
Result=Fit_best;
'GA'
Result
Solution=X_best;
end
%% 选择
%采用基于轮盘赌法的非线性排名选择
%各个体成员按适应值从大到小分配选择概率:
%P(i)=(q/1-(1-q)^n)*(1-q)^i, 其中 P(0)>(1)>...>(n), sum(P(i))=1
function [selectpop]=NonlinearRankSelect(pop,value)
[m,n]=size(pop);
selectpop=zeros(m,n);
fit=value;
%
selectprob=1-fit/sum(fit); %计算各个体相对适应度(0,1)??????(最小化)
q=min(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
end
%% 交叉
function [NewPop]=CrossOver(OldPop,pCross)
%OldPop为父代种群,pcross为交叉概率
[m,n]=size(OldPop);
NewPop=zeros(m,n); %交叉后种群
%
r=rand(1,m);
A=find(r<pCross); %用于交叉
B=find(r>=pCross);
len=length(A); % 用于交叉的染色体的条数
if len>2&&mod(len,2)==1 %如果用来进行交叉的染色体的条数为奇数,将其调整为偶数
B(length(B)+1)=A(len); %B 多一个
A(len)=[];
len=len-1;
end
if len>=2
for i=1:2len-1)
%opts=unidrnd(2);
opts=1;
if opts==1
[NewPop(A(i),,NewPop(A(i+1),]=CrossOver_1(OldPop(A(i),,OldPop(A(i+1),);
elseif opts==2
[NewPop(A(i),,NewPop(A(i+1),]=CrossOver_2(OldPop(A(i),,OldPop(A(i+1),:));
end
end
end
NewPop(B,:)=OldPop(B,:);
end
[/mw_shl_code] |
|