找回密码
 注册
Simdroid-非首页
查看: 241|回复: 0

【原创】车间作业调度问题遗传算法通用Matlab程序(附图)

[复制链接]
发表于 2007-3-17 20:02:39 | 显示全部楼层 |阅读模式 来自 河南郑州
GreenSim团队的博客开通了,更多原创程序请访问我们的博客
http://blog.sina.com.cn/greensim
  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. newfarm=cell(1,N);%交叉产生的新种群存在其中
  41. Ser=randperm(N);
  42. for i=1:2:(N-1)
  43. A=farm{Ser(i)};%父代个体
  44. B=farm{Ser(i+1)};
  45. Manner=unidrnd(2);%随机选择交叉方式
  46. if Manner==1
  47. cp=unidrnd(m-1);%随机选择交叉点
  48. %双亲双子单点交叉
  49. a=[A(1:cp,:);B((cp+1):m,:)];%子代个体
  50. b=[B(1:cp,:);A((cp+1):m,:)];
  51. else
  52. cp=unidrnd(n-1);%随机选择交叉点
  53. a=[A(:,1:cp),B(:,(cp+1):n)];%双亲双子单点交叉
  54. b=[B(:,1:cp),A(:,(cp+1):n)];
  55. end
  56. newfarm{i}=a;%交叉后的子代存入newfarm
  57. newfarm{i+1}=b;
  58. end
  59. %新旧种群合并
  60. FARM=[farm,newfarm];

  61. %第四步:选择复制
  62. FITNESS=zeros(1,2*N);
  63. fitness=zeros(1,N);
  64. plotif=0;
  65. for i=1:(2*N)
  66. X=FARM{i};
  67. Z=COST(X,T,P,plotif);%调用计算费用的子函数
  68. FITNESS(i)=Z;
  69. end
  70. %选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力
  71. Ser=randperm(2*N);
  72. for i=1:N
  73. f1=FITNESS(Ser(2*i-1));
  74. f2=FITNESS(Ser(2*i));
  75. if f1<=f2
  76. farm{i}=FARM{Ser(2*i-1)};
  77. fitness(i)=FITNESS(Ser(2*i-1));
  78. else
  79. farm{i}=FARM{Ser(2*i)};
  80. fitness(i)=FITNESS(Ser(2*i));
  81. end
  82. end
  83. %记录最佳个体和收敛曲线
  84. minfitness=min(fitness)
  85. meanfitness=mean(fitness)
  86. LC1(counter+1)=minfitness;%收敛曲线1,各代最优个体适应值的记录
  87. LC2(counter+1)=meanfitness;%收敛曲线2,各代群体平均适应值的记录
  88. pos=find(fitness==minfitness);
  89. Xp=farm{pos(1)};

  90. %第五步:变异
  91. for i=1:N
  92. if Pm>rand;%变异概率为Pm
  93. X=farm{i};
  94. I=unidrnd(m);
  95. J=unidrnd(n);
  96. X(I,J)=1+(P(J)-eps)*rand;
  97. farm{i}=X;
  98. end
  99. end
  100. farm{pos(1)}=Xp;

  101. counter=counter+1
  102. end

  103. %输出结果并绘图
  104. figure(1);
  105. plotif=1;
  106. X=Xp;
  107. [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif);
  108. figure(2);
  109. plot(LC1);
  110. figure(3);
  111. plot(LC2);

  112. function [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif)
  113. % JSPGA的内联子函数,用于求调度方案的Makespan值
  114. % 输入参数列表
  115. % X 调度方案的编码矩阵,是一个实数编码的m×n矩阵
  116. % T m×n的矩阵,存储m个工件n个工序的加工时间
  117. % P 1×n的向量,n个工序中,每一个工序所具有的机床数目
  118. % plotif 是否绘甘特图的控制参数
  119. % 输出参数列表
  120. % Zp 最优的Makespan值
  121. % Y1p 最优方案中,各工件各工序的开始时刻
  122. % Y2p 最优方案中,各工件各工序的结束时刻
  123. % Y3p 最优方案中,各工件各工序使用的机器编号

  124. %第一步:变量初始化
  125. [m,n]=size(X);
  126. Y1p=zeros(m,n);
  127. Y2p=zeros(m,n);
  128. Y3p=zeros(m,n);

  129. %第二步:计算第一道工序的安排
  130. Q1=zeros(m,1);
  131. Q2=zeros(m,1);
  132. R=X(:,1);%取出第一道工序
  133. Q3=floor(R);%向下取整即得到各工件在第一道工序使用的机器的编号
  134. %下面计算各工件第一道工序的开始时刻和结束时刻
  135. for i=1:P(1)%取出机器编号
  136. pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号
  137. lenpos=length(pos);
  138. if lenpos>=1
  139. Q1(pos(1))=0;
  140. Q2(pos(1))=T(pos(1),1);
  141. if lenpos>=2
  142. for j=2:lenpos
  143. Q1(pos(j))=Q2(pos(j-1));
  144. Q2(pos(j))=Q2(pos(j-1))+T(pos(j),1);
  145. end
  146. end
  147. end
  148. end
  149. Y1p(:,1)=Q1;
  150. Y2p(:,1)=Q2;
  151. Y3p(:,1)=Q3;

  152. %第三步:计算剩余工序的安排
  153. for k=2:n
  154. R=X(:,k);%取出第k道工序
  155. Q3=floor(R);%向下取整即得到各工件在第k道工序使用的机器的编号
  156. %下面计算各工件第k道工序的开始时刻和结束时刻
  157. for i=1:P(k)%取出机器编号
  158. pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号
  159. lenpos=length(pos);
  160. if lenpos>=1
  161. POS=zeros(1,lenpos);%上一个工序完成时间由早到晚的排序
  162. for jj=1:lenpos
  163. MinEndTime=min(EndTime);
  164. ppp=find(EndTime==MinEndTime);
  165. POS(jj)=ppp(1);
  166. EndTime(ppp(1))=Inf;
  167. end
  168. %根据上一个工序完成时刻的早晚,计算各工件第k道工序的开始时刻和结束时刻
  169. if lenpos>=2
  170. for j=2:lenpos
  171. Q1(pos(POS(j)))=Y2p(pos(POS(j)),k-1);%预定的开始时刻为上一个工序的结束时刻
  172. if Q1(pos(POS(j)))
  173. Q1(pos(POS(j)))=Q2(pos(POS(j-1)));
  174. end
  175. end
  176. end
  177. end
  178. end
  179. Y1p(:,k)=Q1;
  180. Y2p(:,k)=Q2;
  181. Y3p(:,k)=Q3;
  182. end

  183. %第四步:计算最优的Makespan值
  184. Y2m=Y2p(:,n);
  185. Zp=max(Y2m);

  186. %第五步:绘甘特图
  187. if plotif
  188. for i=1:m
  189. for j=1:n
  190. mPoint1=Y1p(i,j);
  191. mPoint2=Y2p(i,j);
  192. mText=m+1-i;
  193. PlotRec(mPoint1,mPoint2,mText);
  194. Word=num2str(Y3p(i,j));
  195. %text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);
  196. hold on
  197. x1=mPoint1;y1=mText-1;
  198. x2=mPoint2;y2=mText-1;
  199. x3=mPoint2;y3=mText;
  200. x4=mPoint1;y4=mText;
  201. %fill([x1,x2,x3,x4],[y1,y2,y3,y4],'r');
  202. fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,0.5,1]);
  203. text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);
  204. end
  205. end
  206. end

  207. function PlotRec(mPoint1,mPoint2,mText)
  208. % 此函数画出小矩形
  209. % 输入:
  210. % mPoint1 输入点1,较小,横坐标
  211. % mPoint2 输入点2,较大,横坐标
  212. % mText 输入的文本,序号,纵坐标
  213. vPoint = zeros(4,2) ;
  214. vPoint(1,:) = [mPoint1,mText-1];
  215. vPoint(2,:) = [mPoint2,mText-1];
  216. vPoint(3,:) = [mPoint1,mText];
  217. vPoint(4,:) = [mPoint2,mText];
  218. plot([vPoint(1,1),vPoint(2,1)],[vPoint(1,2),vPoint(2,2)]);
  219. hold on ;
  220. plot([vPoint(1,1),vPoint(3,1)],[vPoint(1,2),vPoint(3,2)]);
  221. plot([vPoint(2,1),vPoint(4,1)],[vPoint(2,2),vPoint(4,2)]);
  222. plot([vPoint(3,1),vPoint(4,1)],[vPoint(3,2),vPoint(4,2)]);
复制代码
--------------------------------------------------------------------------------
GreenSim团队简介

——更多原创程序,请访问GreenSim团队的主页→http://blog.sina.com.cn/greensim

    GreenSim团队长期从事建模仿真、算法设计、代写程序等业务,为您提供实验、课题、论文、项目等方面的仿真服务。
    GreenSim团队擅长的学科领域主要有
智能算法】遗传算法、模拟退火、神经网络、蚁群算法、免疫优化、支持向量机、拟物拟人
运筹优化】数学建模、数值优化算法、大规模/非线性问题、组合优化、NP完全问题
信息与通信】无线通信、信号处理、计算机网络
其它学科】任何问题,只要能归结为数学问题或者算法仿真,我们都有实力和信心解决
    GreenSim团队的联系方式:
QQ: 330264704,535115369  Email:
greensim@163.com(来 信 必 复)

[ 本帖最后由 aiwa 于 2007-3-18 13:38 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-23 23:50 , Processed in 0.038856 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表