数学建模社区-数学中国

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

作者: 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)标签:杂谈   
+ m2 M7 s8 H6 y  O7 |+ ]6 k. l9 J5 H明:此程序包含本人的原创成果,尚不能完全公开发表,故随机删掉了其中的几行,一般人是很难将其补充完整并正确运行的。
5 o" q+ A9 q# J4 E8 [* h8 dfunction [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P)
$ T. r/ x% k% B; x  h4 \%--------------------------------------------------------------------------
2 K' r8 v0 g; l8 ]4 z! R- F%  JSPGA.m" Y9 B2 }; m# D9 O, u$ L: Q
%  车间作业调度问题遗传算法
2 f6 K! b5 E5 _; ]%--------------------------------------------------------------------------0 ?4 @7 q2 B% |: p
%  输入参数列表
% A4 _) ]/ C' z1 G0 K%  M       遗传进化迭代次数
* f. q+ x+ Y; M: _% e( l( o5 J9 |%  N       种群规模(取偶数)
" [$ G- _1 \: @: ?. Y%  Pm      变异概率
' g; D/ ]  O2 T/ l# ^# g%  T       m×n的矩阵,存储m个工件n个工序的加工时间
! C+ y7 |- P6 P%  P       1×n的向量,n个工序中,每一个工序所具有的机床数目
8 b; {* v  l. E/ D0 j" r5 a7 v%  输出参数列表
0 ~% u1 I1 b+ Z; D6 U%  Zp      最优的Makespan值
- ^  q+ y6 J2 L7 p7 y, ?2 C%  Y1p     最优方案中,各工件各工序的开始时刻,可根据它绘出甘特图5 E6 z9 s) ^& P
%  Y2p     最优方案中,各工件各工序的结束时刻,可根据它绘出甘特图
- O& \# W6 X& n6 J2 |) _  W%  Y3p     最优方案中,各工件各工序使用的机器编号
8 _- K" j4 }+ b' E6 Z; v* r1 f: Q%  Xp      最优决策变量的值,决策变量是一个实数编码的m×n矩阵
) \6 q( i8 H6 J6 Q( x9 f8 c%  LC1     收敛曲线1,各代最优个体适应值的记录6 y0 a9 F! U" a5 j
%  LC2     收敛曲线2,各代群体平均适应值的记录* m+ ]9 ?9 G) v
%  最后,程序还将绘出三副图片:两条收敛曲线图和甘特图(各工件的调度时序图)
5 |8 j$ B4 g, R! O) v' `% u0 Q0 v
. P9 j* J0 b! D" {# f- M%第一步:变量初始化
0 {( k8 `* M0 j; H/ N  B& J[m,n]=size(T);%m是总工件数,n是总工序数3 _# p4 _/ i$ i4 m
Xp=zeros(m,n);%最优决策变量
' N" y2 I9 x# ^, |( H, ]LC1=zeros(1,M);%收敛曲线1% T8 W5 j, _% P- ~8 O# Y, i) G
LC2=zeros(1,N);%收敛曲线2
' W$ I& M( p; `6 C! o2 s! P( i
0 m( u( t* U+ c$ ~+ Z* c%第二步:随机产生初始种群
# s3 X3 R8 Y) m7 n( L; Vfarm=cell(1,N);%采用细胞结构存储种群2 q. z) Z4 ^$ ~8 O4 q1 t# d
for k=1:N8 A, z5 k" Y  p( |8 L, j
    X=zeros(m,n);& P9 Y8 w& k$ s& W7 G
    for j=1:n
6 h; u& o1 p, e        for i=1:m
/ P0 m4 O7 P7 x+ x            X(i,j)=1+(P(j)-eps)*rand;
2 s! x- S6 B# ~7 |& S: }& ~) Q2 e        end
* d" P3 K% f2 c    end
- }& B" H9 b$ K) e  y. \% r    farm{k}=X;
6 a6 c2 |, J6 r4 v* T% `) v2 tend# P1 y0 j0 G% ~1 X
" z$ b' N5 e  _. H' R( ~4 \3 T/ K
counter=0;%设置迭代计数器
8 |1 e, C5 ?) hwhile counter
: t: n0 j/ w: d1 F2 Y3 N   5 f$ F% V+ o5 a" E0 Q
    %第三步:交叉
" T+ E0 a$ E3 x. O: S# v3 k    newfarm=cell(1,N);%交叉产生的新种群存在其中0 B! d; {& T; u5 H) n: P1 v9 c
    Ser=randperm(N);, ~: G$ V9 c% B
    for i=1:2N-1)' e& x, T* f; Y7 `/ q
        A=farm{Ser(i)};%父代个体0 d5 J: A& m. g0 p; i/ b: W
        B=farm{Ser(i+1)};  Y* Y9 s, F+ ^* Z
        Manner=unidrnd(2);%随机选择交叉方式% D9 [/ A) P% Z7 y$ ~7 u
        if Manner==1/ s+ B" J( \7 p8 p$ R
            cp=unidrnd(m-1);%随机选择交叉点# @' |5 H) w: H! ]5 G; b. d
            %双亲双子单点交叉
* A" w- d  n& E0 o' {" v, ~            a=[A(1:cp,;B((cp+1):m,];%子代个体
( f* a" F  W, U            b=[B(1:cp,;A((cp+1):m,];0 `" F+ e2 [. n3 s3 q6 v
        else
0 A: s/ p$ u( M7 i; E. ~9 d            cp=unidrnd(n-1);%随机选择交叉点
4 F/ z8 w& o8 r$ }& s            a=[A(:,1:cp),B(:,(cp+1):n)];%双亲双子单点交叉% z& q2 l: D& |( |0 {+ |4 k! o$ `
            b=[B(:,1:cp),A(:,(cp+1):n)];
/ }7 C1 u$ z/ O/ v        end
: U/ g! ]3 }, F! B( P        newfarm{i}=a;%交叉后的子代存入newfarm  v, V% x+ t+ O+ q& ^0 @3 w  h
        newfarm{i+1}=b;
! g1 p+ f0 A9 u    end! s" W% g3 u# Z; F, Y8 D4 h; M
    %新旧种群合并
  F4 n) L9 N& j3 V$ E2 g( j    FARM=[farm,newfarm];# L' Z) P, i, g' z$ t2 o% r% ~
   5 ^; v# H' W  v/ x3 O, ]
    %第四步:选择复制! l- `+ ~9 M% W) l- ^) y; p
    FITNESS=zeros(1,2*N);
' \8 t# B: U2 h    fitness=zeros(1,N);
5 v2 ^! Q7 G, U3 i* z8 ~    plotif=0;3 ]. p* G) l' i  t
    for i=12*N)3 Z+ a  K; N7 N2 v4 f& o
        X=FARM{i};. _3 o7 e8 o4 e2 Z3 Y( h% y4 _
        Z=COST(X,T,P,plotif);%调用计算费用的子函数/ A1 W* i. w3 p9 {1 m6 I
        FITNESS(i)=Z;- i  Q, t) q! v8 k3 I
    end
( z! J2 ]5 _' y! {5 y" o    %选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力' _" H. P: Q8 }% Z# I
    Ser=randperm(2*N);
4 Y+ q! q) o& H/ K    for i=1:N
& ~; n( {' Q$ Q, o- _$ N9 E        f1=FITNESS(Ser(2*i-1));
1 o3 u/ y& Q& S) O. D' u8 T        f2=FITNESS(Ser(2*i));: F. O6 G+ f2 D
        if f1<=f2) v$ v; i6 K$ ^& [5 B. `9 j9 I% k' _+ B
            farm{i}=FARM{Ser(2*i-1)};; A5 Y+ p2 ~2 L* k7 T
            fitness(i)=FITNESS(Ser(2*i-1));
: \8 N' T& T7 F8 O# g        else* w6 A# e, f' o
            farm{i}=FARM{Ser(2*i)};6 w' y7 [& L: B1 b! s
            fitness(i)=FITNESS(Ser(2*i));
7 V; p. L3 p  d" L% R& W- o        end; p+ n! u- l; G
    end
3 t' I! I2 d. Y    %记录最佳个体和收敛曲线& {# n! }: p; C( D! h
    minfitness=min(fitness)
; \# L6 C) b0 m/ C3 c1 K! }. |& d    meanfitness=mean(fitness)
; P8 O9 F. l- ]& V6 a+ s' v    LC1(counter+1)=minfitness;%收敛曲线1,各代最优个体适应值的记录0 V9 G) B$ y: X  G. E5 H
    LC2(counter+1)=meanfitness;%收敛曲线2,各代群体平均适应值的记录/ B* _' c7 I+ j1 g3 F) p$ B2 h! [8 S
    pos=find(fitness==minfitness);
( Z$ z- ?! K' }2 y    Xp=farm{pos(1)};, y, i8 f2 m8 B9 g3 T/ E' h  |
   
# v2 I! N1 D% I/ j3 h) H1 z    %第五步:变异  [+ _( x2 j' l! u! q/ U+ L: J  \5 G
    for i=1:N
) V8 S' m; R- E4 l* g  B7 p        if Pm>rand;%变异概率为Pm# G/ h  b3 h+ s
            X=farm{i};7 e( x& G8 ^% d/ |' K7 D7 s# f0 _- c
            I=unidrnd(m);
$ h* S" R/ V: y2 \8 k" K            J=unidrnd(n);. l8 k5 t/ I2 p" b- J
            X(I,J)=1+(P(J)-eps)*rand;
6 N- x5 f4 ]7 [1 n            farm{i}=X;
% `$ D& k8 d4 Z( F        end
9 m, H8 z7 C: |$ c2 K/ g5 l    end
: i0 U  A: t; w$ m- b/ J; ~    farm{pos(1)}=Xp;1 t5 P1 r0 \+ U
   4 b) W4 J% w; h+ S
    counter=counter+1
) U) N- j7 t) U0 D5 l; t& Z% A: Mend' {- j( Q4 A/ t: A* ~4 R

4 k; L/ ^+ V. r%输出结果并绘图
$ l+ l  z% H3 m" r: u/ c! ?figure(1);8 I$ @# q2 u# n* d# O
plotif=1;
$ C. {" L1 F( ?X=Xp;
: F7 y; ]1 M) K8 S[Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif);4 v6 w1 c  T" K$ n5 p
figure(2);+ i  R3 `' \1 v$ x
plot(LC1);
& w. Y" _) ~4 [; s$ }figure(3);
, o5 `# Q; h2 Y, i2 C# wplot(LC2);4 D2 B& {) q1 n3 J' S( V

1 I: f7 X! l. L 2 V2 X3 B- h' ^( D

6 ?# g$ _. _: @- b, a' ~! @- v2 @
1 H1 N7 Q' r& A, |6 afunction [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif)2 B: ?- B( ~6 J% g7 w. _7 j' ~! G. R/ p
%  JSPGA的内联子函数,用于求调度方案的Makespan值6 g) M6 C9 T/ y1 d+ _: R& ^/ C
%  输入参数列表1 l" P5 S, l% q* P& \
%  X       调度方案的编码矩阵,是一个实数编码的m×n矩阵3 b1 _* J1 c* V. n  V# G. k& a1 x) t
%  T       m×n的矩阵,存储m个工件n个工序的加工时间
7 B& w  T' {- z" y%  P       1×n的向量,n个工序中,每一个工序所具有的机床数目' I9 s6 s  t; z) h* _- d& _) j* @
%  plotif  是否绘甘特图的控制参数+ L7 p) D0 C! |6 v$ |
%  输出参数列表
/ h3 {' g" ~3 D+ \+ x6 |%  Zp      最优的Makespan值
, q8 I8 J" v  c" Q" E/ K%  Y1p     最优方案中,各工件各工序的开始时刻7 r$ P7 E& g9 F9 O
%  Y2p     最优方案中,各工件各工序的结束时刻9 U* X( B$ U  F( h4 m& f
%  Y3p     最优方案中,各工件各工序使用的机器编号
0 I! C7 P+ }, r4 I1 o6 {9 y* ^
& k- m5 [0 \4 I& o7 O%第一步:变量初始化6 D0 b2 G# w7 b, q
[m,n]=size(X);  n/ }, p4 S6 O& y3 I" h7 ]
Y1p=zeros(m,n);
: z& i& ~; Y5 F% o  S+ U4 |% D1 sY2p=zeros(m,n);- l6 p$ a5 w$ |( ~
Y3p=zeros(m,n);0 D2 M2 t" I8 _% I7 D3 `

; v( Y+ q4 N  ?, Q%第二步:计算第一道工序的安排$ Y$ T4 [9 }: v( k1 j
Q1=zeros(m,1);
% n; f- R9 U" J: T8 AQ2=zeros(m,1);
2 V: O9 B+ K) b) o' i# aR=X(:,1);%取出第一道工序
1 T/ G' F( x  M" E2 |: a, ?Q3=floor(R);%向下取整即得到各工件在第一道工序使用的机器的编号
/ @% T/ T, h- J) |, J3 U; w0 f%下面计算各工件第一道工序的开始时刻和结束时刻, g  B- e' ?+ @/ q$ I1 f
for i=1(1)%取出机器编号
! k5 A% ?$ u( o3 S3 E5 ?7 V    pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号
/ f" H; j: n! J2 z8 ]; N    lenpos=length(pos);
; T- q9 |2 u0 T    if lenpos>=1* ]( |# }- D- c. W/ w
        Q1(pos(1))=0;
: {, I7 y& w4 T3 @& S. Q! \$ j        Q2(pos(1))=T(pos(1),1);$ ^5 h! i+ c# {. Q+ t% e/ R
        if lenpos>=20 C, g' n; q) q& Q! o
            for j=2:lenpos
- K. [5 C+ u1 b$ t: h                Q1(pos(j))=Q2(pos(j-1));
1 p+ y2 F4 Y( B. x) v' G9 v6 v                Q2(pos(j))=Q2(pos(j-1))+T(pos(j),1);- s5 a, k% J. Y
            end
( t; L+ i8 f" e& O7 n' _! G) ~        end
+ s+ c+ I6 d6 p8 ]4 U* W, `" T. f    end
; p; O: D) H+ v; Z, bend
& p( e- B8 N- t' ^* XY1p(:,1)=Q1;
: G+ Q* }8 b( y$ T+ c! W* dY2p(:,1)=Q2;
( m0 L- h, V/ P' JY3p(:,1)=Q3;- F$ E# ^7 }  }! |! @0 l, r+ ~/ I

+ U% x. G1 L% U' x2 n' Z%第三步:计算剩余工序的安排
1 r9 Z! h$ X$ L% u  Rfor k=2:n
% S  F2 D' i2 A  h$ X    R=X(:,k);%取出第k道工序+ r+ q. @" c/ a, E! d5 \
    Q3=floor(R);%向下取整即得到各工件在第k道工序使用的机器的编号! T* }+ u. @6 z- _& X
    %下面计算各工件第k道工序的开始时刻和结束时刻  z1 s6 z( n) a5 Q4 F  Y
    for i=1(k)%取出机器编号
5 ~1 w* W$ W2 L* c  ?8 u3 |1 P        pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号0 d) i$ l- P5 V8 r' h4 Q4 }' z
        lenpos=length(pos);: H9 O& q5 Q( s3 [: t* `3 g8 h
        if lenpos>=1
  z$ Y5 W  x. [* [            POS=zeros(1,lenpos);%上一个工序完成时间由早到晚的排序
/ F9 @& l, e" x+ y            for jj=1:lenpos2 O; Y* W/ p. {- R
                MinEndTime=min(EndTime);8 Z" x; O+ ^+ p5 w  M, g& P  N% [% B
                ppp=find(EndTime==MinEndTime);
/ l- I" e; ?2 p9 Y; a                POS(jj)=ppp(1);' X) c# [! w9 D6 c2 |
                EndTime(ppp(1))=Inf;3 G% {& Z8 W9 [) g
            end           
3 X$ z; X& g7 x8 `; J8 P" t4 X            %根据上一个工序完成时刻的早晚,计算各工件第k道工序的开始时刻和结束时刻
7 v" H# p* Z: A) A, w+ X                        if lenpos>=2
5 u% l2 l, _4 |+ @6 }- }( @) u                for j=2:lenpos/ c0 t4 H# r& ]* ?# H6 t
                    Q1(pos(POS(j)))=Y2p(pos(POS(j)),k-1);%预定的开始时刻为上一个工序的结束时刻
$ W' |1 Y( P5 _% q                    if Q1(pos(POS(j)))9 ?7 `* P- R1 A" k/ Q
                        Q1(pos(POS(j)))=Q2(pos(POS(j-1)));4 D6 N* @( X9 }: k& u
                    end
; o; b. H( E2 V! P$ c                end4 D; j: M8 X( I1 S
            end4 R; I. H: `% H. y8 T5 L' B. U
        end
+ U: P2 d8 N+ q2 {    end+ K3 `, p/ P- d- _  x1 z' x; o
    Y1p(:,k)=Q1;, r4 g! {/ }" ~9 v6 L6 R; D
    Y2p(:,k)=Q2;
; A  w: u* ~$ H# y7 R    Y3p(:,k)=Q3;& a- H: h* Z& ?
end
3 L2 n0 o3 v4 g$ U
  \/ I. H% }; f) b7 l%第四步:计算最优的Makespan值
9 G: s: b& ^  [3 \( EY2m=Y2p(:,n);
. c8 D; i$ A5 ~# h+ M( rZp=max(Y2m);3 s3 j9 T. s" h6 d0 [
# r" c- M5 j4 v2 j
%第五步:绘甘特图8 b. G  h* ?* o/ N8 j
if plotif
& \6 A  d( x2 N* \# @* Q    for i=1:m
7 k5 d6 h9 a2 {- T# S$ B! x        for j=1:n
' j, h: w4 O; \) s            mPoint1=Y1p(i,j);( ~) ~: j9 Z% ~4 [! {6 e. x
            mPoint2=Y2p(i,j);
/ X6 M2 f7 P* Q9 `, O            mText=m+1-i;
) M9 }* v' B6 W0 z5 q# {# ~; x. `0 X            PlotRec(mPoint1,mPoint2,mText);
# N: x" x; W* v) `            Word=num2str(Y3p(i,j));7 C/ R( n3 r& p, O( H
            %text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);
# h$ o% I3 t) Y: `            hold on6 d1 I* l: n+ d7 g% F& u* v: I
            x1=mPoint1;y1=mText-1;
1 u9 f* e( D- R' A0 |8 }4 i# s            x2=mPoint2;y2=mText-1;
( c7 Z4 R! |8 Z1 d            x3=mPoint2;y3=mText;; z: t6 K1 k6 {6 v1 n- Q
            x4=mPoint1;y4=mText;$ F  |1 P: w( q$ c3 H
            %fill([x1,x2,x3,x4],[y1,y2,y3,y4],'r');
) \; Q# J( b, n/ K6 X            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,0.5,1]);+ ^  M7 d9 a7 z3 T
            text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);; w7 u0 B* I8 X! [4 _3 E4 |
        end$ I: v6 x! G0 M
    end
. ^" S9 w: B9 Y& X! @$ D& W6 cend) W! v! c& ?# k3 l2 t$ s6 z# o
! B, }) ]- ^1 b
- y6 L8 h: V# `: b0 z; _! e
function PlotRec(mPoint1,mPoint2,mText)
, c. J/ h+ q) k- d%  此函数画出小矩形* Q1 |: _9 [3 O  G' `
%  输入:
+ n$ C6 @1 A( }3 ?" K/ q%  mPoint1    输入点1,较小,横坐标+ x* H+ ?* x; `8 m( H1 e8 @, x
%  mPoint2    输入点2,较大,横坐标
. Z# {3 Q( l3 L8 L3 D; W%  mText      输入的文本,序号,纵坐标9 j( e1 @& ~) g$ Z+ D3 C4 l
vPoint = zeros(4,2) ;, e5 a; j  t& w# k1 n& v. h- E! E; d
vPoint(1, = [mPoint1,mText-1];
2 }9 d2 d0 Q/ P8 S' e% F) H: VvPoint(2, = [mPoint2,mText-1];
, {( N3 q. ^# [* f: FvPoint(3, = [mPoint1,mText];
! ~$ K& x5 F, |  N9 F% w3 O* o9 G+ QvPoint(4, = [mPoint2,mText];
. [4 h' R/ Y& M: T: `  W) Hplot([vPoint(1,1),vPoint(2,1)],[vPoint(1,2),vPoint(2,2)]);2 k: _/ ]7 f% B! }, u; Y9 l
hold on ;
5 b& r* X' Q/ @4 X7 ?8 xplot([vPoint(1,1),vPoint(3,1)],[vPoint(1,2),vPoint(3,2)]);. J0 g6 j6 K7 y+ O; Q6 M
plot([vPoint(2,1),vPoint(4,1)],[vPoint(2,2),vPoint(4,2)]);
+ x* Y+ g7 w) l+ s: K( ^plot([vPoint(3,1),vPoint(4,1)],[vPoint(3,2),vPoint(4,2)]);+ U3 G5 @& l, E" f& i$ z9 H8 l4 c

+ g/ R( W- T3 v6 e; v, U/ U7 O5 c2 C/ e
已投稿到: 排行榜 圈子 阅读(39)|评论(0)|收藏(0)|打印|举报 ! g! e9 R' ~2 q& @
前一篇:遗传算法matlab程序5 y# G) V: B* |+ Q
后一篇:Matlab工具箱
作者: fghi225    时间: 2009-9-9 18:27
标题: ~~~
+ ~. R& `( P) k5 _
工作服,各类企业员工制服工作服定做,职员工作服,职业装定做http://www.gzhcx.com/ ~~
作者: 班得瑞    时间: 2011-3-14 09:00
三楼真是好人啊
作者: gaoshanliu水    时间: 2011-3-14 10:24
高手。。。。。。




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