数学建模社区-数学中国

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

作者: 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)标签:杂谈   
+ N4 h* F" ^1 Y- S. I: G9 x2 C$ y2 g明:此程序包含本人的原创成果,尚不能完全公开发表,故随机删掉了其中的几行,一般人是很难将其补充完整并正确运行的。 5 J# @- G7 e- R) U3 X2 J
function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P)
0 i0 _7 G  y) p3 y$ R( P%--------------------------------------------------------------------------7 z4 M4 y% O& \' j7 s4 t
%  JSPGA.m7 @  x0 c5 ~7 H) x: Q2 i
%  车间作业调度问题遗传算法
- ^) H6 s. s# N6 m1 H0 w%--------------------------------------------------------------------------7 N, N" W3 A! E) U. {
%  输入参数列表
. `/ z6 l4 E/ V; U%  M       遗传进化迭代次数6 A7 G/ E; z( w( I* v6 ~5 g* L: D3 P
%  N       种群规模(取偶数)
/ ?4 A. c  U' D9 u%  Pm      变异概率
' C% U  m% e4 H7 s( Q% s%  T       m×n的矩阵,存储m个工件n个工序的加工时间
9 ~: |  m$ x% H6 L! v%  P       1×n的向量,n个工序中,每一个工序所具有的机床数目
0 g& ^$ H$ m+ \& ]%  输出参数列表
$ L* \& p) h* B, V1 n( v8 _, }%  Zp      最优的Makespan值) h( i- T, W, P8 R7 F3 z6 K5 l9 ]
%  Y1p     最优方案中,各工件各工序的开始时刻,可根据它绘出甘特图" v0 }' L% W; u# Y( _4 O6 D
%  Y2p     最优方案中,各工件各工序的结束时刻,可根据它绘出甘特图
/ v+ w8 G& }: n  N% \  t1 K% k% V%  Y3p     最优方案中,各工件各工序使用的机器编号* \8 B$ d/ T8 Y
%  Xp      最优决策变量的值,决策变量是一个实数编码的m×n矩阵9 W: [1 B' }! x- R
%  LC1     收敛曲线1,各代最优个体适应值的记录
3 h( @+ W( v' _% Z' i; y%  LC2     收敛曲线2,各代群体平均适应值的记录0 ?! `  r4 V5 h- Z
%  最后,程序还将绘出三副图片:两条收敛曲线图和甘特图(各工件的调度时序图); N2 M% i4 ~; p2 K

2 T6 s0 @* D* V( T2 e% B6 f, E; L%第一步:变量初始化
: b2 K, I: h$ B* p  w8 w7 }[m,n]=size(T);%m是总工件数,n是总工序数. @: `6 p( ^* w
Xp=zeros(m,n);%最优决策变量
+ `/ G  ~: z1 \& L8 J! D* i3 e* wLC1=zeros(1,M);%收敛曲线1
! s1 [( w% H$ ]% zLC2=zeros(1,N);%收敛曲线2
; [  n8 h/ J. Y8 q' `+ t  K' ?/ ^
' F- n2 t! q9 I/ }+ a- f' x) v' }6 q' @%第二步:随机产生初始种群1 E0 n# u( R: f2 J: r& c- S) i
farm=cell(1,N);%采用细胞结构存储种群- i, h; a6 Q; m6 J% F2 ?
for k=1:N
+ n8 z3 l9 f  m8 B1 @7 j% t$ p' Z    X=zeros(m,n);
8 s- G  K' Z8 x- M2 G    for j=1:n
) I) ~: }! y$ C% @( H! H        for i=1:m
# f* d8 y4 h% K2 l( v8 x0 _            X(i,j)=1+(P(j)-eps)*rand;
3 A9 Y6 x9 j3 ^4 \        end% ?4 v$ Z( M4 [% N1 t. |
    end5 P- n% [+ R& s$ S* X& x& K
    farm{k}=X;
( B% g1 c0 G8 E; Z2 f$ r7 |end: i" f- t$ q9 O( ^

" ~8 \; i  H2 A2 K& @, Z/ _counter=0;%设置迭代计数器/ S: Z* ~, k. D1 U& a2 o
while counter
* i- n. `0 x5 w% U! |4 U  s) \   $ n  s: y2 d" @) _
    %第三步:交叉- c' N# B2 h3 e# v7 c3 M+ a
    newfarm=cell(1,N);%交叉产生的新种群存在其中/ o0 G' S( M0 x  ^1 J
    Ser=randperm(N);
) _  I+ E' d" n2 ^; m+ v    for i=1:2N-1)9 S% ~. t( r7 ^
        A=farm{Ser(i)};%父代个体( V8 Z% C% m- c' I7 \# H! q
        B=farm{Ser(i+1)};9 I  m* b2 |" D3 {' l
        Manner=unidrnd(2);%随机选择交叉方式  W8 f0 x( i% q7 ^* r' f
        if Manner==15 V- N  f$ Q- Z1 Y
            cp=unidrnd(m-1);%随机选择交叉点
% c, \0 a- Y  L2 z" W            %双亲双子单点交叉
3 ^; Q& Z2 v3 e) w& T6 g. ^$ }% B' I            a=[A(1:cp,;B((cp+1):m,];%子代个体+ r% _6 N8 Q$ H/ H. y2 n
            b=[B(1:cp,;A((cp+1):m,];
. T0 X  U4 l' H) P        else" q; H5 o! Z9 r( ]  L, z3 a
            cp=unidrnd(n-1);%随机选择交叉点) A1 a" n8 b  q- m1 g
            a=[A(:,1:cp),B(:,(cp+1):n)];%双亲双子单点交叉! W6 v8 h2 u/ ^* c4 N
            b=[B(:,1:cp),A(:,(cp+1):n)];4 T7 Y" P: |! f4 s* `
        end
! ?0 m' m2 V. K6 F6 H" n/ ?        newfarm{i}=a;%交叉后的子代存入newfarm
+ }+ v: E/ Q) P! T6 l! D/ x; }        newfarm{i+1}=b;
1 c* E" y% B4 L% ~9 ?) `* C0 \3 F    end. n) w, F2 L& u1 X
    %新旧种群合并9 F  e( F( t* J# {1 M
    FARM=[farm,newfarm];4 ]" Q% t, S; ]% X( Y, O! R# i$ z# w
   $ `6 I/ p* e- r( l2 N
    %第四步:选择复制
0 _. o$ P) o; Q$ r  w$ U+ e" ^    FITNESS=zeros(1,2*N);
- r- I% l; _7 P    fitness=zeros(1,N);5 ]6 R& @( U! P2 n, q/ L
    plotif=0;
3 [: A$ M9 O+ T1 _7 L& W7 J    for i=12*N)  i7 |9 b7 [# ]3 ?
        X=FARM{i};
& k7 Z" |+ X2 }( j8 _        Z=COST(X,T,P,plotif);%调用计算费用的子函数1 ^' `9 h- v. H: S8 G) P! B0 a
        FITNESS(i)=Z;
6 w) Y( H+ @; |4 u    end
1 I- z# V. e; J3 c    %选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力+ s. A9 B" F" t  J; V* ]
    Ser=randperm(2*N);% s0 b8 A8 t+ I' _) _+ L: u0 N
    for i=1:N
: |3 j9 t8 Z/ A' J        f1=FITNESS(Ser(2*i-1));
, p* h" Y1 R8 E- |        f2=FITNESS(Ser(2*i));4 f: F; U& T3 y9 t4 W! R
        if f1<=f2! Y5 m! n' i# D* t) j
            farm{i}=FARM{Ser(2*i-1)};
" V% W9 a( @6 w3 Q8 ]" h/ u% v            fitness(i)=FITNESS(Ser(2*i-1));
4 L" `4 ]8 Y& C, R) o- c        else7 p1 ]" E* }  n. M# X( g' y
            farm{i}=FARM{Ser(2*i)};1 i2 ?" F  m1 E  y$ ]; o) h
            fitness(i)=FITNESS(Ser(2*i));* \( c$ g/ I( E; K3 i
        end
" M" q+ r) M0 D0 U: F, i$ `    end( `- V' C4 z0 |- T$ Y
    %记录最佳个体和收敛曲线2 W+ N8 k/ j+ y
    minfitness=min(fitness)& J3 Y5 F- V: x, V' r
    meanfitness=mean(fitness)* Q2 q' d* V6 `# f$ s  Y
    LC1(counter+1)=minfitness;%收敛曲线1,各代最优个体适应值的记录
# E* i9 ^- o" w1 H+ k    LC2(counter+1)=meanfitness;%收敛曲线2,各代群体平均适应值的记录" w+ B4 Y" }, J. l
    pos=find(fitness==minfitness);
1 D/ x# ~1 w' e    Xp=farm{pos(1)};
; g7 U+ b9 K4 F7 Q9 V8 x0 a   
+ ~! R7 E4 X' m4 W% ~    %第五步:变异
/ a/ i/ O/ g! d: y8 b; f& K! k    for i=1:N) B" [1 s1 _# D$ j7 C- G/ Q, f
        if Pm>rand;%变异概率为Pm3 O" ?1 ~& ?* s
            X=farm{i};% {; x$ K' X) T6 N% h' x# Q
            I=unidrnd(m);" P" K' i# v8 J; [
            J=unidrnd(n);9 l, E, p: ~) Q! U
            X(I,J)=1+(P(J)-eps)*rand;# ^  `0 ]3 l) H
            farm{i}=X;% M' B. m' I% M4 R2 H9 G
        end% t- P* \: x" \) E4 ^) O
    end4 T& L9 |7 r4 [& \) B" x) T, E
    farm{pos(1)}=Xp;6 R6 i/ Q2 L* h* M! @4 W
   & N+ l" k0 w; ]9 E+ ]8 J7 T" p
    counter=counter+1
+ `3 o  b6 r  ?* @- V2 \- l8 p% eend+ m8 Y' ~+ n; R! e# h3 A- n" S1 R

1 j. R, P" L1 r# ^" p8 _: ?%输出结果并绘图9 Y/ N! }* m2 ^/ E3 M" o% F
figure(1);( x$ b1 A# L! y
plotif=1;) c2 b8 S6 j( a  }, }0 H
X=Xp;  k2 C4 {: d2 O+ W, f
[Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif);
  S' ~+ Q8 ]7 N2 C- X1 P+ zfigure(2);
; y$ a! ?0 j* D! Y$ S  \; pplot(LC1);
6 e( h. R9 k) \" [" `figure(3);
) i0 @/ I- k) t$ O6 g3 n: Dplot(LC2);
/ |0 R( P! n9 l0 b. _8 d" t) H( [( g: D! \+ B( p8 w

2 |' P" U3 v4 F; @8 v
$ h/ \: f0 i) ~; E+ a& h# E. \# _
function [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif): a, P* k) U" S8 @6 A
%  JSPGA的内联子函数,用于求调度方案的Makespan值4 a+ R0 q' ^$ ~
%  输入参数列表" D8 V) @) v4 r5 u0 S" c
%  X       调度方案的编码矩阵,是一个实数编码的m×n矩阵
) V3 q  ~/ ^+ k9 X- P$ \# @$ Y%  T       m×n的矩阵,存储m个工件n个工序的加工时间- _( P7 T" r8 X* Z8 i
%  P       1×n的向量,n个工序中,每一个工序所具有的机床数目5 ]9 z, @1 L& H1 m' v" T0 O( v
%  plotif  是否绘甘特图的控制参数/ h+ {5 f8 k! i( l7 p; @4 g( K) A
%  输出参数列表
2 n6 F3 P6 O# F) V  D, p2 j2 ]%  Zp      最优的Makespan值
: T( Z1 l9 O& {$ k( N/ }& }; {! B%  Y1p     最优方案中,各工件各工序的开始时刻& Y1 Q! J+ _& Q% ]" q! {$ N
%  Y2p     最优方案中,各工件各工序的结束时刻
0 u& `  q3 w! A1 z( r%  Y3p     最优方案中,各工件各工序使用的机器编号
; r6 W8 N! H, P. S
# t8 l- E* S# X: A% e%第一步:变量初始化
+ G" a3 s9 g! n9 ^[m,n]=size(X);- o  m. W. [% y' S
Y1p=zeros(m,n);) s8 n2 X: q' q% P
Y2p=zeros(m,n);+ I0 F8 H( m4 f( w; g5 n
Y3p=zeros(m,n);0 x# x4 ^. i# f9 f$ n4 r& `: {

& c) L5 [1 q0 t6 q%第二步:计算第一道工序的安排
; |6 D2 @0 M1 ^" L, N3 yQ1=zeros(m,1);; u( F' Z  W4 I& n& L) O
Q2=zeros(m,1);, z7 c9 D7 K9 p1 i- _
R=X(:,1);%取出第一道工序
  M' D3 c- W5 p7 dQ3=floor(R);%向下取整即得到各工件在第一道工序使用的机器的编号
. Z! A/ m$ b  a9 {- M! |4 k%下面计算各工件第一道工序的开始时刻和结束时刻
7 l$ s9 h0 N3 T' w; c* x) Y- Gfor i=1(1)%取出机器编号
; [% R3 ]" I0 t5 ^. o. U! u' C8 q    pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号7 h" ?7 z9 X* S- p3 [  F- ]3 R' h
    lenpos=length(pos);8 P/ T# w8 X+ y% J+ W' `* }
    if lenpos>=1
5 E: k% T! V4 q7 D+ X/ U& y) m        Q1(pos(1))=0;3 R' N1 G9 i3 ?  X5 [  S
        Q2(pos(1))=T(pos(1),1);
: u. g" O& H/ ~; v" c/ s# d  I& R! P- [        if lenpos>=2
; [4 r) G  b; X& H            for j=2:lenpos6 c6 N5 V0 W! E+ z3 u+ X: d3 N$ d
                Q1(pos(j))=Q2(pos(j-1));2 R: n" z) @& M  d! I% Y! u
                Q2(pos(j))=Q2(pos(j-1))+T(pos(j),1);
0 T" ]: e1 d* P! F$ C* y: z! h            end
3 D7 p. r6 \1 x4 q4 e& K% z, P        end6 ]6 L/ P$ @0 Q6 q4 y
    end
& _: X5 j  K. H: ~9 w! g- vend6 M6 _  D( b! q0 K. q- w
Y1p(:,1)=Q1;/ t: q  m4 Z$ r/ n8 r2 j/ `" l
Y2p(:,1)=Q2;
  m$ O% @' I, B' q- \Y3p(:,1)=Q3;+ }% {0 z0 V. T0 ?& u
, L4 f+ ?% E9 C+ }6 t5 A
%第三步:计算剩余工序的安排3 [! p6 q! H) `6 s3 K5 ]
for k=2:n4 ~! n3 e6 @' ]( `# U* D* M
    R=X(:,k);%取出第k道工序4 R3 M& S& ^: r" k/ d* Z0 \* s2 q
    Q3=floor(R);%向下取整即得到各工件在第k道工序使用的机器的编号5 J3 k% m8 g5 U& x9 y  k$ N
    %下面计算各工件第k道工序的开始时刻和结束时刻
# H) S+ O1 o  N# z0 X4 L+ ~" p    for i=1(k)%取出机器编号9 U1 ^# D+ l, h8 E# W' Y# @
        pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号
/ p% y5 j1 e; w3 h+ }0 t0 ~& I        lenpos=length(pos);1 h0 Z4 c; h2 Z
        if lenpos>=1
* @/ p9 Q: T" G            POS=zeros(1,lenpos);%上一个工序完成时间由早到晚的排序* q; m& z! o( K& Q" n8 m. L
            for jj=1:lenpos
# n& a( R- \3 d6 C                MinEndTime=min(EndTime);9 m( p- A; |8 z9 n; G  |
                ppp=find(EndTime==MinEndTime);
) l. i! d7 }0 Y8 Z                POS(jj)=ppp(1);+ R5 a: |0 N# P3 H) O( ^% w
                EndTime(ppp(1))=Inf;% q" h* }: i' r9 `3 e8 @1 P
            end           
$ @9 y) d, \( B- d  B5 s% Y9 E( j            %根据上一个工序完成时刻的早晚,计算各工件第k道工序的开始时刻和结束时刻6 w. t. t5 U+ x' F2 H! P# S
                        if lenpos>=2
% f4 A7 b2 C! i                for j=2:lenpos
0 w( i+ y% W4 Y. K                    Q1(pos(POS(j)))=Y2p(pos(POS(j)),k-1);%预定的开始时刻为上一个工序的结束时刻
1 \% l& K, q$ s  S5 V8 }- u  \                    if Q1(pos(POS(j)))& w! L8 j- j2 t& B! y6 ]. ~# h. \
                        Q1(pos(POS(j)))=Q2(pos(POS(j-1)));) |+ ~3 y7 j  ?2 P3 n
                    end8 T1 m' f+ l+ S" r! b
                end
1 x  ?' k5 T" K/ s            end# s5 n: P! b  G( d% \4 v: `
        end6 q. q+ j6 \8 v) v4 K9 D
    end
# y2 ?9 O% e2 k: \1 C    Y1p(:,k)=Q1;6 }$ c* X- L9 ~. }; b! R; E
    Y2p(:,k)=Q2;: L0 {2 a% n( \2 V9 D
    Y3p(:,k)=Q3;
! X; o7 H, V0 b3 k- y# l  M9 L1 Fend
3 U0 t% I5 u: A& p
" A4 j  X- Q: l; I+ ?%第四步:计算最优的Makespan值+ L4 K1 k# v/ w9 w; D" a
Y2m=Y2p(:,n);7 g  \1 q* C: C# m6 G8 I- j
Zp=max(Y2m);
/ M! G% X$ S9 Q2 o% G; U2 }1 u7 e. \- H% t% E8 T
%第五步:绘甘特图
/ L' k% P4 X% A- D% y- h' a* {if plotif  x6 W- x9 m  ]( b2 d
    for i=1:m3 w: i: O1 E5 n9 L
        for j=1:n/ i8 O# y& v- ^/ X% [% A! y
            mPoint1=Y1p(i,j);8 {! s8 T2 V' ]: W: M8 w+ D( r! E  O- K
            mPoint2=Y2p(i,j);+ R! O# N( _6 ?% N7 Z- I6 X
            mText=m+1-i;8 G$ y9 G& J  y9 f3 k/ ]: g
            PlotRec(mPoint1,mPoint2,mText);' J* T  X( N' N
            Word=num2str(Y3p(i,j));7 P4 D, P8 K; R' M3 X8 V+ w5 v
            %text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);
/ x% W% x+ D: m6 h4 @2 Z            hold on
: p3 O( O2 E3 P( T; S6 |9 r3 _            x1=mPoint1;y1=mText-1;& D! h4 y; B' e3 C. U+ w: F
            x2=mPoint2;y2=mText-1;6 K% K3 h+ i8 e. ~7 @% a
            x3=mPoint2;y3=mText;
- {/ g! q# ?  ^; c6 X% e            x4=mPoint1;y4=mText;
: d+ D+ f  X- O0 O- E. S* h. O' C$ x" d            %fill([x1,x2,x3,x4],[y1,y2,y3,y4],'r');. H/ `& A* M  ~7 b% U
            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,0.5,1]);( `5 A  ^# ?2 G# Y; O' M
            text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);
- L6 P$ s) n3 |        end3 C$ W% O  F" ~; P1 d1 P
    end
- J/ L$ p( _3 u: }end
" \8 `" N+ v* @# q$ d6 E% m) Q5 O& J! O- q& }2 I% U5 l! t# q

) o7 B' D( A' w% w  D# H" d8 c# e* Kfunction PlotRec(mPoint1,mPoint2,mText)& Y! V" W9 t# x6 K2 k, t% @" }2 a. m
%  此函数画出小矩形* e  m, z; y( O7 B* b0 w' ^3 y5 ~
%  输入:
5 o6 p6 R/ f& V- l! l. y, W% g%  mPoint1    输入点1,较小,横坐标
9 u: U& \0 T( g8 y* Z8 q* f8 v%  mPoint2    输入点2,较大,横坐标
" g: n* {- k+ U- g* y) }) J%  mText      输入的文本,序号,纵坐标% D  R8 `* J* G2 x" E
vPoint = zeros(4,2) ;( K7 ]) P8 V) ^$ o  U. ?$ U' K' w
vPoint(1, = [mPoint1,mText-1];
2 I9 L% F- M# R6 b4 avPoint(2, = [mPoint2,mText-1];  D' P- F6 ]" w
vPoint(3, = [mPoint1,mText];
) }0 o( v5 G2 I1 _+ s4 Z. v# B5 DvPoint(4, = [mPoint2,mText];8 v2 _* k" ^  W" M3 |
plot([vPoint(1,1),vPoint(2,1)],[vPoint(1,2),vPoint(2,2)]);, B8 g: n; m# @2 S2 }
hold on ;
' \! q5 [5 k* [7 u4 tplot([vPoint(1,1),vPoint(3,1)],[vPoint(1,2),vPoint(3,2)]);9 |/ b# h3 E8 Y) H
plot([vPoint(2,1),vPoint(4,1)],[vPoint(2,2),vPoint(4,2)]);' l% v: g7 Q; e; z2 k
plot([vPoint(3,1),vPoint(4,1)],[vPoint(3,2),vPoint(4,2)]);' z9 g0 f6 }! D' I
( H! Z4 V" n" Z0 ?/ m8 a  p

9 I, T! V  k4 h9 |已投稿到: 排行榜 圈子 阅读(39)|评论(0)|收藏(0)|打印|举报 ) Y. ?6 [# l9 D5 w  G* i* M
前一篇:遗传算法matlab程序
- A. W- H5 l% K8 C  I3 E后一篇:Matlab工具箱
作者: fghi225    时间: 2009-9-9 18:27
标题: ~~~
2 R/ n/ \3 Y6 D0 C  T$ Q
工作服,各类企业员工制服工作服定做,职员工作服,职业装定做http://www.gzhcx.com/ ~~
作者: 班得瑞    时间: 2011-3-14 09:00
三楼真是好人啊
作者: gaoshanliu水    时间: 2011-3-14 10:24
高手。。。。。。




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