数学建模社区-数学中国

标题: [求助]车间调度的遗传算法 [打印本页]

作者: rhin    时间: 2006-3-21 09:03
标题: [求助]车间调度的遗传算法

急需,大侠们帮帮忙吧

 


作者: shenjian    时间: 2006-4-14 00:34

niu!!


作者: tanwenyong1000    时间: 2009-8-22 00:51
虽然很久了,给个答案吧,,车间作业调度问题遗传算法通用Matlab程序(2009-04-14 19:01:46)标签:杂谈   
; {8 v6 l' a& N# k明:此程序包含本人的原创成果,尚不能完全公开发表,故随机删掉了其中的几行,一般人是很难将其补充完整并正确运行的。
! x. u/ `- b/ ]function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P), L* c, Q6 `. e3 q" q! a9 X
%--------------------------------------------------------------------------
- x  o8 r0 L8 ]" r7 ]; N- q2 U2 I; ^%  JSPGA.m+ g  j! X8 b; e' _/ O+ O7 e/ ~
%  车间作业调度问题遗传算法
! C7 j" [. W# E1 b5 ~8 g% C%--------------------------------------------------------------------------* t) ^/ o, |3 K; r& }
%  输入参数列表
  A* S  `2 T9 h# F%  M       遗传进化迭代次数
5 Y+ n- V- }) [) D6 s. x* X! j3 D8 U%  N       种群规模(取偶数)
/ H# n2 F- C; q- t7 h%  Pm      变异概率
- l7 O' }- \$ ~, N3 U7 K+ \# u% }%  T       m×n的矩阵,存储m个工件n个工序的加工时间
: y! h7 C# H4 z, Z# s4 W; O%  P       1×n的向量,n个工序中,每一个工序所具有的机床数目* `% _1 o+ Z, k
%  输出参数列表
% P1 n+ ?! U9 E%  Zp      最优的Makespan值
2 T/ {6 [. I4 [0 a% \) w%  Y1p     最优方案中,各工件各工序的开始时刻,可根据它绘出甘特图4 Q) c: q8 i2 U2 a
%  Y2p     最优方案中,各工件各工序的结束时刻,可根据它绘出甘特图
" H) J3 ^9 w* |/ H: x  S8 C8 F%  Y3p     最优方案中,各工件各工序使用的机器编号
6 J/ b- C9 y9 q# X%  Xp      最优决策变量的值,决策变量是一个实数编码的m×n矩阵
" s" {1 X, W+ w/ A# A1 Q%  LC1     收敛曲线1,各代最优个体适应值的记录5 S. y, L; l# G; H# P4 l
%  LC2     收敛曲线2,各代群体平均适应值的记录
# d/ d" Z  ~5 p$ g" K5 Z%  最后,程序还将绘出三副图片:两条收敛曲线图和甘特图(各工件的调度时序图)
0 ^6 d3 M0 b" M2 D
5 ^" }0 ^4 M" o%第一步:变量初始化
% D: D. @0 @+ d. l. ?1 u[m,n]=size(T);%m是总工件数,n是总工序数
" s5 n6 a  l$ OXp=zeros(m,n);%最优决策变量
/ Y, T: \9 L) q; H9 TLC1=zeros(1,M);%收敛曲线11 v2 B8 d% r: T9 F6 [4 I
LC2=zeros(1,N);%收敛曲线2( _* Y/ f6 T, B$ Q3 }

) R7 q* n( f% u0 c+ D0 b%第二步:随机产生初始种群2 D, X9 d0 e+ ]7 m' w
farm=cell(1,N);%采用细胞结构存储种群! ]0 z( J: w$ D) H4 @; c
for k=1:N' M, h* m3 Z7 M! h
    X=zeros(m,n);1 M2 _+ h3 v" W" ]
    for j=1:n3 X; w" J5 N9 }% a- j8 J$ m' |
        for i=1:m
3 w# V% v( D0 [: ]. t& ^            X(i,j)=1+(P(j)-eps)*rand;
# }! t; \, {+ h; [        end
+ q+ _- t. B" v, D+ l2 i3 L! i- H    end& \* H( O- E+ Q) ^' r, i% D/ Y9 V
    farm{k}=X;, o' k" [9 ?+ Z+ \9 G
end- x" {8 s: ]3 C

4 a! g6 S2 x5 O- k7 d6 ]counter=0;%设置迭代计数器- I( W2 d! M6 ^* ]; Y6 H
while counter
$ ?" a8 k1 Z  t/ u, S# d   
/ V; j4 V4 b3 h2 i0 r6 i$ S) {    %第三步:交叉; [" R& i% d% k" `; v# E3 b5 v
    newfarm=cell(1,N);%交叉产生的新种群存在其中' |/ ]2 y" ]: }% }
    Ser=randperm(N);
) V4 h: K5 S# `# c! P    for i=1:2N-1)
" R' |4 k' [, [0 ^        A=farm{Ser(i)};%父代个体
' l4 }$ C# E; o9 r3 Y        B=farm{Ser(i+1)};
5 f5 k5 p5 H: t/ Y! e        Manner=unidrnd(2);%随机选择交叉方式
7 F+ G( P# c/ X/ }        if Manner==1' H% L9 r6 A4 n
            cp=unidrnd(m-1);%随机选择交叉点) \9 E1 p" a. S! N$ |( {0 j
            %双亲双子单点交叉
  ?- I! c$ y! n" E0 y            a=[A(1:cp,;B((cp+1):m,];%子代个体
1 E4 U. @9 h8 t8 M            b=[B(1:cp,;A((cp+1):m,];) b3 t+ _! w  X, D
        else7 Y4 y+ d4 B, L9 g
            cp=unidrnd(n-1);%随机选择交叉点# U3 n9 H% g7 `) t) W7 ^7 \% Q0 u
            a=[A(:,1:cp),B(:,(cp+1):n)];%双亲双子单点交叉
; ^1 T* H; n% m            b=[B(:,1:cp),A(:,(cp+1):n)];
: b& S2 V/ q' g7 {& k8 m. _: ?        end
) j2 h" \( y+ _        newfarm{i}=a;%交叉后的子代存入newfarm
' H+ O! j+ B  c4 O% q. s' z. c; }        newfarm{i+1}=b;! X7 Y0 h0 J, o  w8 k
    end
0 P5 j& B2 a; h& u9 f/ Z' M6 C7 a    %新旧种群合并
7 t5 W, q7 f; t6 U1 s    FARM=[farm,newfarm];8 A0 D; |9 T9 z! G" C
   4 n1 x2 p7 b) f" R* D) t
    %第四步:选择复制( B2 k$ n! q# O4 `9 E% b8 n  f
    FITNESS=zeros(1,2*N);
3 C: m! N5 u% P    fitness=zeros(1,N);
& a' b) M  \) q0 Q$ l    plotif=0;/ {* {7 M3 @5 k( _8 c9 ^' }. N5 O
    for i=12*N)% }9 e) N" U! z. V
        X=FARM{i};
# i& Y& l  P4 `- ~9 S$ Z  I3 ]7 e        Z=COST(X,T,P,plotif);%调用计算费用的子函数4 y/ R1 a* i7 ~
        FITNESS(i)=Z;  p6 S9 f# R# c1 F% L% n) @6 Q, u
    end
4 L6 h# W( L% }- D8 H    %选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力
8 |3 [! f3 Y) |' Z6 U" z) W    Ser=randperm(2*N);
# a  j/ Q, \0 i% O, h5 r  a. C    for i=1:N# f5 ?# t! e  g% O3 b7 g/ I
        f1=FITNESS(Ser(2*i-1));2 z, r+ V! T" _1 O+ \7 P) y
        f2=FITNESS(Ser(2*i));
5 ~$ `& v) ?  Z/ _7 m. i        if f1<=f23 T: x$ D* }! t
            farm{i}=FARM{Ser(2*i-1)};# h0 M, x( `0 o
            fitness(i)=FITNESS(Ser(2*i-1));
" w, l; E5 h8 }4 E$ F$ W9 r        else
9 z5 g* W# w/ F- s  O3 j            farm{i}=FARM{Ser(2*i)};9 q) q- @# a+ E' G4 R' P
            fitness(i)=FITNESS(Ser(2*i));
9 O) f5 c, M! U2 S+ a. |  ^        end) T: O& I8 P2 ]5 d4 l; o. {# N
    end
1 h  o/ D3 k5 i    %记录最佳个体和收敛曲线
; B, f0 H2 b8 `4 l- n    minfitness=min(fitness)
% l9 p' L- d: |% d( F9 l    meanfitness=mean(fitness)2 ~& s+ F" K6 l/ i5 h5 h, \
    LC1(counter+1)=minfitness;%收敛曲线1,各代最优个体适应值的记录: @4 p# M6 n/ T& w6 @
    LC2(counter+1)=meanfitness;%收敛曲线2,各代群体平均适应值的记录
0 v$ B+ J$ g, R1 S0 s+ p/ {    pos=find(fitness==minfitness);& t8 T! U' S) w, G- e
    Xp=farm{pos(1)};! j7 [4 V6 }4 M) `. ?" [. m$ g
   
( g* [0 X" q# j8 S2 q    %第五步:变异
3 ^" i* \2 ]$ C, U! k; X, x9 R  o9 j    for i=1:N& G% l+ }' D# K5 F6 ~
        if Pm>rand;%变异概率为Pm
$ ?; |' S& A5 ]" L, d4 f            X=farm{i};
7 x: Q% s' q, E. v/ r            I=unidrnd(m);
7 s3 M/ K5 g1 s- H& c/ ]# K  {            J=unidrnd(n);
( Y& o( K1 U# T. x0 ~9 S            X(I,J)=1+(P(J)-eps)*rand;5 m) D$ |+ p* ]! k9 q  V
            farm{i}=X;
* X2 G; J4 r8 C3 Y0 |5 O9 i4 g- S* \        end
: \% t2 g0 A) |2 J    end* @& m  Y% i+ {: i
    farm{pos(1)}=Xp;
( M( ?+ C0 C& a% y   
1 j$ u% i' \. _. T5 m3 U. H; W    counter=counter+1
1 d9 P" F# b3 M* v# ]" f2 }4 oend
$ K' V# \4 R/ J* ~& p* n* ?: z# v! }' @( Z: s9 k1 |/ [# R
%输出结果并绘图8 j0 V) s& i( g6 k; G
figure(1);
8 H0 L2 o0 a9 d" ^+ C! g: rplotif=1;; P4 O; w; t5 _. Z" W$ ^7 |
X=Xp;% }6 u6 i5 s1 A2 f' _# U) P! C
[Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif);' O4 q0 v  ]4 c' T# Y* G4 d
figure(2);
0 z" _- j  s) B% q) qplot(LC1);
9 Z, W7 |% y( [8 N1 E# Z+ V8 Ifigure(3);
% p; p( G/ X- }. t% b- C  F+ Nplot(LC2);+ m; V3 }4 A. D8 e& `/ X8 Z- n% K

& k1 k' I6 \, t
4 t3 f8 z, C1 P. _$ j6 d5 V; U# i2 [* ]/ |+ ]1 G8 d0 C

2 O( e/ `0 W/ K+ {function [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif)) B) m& Q  n5 J; V
%  JSPGA的内联子函数,用于求调度方案的Makespan值" {% G9 Y$ P  x( h
%  输入参数列表
3 y  I* E  G) K* c! L& U# ]%  X       调度方案的编码矩阵,是一个实数编码的m×n矩阵- i/ U; c) k5 A) H! q6 S
%  T       m×n的矩阵,存储m个工件n个工序的加工时间
( |0 p3 p0 W5 ^0 y%  P       1×n的向量,n个工序中,每一个工序所具有的机床数目! j1 J- J% V1 R% ]" `" J# S" D" c
%  plotif  是否绘甘特图的控制参数9 e. d; K$ a( Y- X
%  输出参数列表
" A  D, L" r  ^0 }  z%  Zp      最优的Makespan值: |$ f% c/ H  V/ O1 w
%  Y1p     最优方案中,各工件各工序的开始时刻
8 q: s' e- V$ ^7 V! ~%  Y2p     最优方案中,各工件各工序的结束时刻2 g6 M7 ]9 M6 A$ k  z+ |
%  Y3p     最优方案中,各工件各工序使用的机器编号
9 h( a/ p  ?( e# B; D
, U  J- U: m% Q6 `%第一步:变量初始化
/ b, X! v1 |2 K[m,n]=size(X);: }. G7 P9 c4 W* g9 q  ?
Y1p=zeros(m,n);
4 ^# P& I+ h4 g- H& OY2p=zeros(m,n);3 f! l5 ?' i& D# v
Y3p=zeros(m,n);
5 p$ p. B4 E4 a; o
7 D9 r9 Z% ]( ]) G  S/ Y%第二步:计算第一道工序的安排! }; b7 J: u. ~* R* B
Q1=zeros(m,1);
' S$ j: E% N7 X- Y/ @! p! hQ2=zeros(m,1);
  K4 U$ I/ M$ \! p$ ]- BR=X(:,1);%取出第一道工序  I' _2 T6 y1 z' S) [
Q3=floor(R);%向下取整即得到各工件在第一道工序使用的机器的编号5 J, H# `2 i7 K& b
%下面计算各工件第一道工序的开始时刻和结束时刻) v0 m4 F) w" n# U" p0 `! z0 |2 h; G
for i=1(1)%取出机器编号
& T  K8 p$ {! s$ N' N    pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号
+ ?* `9 Y) ^! [* q$ g8 {* |& A/ U    lenpos=length(pos);8 I3 W, O8 ?8 Z8 j9 S% Y% Y& [( Q* z
    if lenpos>=1
, v2 z& T' x3 y# S! j3 g        Q1(pos(1))=0;
# Q3 s  D0 e- i6 k) s9 j! n- y! |        Q2(pos(1))=T(pos(1),1);: n* q- N) p' o+ ?; _5 g  n" ]* y
        if lenpos>=2
6 u: Y. e! ^% q$ K            for j=2:lenpos; m  T$ A2 G$ P3 h" @/ }
                Q1(pos(j))=Q2(pos(j-1));
7 {$ u# g  i5 f/ A                Q2(pos(j))=Q2(pos(j-1))+T(pos(j),1);/ @& {% a$ P  f' g6 B9 v, N( ?' _
            end1 m& v) ^5 @2 J7 S) T* i
        end" Y& i7 @7 x) @0 J1 g& ]3 U" k  ~3 u
    end' W0 W# L: ?+ {' @& G) \1 m8 |
end0 {3 h" g9 L4 E5 R" F1 j
Y1p(:,1)=Q1;
( O/ \. v$ {: A4 N. O9 I$ MY2p(:,1)=Q2;
! \- d6 M1 m! k$ yY3p(:,1)=Q3;
( a5 N4 P+ U2 x$ m& ]7 w1 ~8 n# H; R
% U7 b, |4 ^- C4 f: n( u( x% c( x%第三步:计算剩余工序的安排
4 g* L4 B1 W$ Q; o  ^for k=2:n
9 `. C0 T/ U4 E+ A    R=X(:,k);%取出第k道工序- I: Y) O; N) G" W- g/ i" Y  b' t
    Q3=floor(R);%向下取整即得到各工件在第k道工序使用的机器的编号- L, Q- Z7 y( q! u, }
    %下面计算各工件第k道工序的开始时刻和结束时刻9 F* m* x+ ?7 i6 p% O
    for i=1(k)%取出机器编号
$ N6 M) N8 f% T. n' Q4 P# q" Q; s. [        pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号: B" L3 _) {! e9 k4 M$ N( S+ [: R
        lenpos=length(pos);8 y& n" W9 X6 m9 ]/ U1 x, z& V
        if lenpos>=1
9 d- L& {3 `1 O8 z6 N1 f7 Q            POS=zeros(1,lenpos);%上一个工序完成时间由早到晚的排序
! ^& b0 P7 w4 V            for jj=1:lenpos' }% U5 q- R/ d3 O- m9 _+ U
                MinEndTime=min(EndTime);1 Q% J2 }  F' U
                ppp=find(EndTime==MinEndTime);: Z, n3 s' ^$ \3 G7 G2 S
                POS(jj)=ppp(1);
' c8 d0 Q' X0 B  _                EndTime(ppp(1))=Inf;% H1 F4 ~' w+ c1 K! I1 h% f
            end           
6 ?! v7 |& ~1 F9 ~. T3 Y5 f            %根据上一个工序完成时刻的早晚,计算各工件第k道工序的开始时刻和结束时刻8 t$ d! }, V, W* F7 i' G0 g1 a
                        if lenpos>=2
7 L# h/ N& n( f3 J+ l  {                for j=2:lenpos2 U* t/ z3 F  ]8 S& L
                    Q1(pos(POS(j)))=Y2p(pos(POS(j)),k-1);%预定的开始时刻为上一个工序的结束时刻! O& f4 l1 M7 [, o3 \+ c
                    if Q1(pos(POS(j)))) ~/ i' {/ U7 R* y  q
                        Q1(pos(POS(j)))=Q2(pos(POS(j-1)));
. g% I% Q* f9 E+ M                    end; w2 b; S+ W( q9 j( l
                end2 C" s% |! T& m& G2 [8 J) G& Z
            end
7 J% {! P! p4 r; R3 O" D. T! a6 v        end
. Y% l* @1 W6 b& V" z    end
3 H' ^+ S$ M# c    Y1p(:,k)=Q1;
* q) Y( U  r. J0 p& f. X1 @! ?! b    Y2p(:,k)=Q2;
, k/ g4 {, P$ o4 b2 ^    Y3p(:,k)=Q3;
/ J( X. R0 ?, V- \- E8 |end
) Q" u# s5 Z' b! j' {. |7 R/ I  ~
$ p3 |% U1 w3 s2 y& o3 |/ s%第四步:计算最优的Makespan值+ Q6 _  Q  K/ \" L9 X
Y2m=Y2p(:,n);
7 V& R5 Y: q$ q% i* ~Zp=max(Y2m);7 I' k; f* V" o. @4 \
' I/ H2 |) g8 r* s/ Q2 q
%第五步:绘甘特图
( D4 s9 P5 k/ x7 k' c6 ~if plotif" K- J6 H) f' t8 U1 u9 O
    for i=1:m. v  U- U: N' b' d
        for j=1:n
- l- X# S; P1 O& d: ]5 ]            mPoint1=Y1p(i,j);
. m. _9 R" K  f, g5 J% \6 m            mPoint2=Y2p(i,j);9 m% J( |" i7 S* V
            mText=m+1-i;
6 p1 h+ J; V9 m9 o            PlotRec(mPoint1,mPoint2,mText);
; D+ c- x. d4 s: S. V' E            Word=num2str(Y3p(i,j));
2 E1 k; ^9 Q9 ?+ n+ l! [            %text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);
. ^- _; H* |- a( p            hold on: a! q% j, \8 k" U
            x1=mPoint1;y1=mText-1;# L8 U0 M3 _3 P8 R+ J  S
            x2=mPoint2;y2=mText-1;
% p& R- R' K/ g3 n            x3=mPoint2;y3=mText;' p! z; u! \) Z$ _% {- N# H* v. t/ u. u
            x4=mPoint1;y4=mText;
3 f- a$ @+ P) C4 _3 [5 G            %fill([x1,x2,x3,x4],[y1,y2,y3,y4],'r');: U9 y/ X3 Z7 k; _2 r, @. C
            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,0.5,1]);+ }0 A0 v9 }/ E7 @! d- X
            text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);7 O. m% q  ]; j" _8 Z
        end
! D* _# {& k3 ?- H0 @9 N5 u    end
6 T; o; O( i" l/ r! @, iend
  k  s1 z! C# F: K- A+ T
$ i0 G0 @% h7 C* Z' M
" |- N# r: ^" y8 B: rfunction PlotRec(mPoint1,mPoint2,mText)0 l( b+ n2 v( r& Z' i$ u" I
%  此函数画出小矩形4 j# a- N* ^/ J! @1 L- ^
%  输入:2 k8 ]/ U0 m- d1 Q7 D7 e
%  mPoint1    输入点1,较小,横坐标8 q% N/ ^$ P8 S4 U1 h5 d; j
%  mPoint2    输入点2,较大,横坐标9 M. E! x+ r5 B+ i, f2 Z2 t
%  mText      输入的文本,序号,纵坐标  @+ b! f6 R: L" {
vPoint = zeros(4,2) ;
3 u% k1 f) i3 OvPoint(1, = [mPoint1,mText-1];
4 z) M9 i+ M( R  JvPoint(2, = [mPoint2,mText-1];
( Z3 l# a+ _8 D1 }5 FvPoint(3, = [mPoint1,mText];- b: c: T- e, r9 d$ B  a: x$ i
vPoint(4, = [mPoint2,mText];9 v" b+ N* z3 c5 \3 \
plot([vPoint(1,1),vPoint(2,1)],[vPoint(1,2),vPoint(2,2)]);9 T7 g( h) j$ {
hold on ;& K8 D( D2 S+ Q. m7 j
plot([vPoint(1,1),vPoint(3,1)],[vPoint(1,2),vPoint(3,2)]);" |: v' }2 T6 L8 O3 l
plot([vPoint(2,1),vPoint(4,1)],[vPoint(2,2),vPoint(4,2)]);
: P/ L9 v  q3 n, |1 d! m2 Gplot([vPoint(3,1),vPoint(4,1)],[vPoint(3,2),vPoint(4,2)]);" _! h  D; D+ \) n
, q1 X# H0 c' p/ y  ]

) P' U- k$ X* n9 i* O已投稿到: 排行榜 圈子 阅读(39)|评论(0)|收藏(0)|打印|举报 8 k2 F0 v8 R8 a0 n
前一篇:遗传算法matlab程序
; L6 c% t% {% Q: K# d' A后一篇:Matlab工具箱
作者: fghi225    时间: 2009-9-9 18:27
标题: ~~~

# @4 i8 s9 T, a/ k工作服,各类企业员工制服工作服定做,职员工作服,职业装定做http://www.gzhcx.com/ ~~
作者: 班得瑞    时间: 2011-3-14 09:00
三楼真是好人啊
作者: gaoshanliu水    时间: 2011-3-14 10:24
高手。。。。。。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5