人口迁移算法是进化计算领域新出现的一种优化算法,它通过模拟人类社会人口迁移的社会现象,来构造启发式规则,提出的一种新型智能优化算法,GreenSim团队实现了该算法,并加入了一点小改进。本源码由GreenSim团队原创,转载请注明,有意购买源码或代写相关程序,请与GreenSim团队联系(主页http://blog.sina.com.cn/greensim)
%% 人口迁移算法
% 此程序实现人口迁移算法,用于求解无约束连续函数最小化问题
% 对于最大化问题,请先将其加负号转化为最小化问题
% GreenSim算法仿真团队原创作品,转载请注明
% 更多原创源码资源,请访问GreenSim团队主页(http://blog.sina.com.cn/greensim)
%% 第一步:参数设置
clear
%迭代次数K
K=30;
%人口规模N
N=5;
%人口移动中的参数L
L=5;
%初始区域半径δ
Delta0=0.3;
%人口压力警戒参数α
Alpha0=0.01;
%区域收缩系数ρ
Rho=0.9;
%是否使用梯度下降法进行局部搜索的控制参数
IfLocalSearch=0;
%决策变量的个数
M=5;
%决策变量的下界
lb=0*ones(M,1);
%决策变量的上界
ub=pi*ones(M,1);
% GreenSim算法仿真团队原创作品,转载请注明
% 更多原创源码资源,请访问GreenSim团队主页(http://blog.sina.com.cn/greensim)
%% 第二步:初始化
R0=Delta0;%初始球半径
X0=zeros(M,N);%初始球心,存储初始人口群,M×N的矩阵
for i=1:M
x=unifrnd(lb(i),ub(i),1,N);
X0(i,:)=x;
end
ALLX=cell(K,1);%细胞结构,每一个元素是M×N矩阵,记录每一代人口迁移后各区域的个体
ALLY=zeros(K,N);%K×N矩阵,记录每一代人口迁移后各区域个体的评价函数值
BESTX=cell(K,1);%细胞结构,每一个元素是M×1向量,记录每一代的最优个体
BESTY=zeros(K,1);%K×1矩阵,记录每一代的最优个体的评价函数值
k=1;%迭代计数器
X=X0;%当前操作对象初始化
R=R0;%当前区域半径初始化
% GreenSim算法仿真团队原创作品,转载请注明
% 更多原创源码资源,请访问GreenSim团队主页(http://blog.sina.com.cn/greensim)
%% 第三步:最外层的循环,由迭代总次数控制
while k<=K
%% 第四步:演化步(人口流动和人口迁移)
% 第四步直观上看就是:球心在移动,半径在缩小,直到某个门限为止
Y=zeros(1,N);
while R>Alpha0%未超过人口压力警戒
for n=1:N
Xn=X(:,n);
NewXn=zeros(M,L);
NewFitXn=zeros(1,L);
for i=1:L
aa=(max([(Xn-R)';lb']))';
bb=(min([(Xn+R)';ub']))';
NewXni=GaussMutation(Xn,aa,bb);%调用高斯变异子函数
NewXn(:,i)=NewXni;
FitNewXni=FIT(NewXni);%调用计算适应值子函数
NewFitXn(i)=FitNewXni;
end
TempNewXn=[NewXn,Xn];
FitXn=FIT(Xn);
TempNewFitXn=[NewFitXn,FitXn];
%找出最佳位置
minF=min(TempNewFitXn);
pos=find(TempNewFitXn==minF);
Xn=TempNewXn(:,pos(1));
X(:,n)=Xn;
Y(n)=minF;
end
R=Rho*R;
end
% GreenSim算法仿真团队原创作品,转载请注明
% 更多原创源码资源,请访问GreenSim团队主页(http://blog.sina.com.cn/greensim)
%% 第五步:梯度法局部搜索
if IfLocalSearch==1%是否使用局部搜索
for n=1:N
Xn=X(:,n);
Yn=Y(n);
x0=Xn;
ff=optimset;
ff.TolX=1e-10;
ff.TolFun=1e-20;
ff.Display='off';
[x,y]=fminunc('FIT',x0,ff);
if ((sum((x>lb)&(x=M)&&(y<=Yn)
Xn=x;
Yn=y;
end
X(:,n)=Xn;
Y(n)=Yn;
end
end
%% 第六步:找出最佳个体并记录
minY=min(Y);
pos=find(Y==minY);
minX=X(:,pos(1));
ALLX{k,1}=X;
ALLY(k,:)=Y;
BESTX{k,1}=minX;
BESTY(k)=minY;
%% 第七步:在剩余空间随机撒点
newX=zeros(M,N);
newX(:,1)=minX;
for n=2:N
for m=1:M
xmn=unifrnd(lb(m),ub(m));
newX(m,n)=xmn;
end
end
%% 第八步:状态更新
X=newX;
R=R0;
disp(k);
k=k+1;
%%
end
[本帖最后由 edifiers2008 于 2008-11-12 20:00 编辑]
016附图1.jpg
(114.42 KB, 下载次数: 14)
2008-11-12 19:54 上传
016附图2.jpg
(81.47 KB, 下载次数: 10)
2008-11-12 19:54 上传