1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/Y52Vm51s
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
通过对一个施工场地的设施进行布局建模仿真(一种二次分配问题),得到最优化的布置结果,要求对施工场地的设施、道路和车辆这三类主体分别编写子程序,做一个具体工程施工设施布局的模拟仿真。 设施均假设为长方体,其属性为设施面积、设施高度以及设施位置,设施用字母F表示。设施面积的表示需要分为两类,第一类设施面积表示为AS=C×R×T(C、R、T均为提前设定的常数),这一类设施在此项目中共有7个(分为F1至F7,对应7组C、R、T的值);第二类设施面积AP=K×R(K和R均为提前设定的常数),这一类设施在此项目中共有3个(分为F8至F10,对应3组K、R的值);
要求每条道路路线不得横穿运输路线上所经设施以外的其他设施或固定建筑,故需用A*算法确定路线(若有更好的算法也可替代),又因为道路有最小宽度的要求,R1宽度为5m,R2至R7宽度为3m,可以通过为A*算法划分不同大小的网格(3×3或5×5)来实现宽度的考虑(有别的更好地想法也可提出)
车辆具备的属性为车辆尺寸、车辆高度、单位运输费用,车辆用字母C表示,此项目中车辆种类分为两类,小型运输车C1,长宽高为2×1×2(需要的道路宽度为3m)和大型运输车C2,长宽高为9.6×2.4×4(需要的道路宽度为5m),车辆的行为是从设施i将相应的材料运输至设施j,在案例工程中,7条道路运输材料所对应的车辆使用情况为:R1→C2、R2至R7→C1
综上所述:整个步骤如下:
步骤一:为10个设施在场地中随机分配初始位置和变化速度
步骤二:通过α值的变化,调整各个设施的长度和宽度,验证各设施不会重叠、不会与已有的建筑物重叠、且不会布置于场地范围之外,否则重新分配各设施位置
步骤三:确定道路的走向和宽度,从而确定各个运输路线的长度d系属性,计算各个设施位置的适应值,根据函数适应值调整设施位置和速度的变化
步骤四:进入下一步迭代,重复步骤二至六,直至满足适应值最小值或最大迭代次数为止
步骤五:输出迭代过程曲线图、最终10个设施的形心位置、长和宽、道路中心线的方程、以及最终场地布置的三维图(包括场地范围、道路、固定建筑以及设施,固定建筑与设施用不同颜色表示)
4.部分源码
%2道路的参数
% R1:F1→F8→T1/T2
% R2:F2→F9→T1/T2
% R3:F4→F9→T1/T2
% R4:F3→F9→T1/T2
% R5:F5→F9→T1/T2
% R6:F6→F10→T1/T2
% R7:F7→F8→T1/T2
% T1坐标(81.3, 41.4),T2坐标(81.3, 14.6)
global T1;
global T2;
global R;
T1=[95.3, 45.4];
T2=[95.3, 18.6];
%宽度
R =[5,3,3,3,3,3,3];
global C1;
global Wreq1;
global C2;
global Wreq2;
%3车辆
C1 = [2,1,2];
Wreq1= [3];
C2 = [9.6,2.4,4];
Wreq2= [5];
%定义关系值c
self = -1;
c1j =[self,1,1,1,1,0,0,3.5,0,0];
c2j =[1,self,2,2,2,0,0,0,3.5,0];
c3j =[1,2,self,2,2,0,0,0,3.5,0];
c4j =[1,2,2,self,2,0,0,0,3.5,0];
c5j =[1,2,2,2,self,0,0,0,3.5,0];
c6j =[0,0,0,0,0,self,2,0,0,3.5];
c7j =[0,0,0,0,0,0,self,3,0,0];
c8j =[3.5,0,0,0,0,0,0,self,1,1];
c9j =[0,3.5,0,0,3.5,0,0,1,self,1];
c10j =[0,0,0,0,0,3.5,0,1,1,self];
global cij;
cij =[c1j;c2j;c3j;c4j;c5j;c6j;c7j;c8j;c9j;c10j];
for i = 1:length(cij);
for j = 1:length(cij);
if i>j
cij(i,j)=cij(j,i);
end
end
end
global Money;
global WL;
%E_ij指设施i到设施j材料运输单位距离消耗的费用,对应7条道路的取值如下:
Money = [500,200,200,200,200,200,200];
%E物流量
WL = [16,13.3,26.6,4.8,72,8,8];
%两个目标F1和F2的归一化分母值
global NML1;
global NML2;
NML1 = 100;
NML2 = 1e8;
global step;
global x;
global y;
global X0;
global Y0;
global RR;
global CC;
global MAP1;
global MAP2;
%4环境
step = 0.1;
x = [0:step:152.1];
y = [0:step:60.1];
X0 = [];
Y0 = [];
X1 = [];
Y1 = [];
idx1 = 0;
idx2 = 0;
%定义一个图片用来映射当前的场地
RR = round(max(y)/step);
CC = round(max(x)/step);
MAP1 = 0.1*ones(RR,CC);
MAP2 = 2*ones(RR,CC);
for i =1:length(x)
for j =1:length(y)
if (y(j)>0.29*x(i)&x(i)<17.5000|...
y(j)>0.03*x(i)+4.55&x(i)<128.5833&x(i)>=17.5000|...
y(j)>0.51*x(i)-57.17&x(i)<151.1589&x(i)>=128.5833|...
y(j)>25.56*x(i)-3843.7&x(i)<152.1&x(i)>=151.1589)&...
(y(j)<-0.03*x(i)+48.2&x(i)<152.1&x(i)>=22.7077|...
y(j)<-0.68*x(i)+62.96&x(i)<22.7077&x(i)>=4.2003|...
y(j)<5.06*x(i)+38.85&x(i)<4.2003&x(i)>=0.7999|...
y(j)<53.63*x(i)&x(i)<0.7999)
idx1= idx1+1;
X0(idx1)= [x(i)];
Y0(idx1)= [y(j)];
%F2
if (x(i)<75.6 | x(i)>87.1) | (y(j)<34.2 | y(j)>41.4)
%F3
if (x(i)<75.6 | x(i)>87.1) | (y(j)<14.7 | y(j)>21.9)
%F1
if (x(i)<33.9 | x(i)>50.6)|(y(j)<20.8 | y(j)>34.2)
if (x(i)<24.9 | x(i)>58.1)|(y(j)<14.8 | y(j)>20.8)
if(x(i)<24.9 | x(i)>58.1)|(y(j)<34.2 | y(j)>40.2)
idx2= idx2+1;
X1(idx2)= [x(i)];
Y1(idx2)= [y(j)];
end
end
end
end
end
end
end
end
%第二个MAP用于三维显示使用,第二个MAP用于路径搜索使用
for i = 1:length(X0)
MAP1(RR-round(Y0(i)/step)+1,round(X0(i)/step))=0;
end
for i = 1:length(X1)
MAP2(RR-round(Y1(i)/step)+1,round(X1(i)/step))=0;
end
MAP = MAP2;
load step22.mat
%%
%下面开始使用遗传优化算法
%根据遗传算法进行参数的拟合
MAXGEN = 40;
NIND = 25;
Nums = 1;
Sm = 0;
Areas = [];
for i = 1:Nums
Areas =[Areas,[50;100]];
end
Chrom = crtbp(NIND,Nums*10);
FieldD = [rep([10],[1,Nums]);Areas;rep([0;0;0;0],[1,Nums])];
for a=1:NIND
epls = 10;
E = epls;
Js(a,1) = E;
end
Objv = (Js+eps);
gen = 0;
Pe0 = 0.9;
pe1 = 0.1;
JJ2 = [];
idx_final=[];
FIT2= [];
while gen <= MAXGEN
gen = gen+1;
FitnV=ranking(Objv);
Selch=select('sus',Chrom,FitnV);
Selch=recombin('xovsp', Selch,Pe0);
Selch=mut( Selch,pe1);
phen1 = bs2rv(Selch,FieldD);
for a=1:1:NIND
[a,gen]
idx = floor(phen1(a));
if idx > length(infor)
idx = length(infor);
end
xij = infor{idx}(end,:);
%计算对应的目标值
epls = func_objtive2(xij,MAP);
E = epls;
JJ(a,1) = E;
end
Objvsel = [JJ];
[Chrom,Objv] = reins(Chrom,Selch,1,1,Objv,Objvsel);
JJ_ = JJ;
index2 = find(JJ == 100);
JJ_(index2) = [];
FIT(gen) = mean(JJ_);
if gen<=32
FIT2(gen)= mean(FIT(1:gen));
else
FIT2(gen)= mean(FIT(gen-32:gen));
end
end
02_071m