m基于GA遗传优化的三维工程施工设施布局算法matlab仿真,显示二维和三维布局优化效果

1.算法描述

       GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”中,并按适者生存的原则,从中选择出较适应环境的“染色体”进行复制,再通过交叉,变异过程产生更适应环境的新一代“染色体”群。这样,一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上,它就是问题的最优解。

 

1)编码:将问题的候选解用染色体表示,实现解空间向编码空间的映射过程。遗传算法不直接处理解空间的决策变量,而是将其转换成由基因按一定结构组成的染色体。编码方式有很多,如二进制编码、实数向量编码、整数排列编码、通用数据结构编码等等。本文将采用二进制编码的方式,将十进制的变量转换成二进制,用01组成的数字串模拟染色体,可以很方便地实现基因交叉、变异等操作。

 

2)种群初始化:产生代表问题可能潜在解集的一个初始群体(编码集合)。种群规模设定主要有以下方面的考虑:从群体多样性方面考虑,群体越大越好,避免陷入局部最优;从计算效率方面考虑,群体规模越大将导致计算量的增加。应该根据实际问题确定种群的规模。产生初始化种群的方法通常有两种:一是完全随机的方法产生;二是根据先验知识设定一组必须满足的条件,然后根据这些条件生成初始样本。

 

3)计算个体适应度:利用适应度函数计算各个个体的适应度大小。适应度函数(Fitness Function)的选取直接影响到遗传算法的收敛速度以及能否找到最优解,因为在进化搜索中基本不利用外部信息,仅以适应度函数为依据,利用种群每个个体的适应程度来指导搜索。

 

4)进化计算:通过选择、交叉、变异,产生出代表新的解集的群体。选择(selection):根据个体适应度大小,按照优胜劣汰的原则,淘汰不合理的个体;交叉(crossover):编码的交叉重组,类似于染色体的交叉重组;变异(mutation):编码按小概率扰动产生的变化,类似于基因突变。

 

5)解码:末代种群中的最优个体经过解码实现从编码空间向解空间的映射,可以作为问题的近似最优解。这是整个遗传算法的最后一步,经过若干次的进化过程,种群中适应度最高的个体代表问题的最优解,但这个最优解还是一个由01组成的数字串,要将它转换成十进制才能供我们理解和使用。

 

       通过对一个施工场地的设施进行布局建模仿真(一种二次分配问题),得到最优化的布置结果,要求对施工场地的设施、道路和车辆这三类主体分别编写子程序,做一个具体工程施工设施布局的模拟仿真。 设施均假设为长方体,其属性为设施面积、设施高度以及设施位置,设施用字母F表示。设施面积的表示需要分为两类,第一类设施面积表示为AS=C×R×TCRT均为提前设定的常数),这一类设施在此项目中共有7个(分为F1F7,对应7CRT的值);第二类设施面积AP=K×RKR均为提前设定的常数),这一类设施在此项目中共有3个(分为F8F10,对应3KR的值);

 

       要求每条道路路线不得横穿运输路线上所经设施以外的其他设施或固定建筑,故需用A*算法确定路线(若有更好的算法也可替代),又因为道路有最小宽度的要求,R1宽度为5mR2R7宽度为3m,可以通过为A*算法划分不同大小的网格(3×35×5)来实现宽度的考虑(有别的更好地想法也可提出)

 

      车辆具备的属性为车辆尺寸、车辆高度、单位运输费用,车辆用字母C表示,此项目中车辆种类分为两类,小型运输车C1,长宽高为2×1×2(需要的道路宽度为3m)和大型运输车C2,长宽高为9.6×2.4×4(需要的道路宽度为5m),车辆的行为是从设施i将相应的材料运输至设施j,在案例工程中,7条道路运输材料所对应的车辆使用情况为:R1C2R2R7C1

 

综上所述:整个步骤如下:

 

步骤一:为10个设施在场地中随机分配初始位置和变化速度

 

步骤二:通过α值的变化,调整各个设施的长度和宽度,验证各设施不会重叠、不会与已有的建筑物重叠、且不会布置于场地范围之外,否则重新分配各设施位置

 

步骤三:确定道路的走向和宽度,从而确定各个运输路线的长度d

 

系属性,计算各个设施位置的适应值,根据函数适应值调整设施位置和速度的变化

 

步骤四:进入下一步迭代,重复步骤二至六,直至满足适应值最小值或最大迭代次数为止

 

步骤五:输出迭代过程曲线图、最终10个设施的形心位置、长和宽、道路中心线的方程、以及最终场地布置的三维图(包括场地范围、道路、固定建筑以及设施,固定建筑与设施用不同颜色表示)

 

2.仿真效果预览

matlab2022a仿真结果如下:

 

3.MATLAB核心程序

 

%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
% for i = 1:Nums
%     Areas =[Areas,[1;5000]];
% 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

 

  

 

posted @ 2023-02-13 21:34  我爱C编程  阅读(56)  评论(0编辑  收藏  举报