clear
clc
close all
%% 车间参数
L = 150; % 场所长度
W = 60; % 场所宽度
LW0 = xlsread('数据.xlsx',1,'C2:D15'); % 设施的长宽
T = xlsread('数据.xlsx',2,'B2:O15'); % 功能关系
A = xlsread('数据.xlsx',3,'B2:O15'); % 物流量
C = xlsread('数据.xlsx',4,'B2:O15'); % 物流成本
Gnum = size(LW0,1); % 设施数量
dim = 2 * Gnum;
%% 遗传算法参数
NP = 100; % 种群大小
maxgen = 500; % 迭代数
Pc = 0.8; %
Pm = 0.4; % 变异概率
Gap = 0.9; % 代沟(Generation gap)
minbound = zeros(1,dim); %
maxbound = L * ones(1,dim); % 边界
big = 1000000;
%% 初始化种群:在满足最小间距的条件下,依次放置,保证初始种群满足约束
X = zeros(NP,dim); % 矩形中心坐标编码
Y = zeros(NP,Gnum); % 矩形长宽方向编码
trysteps = 10000;
for i = 1 : NP
disp(['初始化进程' num2str(i) '/' num2str(NP)])
trying = 1;
while trying % 如果多次尝试摆放仍不能满足约束,则重新开始摆放
trying = 0;
y = round(rand(1,Gnum));
y(1) = 0;
y(end) = 0;
LW = LW0;
for j = 1 : Gnum
if y(j) == 1
LW(j,1:2) = LW0(j,2:-1:1);
end
end
% 放入第一个矩形,直至满足约束
flag = 0;
while ~flag
p = [L * rand,W * rand];
flag = isInRange(p,LW(1,:),L,W);
end
P = p;
% 依次放入其他矩形
for k = 2 : Gnum
dtn = 1;
step = 0; % 试探次数,如果经过很多次试探无法成功,说明第一个摆放有问题
while dtn > 0
flag = 0;
while ~flag % 保证放置的位置满足边界限制
p = [L * rand,W * rand];
flag = isInRange(p,LW(k,:),L,W);
end
Pt = [P ;p];
LWt = LW(1:k,:);
d = CalDistance(Pt,LWt,big); % 计算已放置的设施之间的距离及是否满足间隔
dtag = (d == big);
dtn = sum(sum(dtag)); % 不满足间隔要求的数量
step = step + 1;
if step > trysteps
trying = 1;
break
end
end
P = [P; p];
end
end
X(i,:) = P(:)';
end
Pg = P;
cla
for j = 1 : Gnum
rectangle('Position',[Pg(j,1)-LW(j,1)/2,Pg(j,2)-LW(j,2)/2,LW(j,1),LW(j,2)],'EdgeColor','r')
text(Pg(j,1),Pg(j,2),num2str(j))
hold on
end
axis equal
axis([0 L 0 W])
box on
%% 进化
gen = 1;
Fx = zeros(NP,1);
while gen <= maxgen
gen
% 计算路线长度
for i = 1 : NP
p = [X(i,1:Gnum); X(i,Gnum+1:end)]';
y = Y(i,:);
y(1) = 0;
y(end) = 0;
LW = LW0;
for j = 1 : Gnum
if y(j) == 1
LW(j,1:2) = LW0(j,2:-1:1);
end
end
D = CalDistance(p,LW,big);
Fx(i,1) = Fitness(p,LW,D,A,C,T,L,W,big); % 计算目标函数值
end
% 记录各代最优值
fgbest = min(Fx);
FG(gen) = fgbest; % 各代最短路径
% 计算适应度
fit = 1 ./ (Fx+1); % 将求最小路径转为最大值fit
% 选择
XSel = Select(X,fit,Gap);
YSel = Select(Y,fit,Gap);
% 交叉操作
XSel = XCross(XSel,Pc);
YSel = YCross(YSel,Pc);
% 粒子冲撞
XSel = XMutate(XSel,Pm,minbound,maxbound);
YSel = YMutate(YSel,Pm);
% 重插入子代的新种群
X=Reins(X,XSel,fit);
Y=Reins(Y,YSel,fit);
% 更新迭代次数
gen=gen+1 ;
end
%% 画出最优解的路线图
clc
[fgbest,minInd] = min(Fx);
xgbest = X(minInd(1),:);
ygbest = Y(minInd(1),:);
figure
plot(FG)
xlabel('迭代次数')
ylabel('最优目标函数值')
title('种群迭代曲线')
figure
Pg = [xgbest(1:Gnum); xgbest(Gnum+1:end)]';
ygbest(1) = 0;
ygbest(end) = 0;
LW = LW0;
for j = 1 : Gnum
if ygbest(j) == 1
LW(j,1:2) = LW0(j,2:-1:1);
end
end
D = CalDistance(Pg,LW,big);
[ff,T1,T2] = Fitness(Pg,LW,D,A,C,T,L,W,big); %
fprintf('目标函数1的最优值为 %f \n', T1)
fprintf('目标函数2的最优值为 %f \n', T2)
disp('各区域中心对应坐标值为')
disp(Pg)
for i = 1 : Gnum
rectangle('Position',[Pg(i,1)-LW(i,1)/2,Pg(i,2)-LW(i,2)/2,LW(i,1),LW(i,2)],'EdgeColor','r')
text(Pg(i,1),Pg(i,2),num2str(i))
hold on
end
axis equal
axis([0 L 0 W])
box on
title('优化后设施布局位置')
- 1
- 2
- 3
前往页