yichuangsuanfa.m
上传用户:yhmled
上传日期:2022-07-30
资源大小:1k
文件大小:3k
开发平台:

Matlab

  1. function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P)
  2. %--------------------------------------------------------------------------
  3. %  JSPGA.m
  4. %  车间作业调度问题遗传算法
  5. %--------------------------------------------------------------------------
  6. %  输入参数列表
  7. %  M       遗传进化迭代次数
  8. %  N       种群规模(取偶数)
  9. %  Pm      变异概率
  10. %  T       m×n的矩阵,存储m个工件n个工序的加工时间
  11. %  P       1×n的向量,n个工序中,每一个工序所具有的机床数目
  12. %  输出参数列表
  13. %  Zp      最优的Makespan值
  14. %  Y1p     最优方案中,各工件各工序的开始时刻,可根据它绘出甘特图
  15. %  Y2p     最优方案中,各工件各工序的结束时刻,可根据它绘出甘特图
  16. %  Y3p     最优方案中,各工件各工序使用的机器编号
  17. %  Xp      最优决策变量的值,决策变量是一个实数编码的m×n矩阵
  18. %  LC1     收敛曲线1,各代最优个体适应值的记录
  19. %  LC2     收敛曲线2,各代群体平均适应值的记录
  20. %  最后,程序还将绘出三副图片:两条收敛曲线图和甘特图(各工件的调度时序图)
  21. %第一步:变量初始化
  22. [m,n]=size(T);%m是总工件数,n是总工序数
  23. Xp=zeros(m,n);%最优决策变量
  24. LC1=zeros(1,M);%收敛曲线1
  25. LC2=zeros(1,N);%收敛曲线2
  26. %第二步:随机产生初始种群
  27. farm=cell(1,N);%采用细胞结构存储种群
  28. for k=1:N
  29.     X=zeros(m,n);
  30.     for j=1:n
  31.         for i=1:m
  32.             X(i,j)=1+(P(j)-eps)*rand;
  33.         end
  34.     end
  35.     farm{k}=X;
  36. end
  37. counter=0;%设置迭代计数器
  38. while counter
  39.    
  40.     %第三步:交叉
  41.     newfarm=cell(1,N);%交叉产生的新种群存在其中
  42.     Ser=randperm(N);
  43.     for i=1:2:(N-1)
  44.         A=farm{Ser(i)};%父代个体
  45.         B=farm{Ser(i+1)};
  46.         Manner=unidrnd(2);%随机选择交叉方式
  47.         if Manner==1
  48.             cp=unidrnd(m-1);%随机选择交叉点
  49.             %双亲双子单点交叉
  50.             a=[A(1:cp,:);B((cp+1):m,:)];%子代个体
  51.             b=[B(1:cp,:);A((cp+1):m,:)];
  52.         else
  53.             cp=unidrnd(n-1);%随机选择交叉点
  54.             a=[A(:,1:cp),B(:,(cp+1):n)];%双亲双子单点交叉
  55.             b=[B(:,1:cp),A(:,(cp+1):n)];
  56.         end
  57.         newfarm{i}=a;%交叉后的子代存入newfarm
  58.         newfarm{i+1}=b;
  59.     end
  60.     %新旧种群合并
  61.     FARM=[farm,newfarm];
  62.    
  63.     %第四步:选择复制
  64.     FITNESS=zeros(1,2*N);
  65.     fitness=zeros(1,N);
  66.     plotif=0;
  67.     for i=1:(2*N)
  68.         X=FARM{i};
  69.         Z=COST(X,T,P,plotif);%调用计算费用的子函数
  70.         FITNESS(i)=Z;
  71.     end
  72.     %选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力
  73.     Ser=randperm(2*N);
  74.     for i=1:N
  75.         f1=FITNESS(Ser(2*i-1));
  76.         f2=FITNESS(Ser(2*i));
  77.         if f1<=f2
  78.             farm{i}=FARM{Ser(2*i-1)};
  79.             fitness(i)=FITNESS(Ser(2*i-1));
  80.         else
  81.             farm{i}=FARM{Ser(2*i)};
  82.             fitness(i)=FITNESS(Ser(2*i));
  83.         end
  84.     end
  85.     %记录最佳个体和收敛曲线
  86.     minfitness=min(fitness)
  87.     meanfitness=mean(fitness)
  88.     LC1(counter+1)=minfitness;%收敛曲线1,各代最优个体适应值的记录
  89.     LC2(counter+1)=meanfitness;%收敛曲线2,各代群体平均适应值的记录
  90.     pos=find(fitness==minfitness);
  91.     Xp=farm{pos(1)};
  92.    
  93.     %第五步:变异
  94.     for i=1:N
  95.         if Pm>rand;%变异概率为Pm
  96.             X=farm{i};
  97.             I=unidrnd(m);
  98.             J=unidrnd(n);
  99.             X(I,J)=1+(P(J)-eps)*rand;
  100.             farm{i}=X;
  101.         end
  102.     end
  103.     farm{pos(1)}=Xp;
  104.    
  105.     counter=counter+1
  106. end
  107. %输出结果并绘图
  108. figure(1);
  109. plotif=1;
  110. X=Xp;
  111. [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif);
  112. figure(2);
  113. plot(LC1);
  114. figure(3);
  115. plot(LC2);