【优化选址】基于帝国企鹅算法求解工厂-中心-需求点三级选址问题附matlab代码
【优化选址】基于帝国企鹅算法求解工厂-中心-需求点三级选址问题附matlab代码
TT_Matlab
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,完整matlab代码或者程序定制加qq1575304183。
1 简介
为了更好的提高物流中心选址的准确性,体现MATLAB的遗传算法在带有时效性的物流中心选址的问题中的计算优势。文中去掉了原有模型中对区域连续性要求的限制条件。利用简单算例,给出运用MATLAB的帝国企鹅算法求解的具体步骤,验证模型和算法的可行性。表明基于MATLAB帝国企鹅算法的优化算法是一种较其他算法更为有效的求解带有时效性约束的物流中心选址问题的算法。
2 部分代码
function [bestY,bestX,recording]
=
AFO2(x,y,option,data)
%%
Input
%
x----positions of initialized populaiton
%
y----fitnesses of initialized populaiton
%
option-----parameters set of the algorithm
%
data------Pre-defined parameters
%
This parameter is used for solving complex problems is passing case data
%%
outPut
%
bestY ----fitness of best individual
%
bestX ----position of best individual
%
recording ---- somme data was recorded in this variable
%%
initialization
pe
=
option.pe;
L
=
option.L;
gap0
=
option.gap0;
gap
=
gap0;
dim
=
option.dim;
maxIteration
=
option.maxIteration;
recording.bestFit
=
zeros(maxIteration+1,1);
recording.meanFit
=
zeros(maxIteration+1,1);
numAgent
=
option.numAgent;
At
=
randn(numAgent,dim);
w2
=
option.w2; %weight of Moving strategy III
w4
=
option.w4;%weight of Moving strategy III
w5
=
option.w5;%weight of Moving strategy III
pe
=
option.pe; % rate to judge Premature convergence
gapMin
=
option.gapMin;
dec
=
option.dec;
ub
=
option.ub;
lb
=
option.lb;
v_lb
=
option.v_lb;
v_ub
=
option.v_ub;
fobj
=
option.fobj;
count
=
1;
%%
center of population
[y_c,position]
=
min(y);
x_c
=
x(position(1),:);
At_c
=
At(position(1),:);
%%
memory of population
y_m
=
y;
x_m
=
x;
%%
update recording
recording.bestFit
=
y_c;
recording.meanFit
=
mean(y_m);
%%
main loop
iter
=
1;
while
iter<=maxIteration
%Dmp([’AFO,iter
:
’,num2str(iter),’,minFit:’,num2str(y_c)])
%%
Moving Strategy I for center of population
if
rem(iter, gap)==0
c0
=
exp(-30*(iter-gap0)/maxIteration); % EQ.2-11
Dx
=
ones(1,dim);
Dx
=
c0*Dx/norm(Dx)*norm(v_ub-v_lb)/2; %EQ.2-12 %+¡÷x
Dx1
=
-Dx; %-¡÷x
%
+¡÷x
for
j=1:dim
tempX(j,
:
)=x_c;
tempX(j,j)
=
x_c(1,j)+Dx(j);
if
tempX(j,j)>ub(j)
tempX(j,j)
=
ub(j);
Dx(1,j)
=
tempX(j,j)-x_c(1,j);
end
if
tempX(j,j)<lb(j)
tempX(j,j)
=
lb(j);
Dx(1,j)
=
tempX(j,j)-x_c(1,j);
end
tempY(j,
:
)=fobj(tempX(j,:));
if
tempY(j)*y_c<0
g0(1,j)
=
(log(tempY(j))-log(y_c))./Dx(j); %EQ.2-18
else
temp
=
[tempY(j),y_c];
temp
=
temp+min(temp)+eps;
g0(1,j)
=
(log(temp(1))-log(temp(2)))./Dx(j);
end
g0(isnan(g0))
=
0;
end
G0
=
-g0(1,:)*norm(v_ub-v_lb)/2/norm(g0(1,:)); % part of Eq 2-18
G0(1,G0(1,
:
)>v_ub)=G0(1,G0(1,:)>v_ub)/max(G0(1,G0(1,:)>v_ub))*max(v_ub(G0(1,:)>v_ub));
G0(1,G0(1,
:
)<v_lb)=G0(1,G0(1,:)<v_lb)/min(G0(1,G0(1,:)<v_lb))*min(v_lb(G0(1,:)<v_lb));
G01
=
G0;
%
-¡÷x
Dx
=
Dx1;
for
j=1:dim
tempX(j+dim,
:
)=x_c;
tempX(j+dim,j)
=
x_c(1,j)+Dx(j);
if
tempX(j+dim,j)>ub(j)
tempX(j+dim,j)
=
ub(j);
Dx(1,j)
=
tempX(j,j)-x_c(1,j);
end
if
tempX(j+dim,j)<lb(j)
tempX(j+dim,j)
=
lb(j);
Dx(1,j)
=
tempX(j,j)-x_c(1,j);
end
tempY(j+dim,
:
)=fobj(tempX(j,:));
if
tempY(j)*y_c<0
g0(1,j)
=
(log(tempY(j))-log(y_c))./Dx(j); %EQ.2-18
else
temp
=
[tempY(j),y_c];
temp
=
temp+min(temp)+eps;
g0(1,j)
=
(log(temp(1))-log(temp(2)))./Dx(j);
end
g0(isnan(g0))
=
0;
end
G0
=
-g0(1,:)*norm(v_ub-v_lb)/2/norm(g0(1,:)); % part of Eq 2-18
G0(1,G0(1,
:
)>v_ub)=G0(1,G0(1,:)>v_ub)/max(G0(1,G0(1,:)>v_ub))*max(v_ub(G0(1,:)>v_ub));
G0(1,G0(1,
:
)<v_lb)=G0(1,G0(1,:)<v_lb)/min(G0(1,G0(1,:)<v_lb))*min(v_lb(G0(1,:)<v_lb));
G02
=
G0;
G0
=
G01+G02; % part of Eq 2-18
G0(isnan(G0))
=
0;
if
sum(G0)==0
N
=
numAgent-2*dim;
Dm
=
mean(x-repmat(x_c,numAgent,1));
Dm
=
norm(Dm); %EQ.2-22
if
Dm<norm(v_ub-v_lb)/20*iter/maxIteration
Dm
=
norm(v_ub-v_lb);
end
for
j=2*dim+(1:N)
G0
=
randn(1,dim);
tempX(j,
:
)=x(i,:)+5*rand*G0./norm(G0)*Dm; %EQ.2-21
tempX(j,tempX(j,
:
)<lb)=lb(tempX(j,:)<lb);
tempX(j,tempX(j,
:
)>ub)=ub(tempX(j,:)>ub);
tempY(j,
:
)=fobj(tempX(j,:));
end
else
N
=
numAgent-2*dim;
r1
=
exp(-10*(0:N-1)/(N-1));
unitG
=
norm(Dx)/norm(G0); %EQ.2-19
if
unitG~=1
r2
=
1:-(1-unitG)/(N-1):unitG;
a
=
r1.*r2; %EQ.2-17
else
a
=
r1;
end
for
j=2*dim+(1:N)
tempX(j,
:
)=x_c+G0*a(j-2*dim); %EQ,2-20
tempX(j,tempX(j,
:
)<lb)=lb(tempX(j,:)<lb);
tempX(j,tempX(j,
:
)>ub)=ub(tempX(j,:)>ub);
tempY(j,
:
)=fobj(tempX(j,:));
end
end
[minY,no]
=
min(tempY);
if
minY<y_c
y_c
=
tempY(no);
x_c
=
tempX(no,:);
end
if
rand>(no-dim*2)/(numAgent-dim*2)*(maxIteration-iter)/maxIteration
gap
=
max(gapMin,gap-dec); %EQ.2-15
end
else
R1
=
rand(numAgent,dim);
R2
=
rand(numAgent,dim);
R3
=
rand(numAgent,dim);
Rn
=
rand(numAgent,dim);
indexR1
=
ceil(rand(numAgent,dim)*numAgent);
indexR2
=
ceil(rand(numAgent,dim)*numAgent);
std0
=
exp(-20*iter/maxIteration)*(v_ub-v_lb)/2;
std1
=
std(x_m);
%
In order to use matrix operations, all individuals of the population are updated.
%
Although more individuals were updated, the running time of the algorithm dropped tremendously.
%
This is because MATLAB is extremely good at matrix operations.
%
If you want to rewrite this code in another language, we suggest you refer to AFO1.
%
AFO2 is optimized for MATLAB and may not be suitable for your language.
for
j=1:dim
x_m1(
:
,j)=x_m(indexR1(:,j),j);
x_m2(
:
,j)=x_m(indexR2(:,j),j);
y_m1(
:
,j)=y_m(indexR1(:,j));
y_m2(
:
,j)=y_m(indexR2(:,j));
AI(
:
,j)=R1(:,j).*sign(y_m1(:,j)-y_m2(:,j)).*(x_m1(:,j)-x_m2(:,j));
if
std1(j)<=std0(j)
position
=
find(AI(:,j)==0);
AI(position,j)
=
Rn(position,j)*(v_ub(j)-v_lb(j))/2;
position
=
find(AI(:,j)~=0);
AI(position,j)
=
R2(:,j).*sign(y_m1(:,j)-y_m2(:,j)).*sign(x_m1(:,j)-x_m2(:,j))*(v_ub(j)-v_lb(j))/2;
end
end
for
i=1:numAgent
p
=
tanh(abs(y(i)-y_c)); %EQ.2-30
if
rand<p*(maxIteration-iter)/maxIteration
%
EQ 2-28
At(i,
:
)=w2*At(i,:)+w4*R1(i,:).*(x_c-x(i,:))+w5*R2(i,:).*(x_m(i,:)-x(i,:));
x(i,
:
)=x(i,:)+At(i,:); %EQ 2-29
x(i,x(i,
:
)<lb)=lb(x(i,:)<lb);
x(i,x(i,
:
)>ub)=ub(x(i,:)>ub);
tempY(i,
:
)=y(i);
y(i)
=
fobj(x(i,:));
if
tempY(i,:)<y(i)
for
j=1:dim
r1
=
indexR1(i,j);
r2
=
indexR2(i,j);
v(i,j)
=
R3(i,j).*(x_m(r1,j)-x_m(r2,j))*-sign(y_m(r1)-y_m(r2));
if
std1(j)<=std0(j)
if
v(i,j)==0
v(i,j)
=
randn*(v_ub(j)-v_lb(j))/2;
else
v(i,j)
=
rand.*sign(x_m(r1,j)-x_m(r2,j))*-sign(y_m(r1)-y_m(r2))*(v_ub(j)-v_lb(j))/2;
end
end
end
end
else
x(i,
:
)=x_c+AI(i,:);
At(i,
:
)=AI(i,:);
x(i,x(i,
:
)<lb)=lb(x(i,:)<lb);
x(i,x(i,
:
)>ub)=ub(x(i,:)>ub);
y(i)
=
fobj(x(i,:));
end
if
y(i)<y_m(i)
y_m(i)
=
y(i);
x_m(i,
:
)=x(i,:);
if
y_m(i)<y_c
y_c
=
y_m(i);
x_c
=
x_m(i,:);
At_c
=
At(i,:);
end
end
end
end
%
EQ.2-31
if
abs(y_c-recording.bestFit(iter))/abs(recording.bestFit(iter))<=pe
count
=
count+1;
else
count
=
0;
end
%%
¸üмǼ
recording.bestFit(1+iter)
=
y_c;
recording.meanFit(1+iter)
=
mean(y_m);
%
recording.std(1+iter)=mean(std(x_m));
%
recording.DC(1+iter)=norm(x_m-repmat(x_c,numAgent,1));
%
recording.x1(1+iter,:)=x(1,:);
iter
=
iter+1;
%%
if
count>L
for
i=1:numAgent
x(i,
:
)=(ub-lb)*rand+lb;
y(i)
=
fobj(x(i,:));
if
y(i)<y_m(i)
y_m(i)
=
y(i);
x_m(i,
:
)=x(i,:);
if
y_m(i)<y_c
y_c
=
y_m(i);
x_c
=
x_m(i,:);
At_c
=
At(i,:);
end
end
end
count
=
0;
recording.bestFit(1+iter)
=
y_c;
recording.meanFit(1+iter)
=
mean(y_m);
iter
=
iter+1;
end
end
bestY
=
y_c;
bestX
=
x_c;
end
%%
3 仿真结果
4 参考文献
[1]李卫江, 郭晓汾, 张毅,等. 基于Matlab优化算法的物流中心选址[J]. 长安大学学报(自然科学版), 2006, 026(003):76-79.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
-
2023年血糖新标准公布,不是3.9-6.1,快来看看你的血糖正常吗? 2023-02-07
-
2023年各省最新电价一览!8省中午执行谷段电价! 2023-01-03
-
GB 55009-2021《燃气工程项目规范》(含条文说明),2022年1月1日起实施 2021-11-07
-
PPT导出高分辨率图片的四种方法 2022-09-22
-
2023年最新!国家电网27家省级电力公司负责人大盘点 2023-03-14
-
全国消防救援总队主官及简历(2023.2) 2023-02-10
-
盘点 l 中国石油大庆油田现任领导班子 2023-02-28
-
我们的前辈!历届全国工程勘察设计大师完整名单! 2022-11-18
-
关于某送变电公司“4·22”人身死亡事故的快报 2022-04-26
