m基于遗传优化的复杂工序调度matlab仿真,输出甘特图和优化收敛图

170 阅读3分钟

1.算法描述

        遗传算法 (Genetic Algorithm,GA) 是一种基于规律进化的随机优化搜索算法,该算法最早是由Holland在1975年提出的。遗传算法的主要优势是通过对目标对象进行优化操作,并通过基于概率的搜索方法,获得相应的搜索空间,因此GA算法具有较强的全局搜索能力。由于遗传算法特有的全局搜索能力,其被广泛使用在各个领域,包括信号处理,机器学习以及控制域等。遗传优化的主要算法流程图如下图所示:

1.png

       遗传算法中每一条染色体,对应着遗传算法的一个解决方案,一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射。遗传算法的实现过程实际上就像自然界的进化过程那样。

 

遗传算法的一般步骤:

 

1.随机产生种群

 

2.根据策略判断个体的适应度,是否符合优化准则,若符合,输出最佳个体及其最优解,结束。否则,进行下一步

 

3.依据适应度选择父母,适应度高的个体被选中的概率高,适应度低的个体被淘汰

 

4.用父母的染色体按照一定的方法进行交叉,生成子代

 

5.对子代染色体进行变异

 

由交叉和变异产生新一代种群,返回步骤2,直到最优解产生

 

基本遗传算法的具体过程如下:

2.png

2.仿真效果预览

matlab2022a仿真如下:

3.png

4.png

5.png

6.png

3.MATLAB核心程序 `.........................................................

Lens = data(:,2);

 

NUM  = length(Lens);%x,y

%间隔

SCALE= 45/60;%转换为小时

Sums = 29;   %每一行的最大值不大于29

Sums2= 24;   %每一行的总和不大于24

%纵坐标最大范围

Ymax = 24;

%放射变换

%根据遗传算法进行参数的拟合

MAXGEN = 400;

NIND   = 2000;

Chrom  = crtbp(NIND,NUM*10);

%49个变量的区间

Areas  = [];

for i = 1:NUM

    Areas  = [Areas,[1;Ymax]];%最多24行

end

 

FieldD = [rep([10],[1,NUM]);Areas;rep([0;0;0;0],[1,NUM])];

 

Error  = zeros(1,MAXGEN);

Error2 = zeros(1,MAXGEN);

for a=1:1:NIND

    J(a,1)  = 0;

end

Objv  = (J+eps);

gen   = 0;

 

 

 

while gen < MAXGEN;   

      gen

      FitnV=ranking(Objv);    

      Selch=select('sus',Chrom,FitnV);    

      Selch=recombin('xovsp', Selch,0.995);   

      Selch=mut( Selch,0.005);   

      phen1=bs2rv(Selch,FieldD);   

      

      for a=1:1:NIND  

          YY  = round(phen1(a,:));

 

          flag= [];

          %设置约束条件,间隔

          for i = 1:Ymax

              indx{i} = find(YY == i);%找到每一行的序列号

          end

 

          Xs=[];

          Ys=[];

          Ls=[];

 

          

          flag = zeros(1,Ymax);

          Numss= 0;

          for i = 1:Ymax

              NO   = indx{i};

              X0   = [];

              Ltmps= Lens(NO);

              Ytmps= YY(NO);

              for j = 1:length(NO)

                  if j == 1

                     X0(j) = 0;

                  else

                     X0(j) = X0(j-1)+Ltmps(j-1)+SCALE;

                  end

              end

              Xs=[Xs,X0];

              Ys=[Ys,Ytmps];

              Ls=[Ls,Ltmps'];

              if  isempty(NO)==0

                  Numss = Numss+1;

                  if X0(end) + Ltmps(end) <= Sums & sum(Ltmps) <= Sums2

                     flag(i)=1;

                  else

                     flag(i)=0;

                  end

              end

          end

          epls = func_obj(Xs,Ys,Ls,Ymax);

          

          

          %符合约束条件的进行输出

          E       = epls;

          JJ(a,1) = E;

          

          XX_{a}  = Xs;

          YY_{a}  = Ys;

          LL_{a}  = Ls;

      end

      Objvsel=(JJ);    

      [Chrom,Objv]=reins(Chrom,Selch,1,0,Objv,Objvsel);   

      gen=gen+1;

      

      Error(gen)=min(JJ);

      

      if gen <= 64

         Error2(gen) = mean(Error(1:gen));

      else

         Error2(gen) = mean(Error(gen-64:gen));

      end

end

figure;

plot(Error2,'b-o');

xlabel('迭代次数');

ylabel('优化目标值');

grid on

%得到最优坐标

[V,I] = min(JJ);

X_opt = XX_{I};

Y_opt = YY_{I};

L_opt = LL_{I};

%画出甘特图

for i = 1:length(L_opt)

    indx   = find(Lens==L_opt(i))

    NO2_(i)= indx(1);

end

figure;

for i=1:length(X_opt)  

    hold on;

    plotRec(X_opt(i),X_opt(i)+L_opt(i),Y_opt(i));

    text((X_opt(i)+X_opt(i)+L_opt(i))/2,Y_opt(i)-0.5,num2str(NO2_(i)));

end

xlabel('时间');

ylabel('序号');

title('甘特图');

02_053m`