数学建模社区-数学中国

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

作者: 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)标签:杂谈    6 f- q) Q+ y, ?* p
明:此程序包含本人的原创成果,尚不能完全公开发表,故随机删掉了其中的几行,一般人是很难将其补充完整并正确运行的。 % v. m( [  `- I: B' _
function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P)
1 _' d+ m5 Q) k* M7 p%--------------------------------------------------------------------------5 E: W# d# c8 M8 }( b
%  JSPGA.m
' p& K. K4 Y- @9 g%  车间作业调度问题遗传算法
8 m0 q' ], ~! _0 ]%--------------------------------------------------------------------------+ @' `: p* z) U- @" G3 S0 Y
%  输入参数列表
" w9 _4 `' c5 V+ Y  s%  M       遗传进化迭代次数
$ g8 X' B' h, E9 Q  r  o& o, t%  N       种群规模(取偶数)
6 j, A: ]% A3 I  [* ~5 q9 r9 X%  Pm      变异概率  E2 b1 `0 J% {; C
%  T       m×n的矩阵,存储m个工件n个工序的加工时间5 d3 H* k  ?9 r* c/ j9 \
%  P       1×n的向量,n个工序中,每一个工序所具有的机床数目
8 i* T8 D0 d. s2 a5 ~%  输出参数列表5 K' ~+ }  ^8 }; N
%  Zp      最优的Makespan值
6 m4 c" \5 y/ b! g/ W( E. r%  Y1p     最优方案中,各工件各工序的开始时刻,可根据它绘出甘特图# |/ j. n8 I* Q% B
%  Y2p     最优方案中,各工件各工序的结束时刻,可根据它绘出甘特图
5 S! g7 E: V& o* g8 ^5 D%  Y3p     最优方案中,各工件各工序使用的机器编号
# O. k  l! R" C9 n, U. w%  Xp      最优决策变量的值,决策变量是一个实数编码的m×n矩阵  D0 n+ j( ]; e5 X- T- j# K
%  LC1     收敛曲线1,各代最优个体适应值的记录# l% ^; v  n2 u4 Y1 F* J5 X% j
%  LC2     收敛曲线2,各代群体平均适应值的记录
  ~7 ^' G% C, R! g" u) f%  最后,程序还将绘出三副图片:两条收敛曲线图和甘特图(各工件的调度时序图)
0 F, A2 j& y6 ^' T# @* y+ A* `
+ v, s, U/ G  ?4 r/ y%第一步:变量初始化
% x1 Q! t8 h0 s% L$ ~[m,n]=size(T);%m是总工件数,n是总工序数
; ]- _/ k" |. x* @+ SXp=zeros(m,n);%最优决策变量
1 L4 r% S: b9 V4 A' S5 qLC1=zeros(1,M);%收敛曲线1
6 d: u2 t+ q7 \0 S6 u/ wLC2=zeros(1,N);%收敛曲线2
+ T$ o! i% P, k, s$ P/ h* P2 O  Y/ D9 c
%第二步:随机产生初始种群
/ ]8 F) ~. _' h( o+ s! }6 Lfarm=cell(1,N);%采用细胞结构存储种群$ I+ x) Z' E. H
for k=1:N
+ y. P$ P7 f5 Z) G5 S/ m, W) @# [( D    X=zeros(m,n);7 f& q& `' c6 ^* l2 O" V
    for j=1:n4 v( Q  P$ V" X5 N$ [0 m
        for i=1:m4 B- x* `! Z  K  _: X
            X(i,j)=1+(P(j)-eps)*rand;
: V% ]6 }# _# D9 c        end
! R/ O( j4 j- K. c6 u0 f    end6 i# y0 L" `7 [$ z5 j  q8 m* ]
    farm{k}=X;
* n, ~) `& L1 {7 e9 P/ Wend
. U! `: \% o5 e3 f; j; _  v3 q1 u( }' L& k' S
counter=0;%设置迭代计数器
1 ]# a% n! U" D. p: f( f  hwhile counter
+ w/ d" ]8 l& ]$ f; x* |   $ w0 C% V( G3 x
    %第三步:交叉& p- o9 m  s# ]! v3 ]
    newfarm=cell(1,N);%交叉产生的新种群存在其中9 G5 v; d, m. R' i
    Ser=randperm(N);
/ P+ D# Z0 T7 o& c8 q    for i=1:2N-1)
$ p2 n. {' w7 q3 o; \! ?        A=farm{Ser(i)};%父代个体
3 N$ K- R7 C: `- _2 ?        B=farm{Ser(i+1)};; g3 b/ f) ]% l4 f
        Manner=unidrnd(2);%随机选择交叉方式3 j" K! f* X# I4 A8 f, o1 K8 q7 \! d) X
        if Manner==1
2 j+ j" a5 M( x! D* B+ B            cp=unidrnd(m-1);%随机选择交叉点
1 z; T9 W( G2 j4 G4 T5 K            %双亲双子单点交叉
$ r6 O) ^6 e# b% [: P( c) G            a=[A(1:cp,;B((cp+1):m,];%子代个体1 b/ ]: ?$ |' R' }+ u* H
            b=[B(1:cp,;A((cp+1):m,];
% Z- p0 e/ I; j) W* c        else# h5 g: Z* ^4 |( Y' L6 @
            cp=unidrnd(n-1);%随机选择交叉点
7 R5 z' s) E: {$ u/ q+ c            a=[A(:,1:cp),B(:,(cp+1):n)];%双亲双子单点交叉
' l: H( \+ R$ M            b=[B(:,1:cp),A(:,(cp+1):n)];
. g( j: A+ i6 {  ?        end
0 e0 \2 m( W: O        newfarm{i}=a;%交叉后的子代存入newfarm2 u( O$ k+ E7 _% |- `4 E" I
        newfarm{i+1}=b;
3 G, m4 O0 M5 t    end
" n. z! Z2 p: P1 X5 z    %新旧种群合并) w# W; o: q% M! D) f0 F7 q
    FARM=[farm,newfarm];& _, R+ @( ~- S1 q5 E$ g& M! A
   7 U- m4 f7 K3 Q
    %第四步:选择复制
& Y# a' P" @; }* u9 J! k    FITNESS=zeros(1,2*N);) _4 x  Q7 K- ^0 i
    fitness=zeros(1,N);0 d& e; v* v; G; q, ?& ]. g
    plotif=0;2 g) ]. `4 Z8 h0 R7 I
    for i=12*N)6 P) C5 a' |- ?6 j7 ]: [
        X=FARM{i};8 L1 P9 \! j4 m
        Z=COST(X,T,P,plotif);%调用计算费用的子函数
+ B: Q0 L5 v, A        FITNESS(i)=Z;
" \& b# g7 u8 A+ F4 D  A8 {' o    end" F9 k, n* Z! N+ j
    %选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力
3 |  l- N' f( d' x' |    Ser=randperm(2*N);* H+ M; V! I% E$ s+ w
    for i=1:N3 M3 N" i5 l& w+ A, a
        f1=FITNESS(Ser(2*i-1));8 h5 \; i" n% m4 G) e% D0 v
        f2=FITNESS(Ser(2*i));
. ?% ~- R( k3 g: M" F        if f1<=f2  F, ^5 _. l9 g) K) [9 l: F4 }
            farm{i}=FARM{Ser(2*i-1)};8 T' @/ b  Z* g* ~' k- J/ z3 h
            fitness(i)=FITNESS(Ser(2*i-1));* r. r- s% Y; B+ y- h
        else
/ i" Q0 ]( e! k4 n9 u            farm{i}=FARM{Ser(2*i)};) [- U, ?0 g  V, z4 l  E: I
            fitness(i)=FITNESS(Ser(2*i));% ?& ]9 f% q" Q7 @4 f% g2 |
        end
7 l, B0 f* |* j% Y7 _% h2 u# H    end! d: c: ]# y$ D* D5 ?) y/ A2 o
    %记录最佳个体和收敛曲线7 s: z: {$ d7 X6 m
    minfitness=min(fitness)8 d4 s* g& k0 N9 d* z
    meanfitness=mean(fitness)% T, A0 z9 f/ v2 Z
    LC1(counter+1)=minfitness;%收敛曲线1,各代最优个体适应值的记录
- E' i! h! z' t! d    LC2(counter+1)=meanfitness;%收敛曲线2,各代群体平均适应值的记录, n' P9 S' m3 Y" O8 [8 ~
    pos=find(fitness==minfitness);+ }# W' W8 u+ V. [
    Xp=farm{pos(1)};  A$ A6 p% G1 C; `' o  I
   " k5 ^( r; B" e9 {0 C
    %第五步:变异: B$ K2 ?9 w6 b0 R  W8 y5 f
    for i=1:N" n# i5 A$ `1 ~/ E( E" S' y- l: \
        if Pm>rand;%变异概率为Pm4 W/ U$ W  \6 a& Y
            X=farm{i};' ~. K8 h* u! |' f0 w% W: l
            I=unidrnd(m);
, r; [( h3 ~. S' v            J=unidrnd(n);
! E8 Z. I6 S, }) L* |" s            X(I,J)=1+(P(J)-eps)*rand;9 y: p4 a) u' N; e8 l7 I$ R
            farm{i}=X;
2 u! ?+ q8 `) h! M' s$ q        end
6 V# u: U3 }% b" `. ?    end
. c+ \( ~$ u, N% X9 |4 E) q- T$ \    farm{pos(1)}=Xp;
4 w$ g+ j8 P5 a6 H: W& l2 L- i   3 Y& i0 N& ]& P& W4 ^# N
    counter=counter+1
; s. o9 J( P, k7 S4 A! Nend
# K; N+ i/ q( C' b. \+ j; r' ?, {; I$ y" x- u
%输出结果并绘图
( B( G+ Q( Q% D8 ]6 }& Pfigure(1);5 g0 {: B9 Q1 `8 o  w  x2 S
plotif=1;
2 I: K% V' f# \7 ?  jX=Xp;0 N9 W5 m4 N1 ^- P" A3 n5 M7 e
[Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif);6 T$ q  E- G& ~  G$ r/ ~* T
figure(2);
4 z  K" o+ I3 Zplot(LC1);8 ]8 Q9 H& J( x4 V& M% p
figure(3);
2 @7 M( Z- M+ J# Hplot(LC2);) \: j9 G6 P- w3 i7 y

" q  f, g4 e% W ( q( t& g4 h& i9 k& r
3 m% t; h7 |) t+ _  ?

$ _6 x/ ]: J/ ?* P! u1 Qfunction [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif)
4 j$ O4 z- P) T. Q%  JSPGA的内联子函数,用于求调度方案的Makespan值
) ?6 n  }& T$ V/ w3 G3 Z6 w%  输入参数列表
) I( X/ ]* [( J3 l4 n( {# J, P%  X       调度方案的编码矩阵,是一个实数编码的m×n矩阵
2 k7 }8 e4 u) u" f" w8 k" f%  T       m×n的矩阵,存储m个工件n个工序的加工时间; Z0 l8 }1 [& D  Y7 D, C: F
%  P       1×n的向量,n个工序中,每一个工序所具有的机床数目
2 K% e/ H& b* x, T  M  r- v%  plotif  是否绘甘特图的控制参数
* d. P4 _/ v2 {1 t3 \2 h%  输出参数列表9 U( N8 s- f: |/ s( e
%  Zp      最优的Makespan值
  e6 G$ R+ M' B- d. J%  Y1p     最优方案中,各工件各工序的开始时刻
2 I7 @0 h5 X7 U' L%  Y2p     最优方案中,各工件各工序的结束时刻8 V# a: H: t( O, h4 \
%  Y3p     最优方案中,各工件各工序使用的机器编号- Q# M/ I' q4 J- P

$ s  [& C* [2 ^%第一步:变量初始化5 l2 `8 u% q  F/ T1 z
[m,n]=size(X);
' g$ b" x8 U" _$ q" [Y1p=zeros(m,n);
* }" R/ i& K+ {4 J$ rY2p=zeros(m,n);
$ n" s, [6 E) xY3p=zeros(m,n);
# J6 h( {% g: \# D9 `4 ^( c+ z6 D7 W! d
%第二步:计算第一道工序的安排2 P  k" b" W/ F2 J- L1 b
Q1=zeros(m,1);6 W$ f% ?4 X& |5 F/ }
Q2=zeros(m,1);
) z4 E7 W" v/ X1 e+ M' V% p. Y' GR=X(:,1);%取出第一道工序  t+ Q! k! d5 x0 j7 D
Q3=floor(R);%向下取整即得到各工件在第一道工序使用的机器的编号4 g; Z% a$ R1 }5 u
%下面计算各工件第一道工序的开始时刻和结束时刻
2 ~, V+ Q# R+ L! o$ hfor i=1(1)%取出机器编号
7 D6 ?  f$ l: `. n    pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号2 m7 s, A3 z7 p; {- B6 i& z. Q9 y
    lenpos=length(pos);
3 c1 f' N6 y1 R; `! V. ^    if lenpos>=1
9 d% p9 k1 y& i5 x) O- ?        Q1(pos(1))=0;6 V- m9 [5 A' `0 f/ ^, c
        Q2(pos(1))=T(pos(1),1);( v1 Z( M' _6 b/ o0 S
        if lenpos>=2# ~0 @. m  B" E3 R+ ?2 I5 }
            for j=2:lenpos
  |  q" i3 e+ X6 C% Q5 Q( l6 d                Q1(pos(j))=Q2(pos(j-1));
$ ~/ ^# B5 }' d: S7 D4 Y: E                Q2(pos(j))=Q2(pos(j-1))+T(pos(j),1);+ \, Q$ F3 A2 s* b
            end
' i/ c, Q; h5 S, `( W8 i, S        end: N, {4 `: C3 F/ B( v' U& `
    end
1 O' r# N. D: t. O; A* xend
* p8 N) c$ M7 i, c$ t" S, ~Y1p(:,1)=Q1;
/ H7 P+ v% x" TY2p(:,1)=Q2;
5 ?: F& W2 Z' G6 F5 MY3p(:,1)=Q3;
* i( B# b- d* e8 t& \: C' F9 ]6 M  R& f( R4 M( |
%第三步:计算剩余工序的安排3 T* |8 Q! a' V% S) P3 q
for k=2:n
, ~3 a: m6 `% c7 J+ e    R=X(:,k);%取出第k道工序
2 M" ?. g( e2 v- d2 Z6 P    Q3=floor(R);%向下取整即得到各工件在第k道工序使用的机器的编号( S7 z2 M$ G2 i* `6 m$ x5 D
    %下面计算各工件第k道工序的开始时刻和结束时刻. L2 ], Q3 C" n5 V; {: _9 ]
    for i=1(k)%取出机器编号
$ B) o/ j7 z9 i- ?& y# e        pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号5 w6 r: b% b: }! o0 r
        lenpos=length(pos);+ a; k5 O1 l$ J
        if lenpos>=19 h# U% Q" z  Y3 b. U* l
            POS=zeros(1,lenpos);%上一个工序完成时间由早到晚的排序
% N4 l- V8 v- i# R: [9 q3 e7 M            for jj=1:lenpos! h+ }# m' ], b* l
                MinEndTime=min(EndTime);9 S9 {" z0 T0 @, B, x% v$ V, S
                ppp=find(EndTime==MinEndTime);
- R# v! |& M) \                POS(jj)=ppp(1);, v% F( I, J0 h
                EndTime(ppp(1))=Inf;
/ {( w* x4 ]4 R            end           + W7 d& j! s& v: m7 S
            %根据上一个工序完成时刻的早晚,计算各工件第k道工序的开始时刻和结束时刻
9 L  i% B$ N! R# E" ~                        if lenpos>=26 q8 ]+ }1 c, T7 |' e' o
                for j=2:lenpos
3 Z- h8 T4 a) Q2 Q                    Q1(pos(POS(j)))=Y2p(pos(POS(j)),k-1);%预定的开始时刻为上一个工序的结束时刻
- E- h% i5 [" \2 C, _( ~, Q                    if Q1(pos(POS(j))), `& h8 t* W/ m) |& z
                        Q1(pos(POS(j)))=Q2(pos(POS(j-1)));
, t7 N0 E* J8 L! z2 Z& l                    end
1 m' O# f2 ^, e. p8 J- Z( B8 S# H                end! r, i) T6 _! a' t
            end1 R: X5 [, `& J4 ~
        end
8 r; f% G+ J& u/ n    end
& M; p9 m( V) ~    Y1p(:,k)=Q1;% t8 Y. D9 [  z' J4 k8 ?% O  F8 g. A
    Y2p(:,k)=Q2;
( z0 ~) ~! D* v( [0 G3 V; ~    Y3p(:,k)=Q3;
5 [! S- z. o6 U! [) b- d0 I3 r( K9 V1 ~end
( j) |( v1 p& j. r+ q, p$ b( O
# Q1 o" e1 W" M" H* L8 Z+ ?' F: }  l%第四步:计算最优的Makespan值
9 V% z; y3 v: G5 @9 UY2m=Y2p(:,n);8 x% D/ K' E# m4 T
Zp=max(Y2m);
; u0 @; \$ J' Y0 d, i$ E  O' m8 a" A; v0 e- l1 o$ B4 y) \
%第五步:绘甘特图4 c4 P" k# H1 _3 p. [
if plotif
, T6 Z* [$ j1 Z4 S    for i=1:m
2 m2 V% v6 `3 }6 Q        for j=1:n
5 K7 h% ]* n: Y* B# {# L1 ~$ A            mPoint1=Y1p(i,j);
; Y' a; P8 f+ s) j) {' c0 W            mPoint2=Y2p(i,j);
% E# s# `$ T# p4 e6 |- u            mText=m+1-i;
1 {) s1 _/ M. e) j& B            PlotRec(mPoint1,mPoint2,mText);" U( v7 i2 n' v" ]6 l
            Word=num2str(Y3p(i,j));$ [3 Q  ]) Q  P- H
            %text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);
+ |! Q- g( t4 K8 M: K$ _7 ^4 D            hold on
- A' T& l+ A7 f( K$ M) Z+ F            x1=mPoint1;y1=mText-1;$ O2 |5 ~; L, V" r
            x2=mPoint2;y2=mText-1;
8 x! t' E, A8 R0 _/ F/ v8 v            x3=mPoint2;y3=mText;
8 j0 y7 z' r+ [            x4=mPoint1;y4=mText;
/ A/ a% ^+ e% f5 p6 C& p            %fill([x1,x2,x3,x4],[y1,y2,y3,y4],'r');
( ^3 Z* P. Q; z$ F5 B            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,0.5,1]);
8 N& j; ?1 S% L1 N3 D            text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);9 e$ x" r( _( M# |( W0 a
        end
! j% W& V' g- R* i* u1 ?    end
" O, J4 l; {, k' R! qend
- G+ G6 p: A; a0 }' `4 _* B: E: t+ ~, V" q4 Z! U! Q- n0 t) b

: R/ o* C. b$ ^3 P; e* Vfunction PlotRec(mPoint1,mPoint2,mText)  N+ N0 d1 h; W: _6 t+ _6 R7 S. ^
%  此函数画出小矩形; }2 c; O: P+ X& d9 s; l
%  输入:
! ]/ R6 ~  `) b& p0 W  i%  mPoint1    输入点1,较小,横坐标
5 r0 P7 U& z/ d# V8 Z9 O%  mPoint2    输入点2,较大,横坐标. c: s9 ~3 A1 C2 P4 c
%  mText      输入的文本,序号,纵坐标% k  |4 @0 \8 ]% J% t( X9 S# g
vPoint = zeros(4,2) ;# w* z' X( T9 [  j
vPoint(1, = [mPoint1,mText-1];
! Z% [4 q1 G# ^  A- ^vPoint(2, = [mPoint2,mText-1];+ _. N) I8 h2 A1 X- L) |
vPoint(3, = [mPoint1,mText];' {# G% ~! b, N' ~' t
vPoint(4, = [mPoint2,mText];
8 a8 F: p+ J: {4 F" n8 `2 jplot([vPoint(1,1),vPoint(2,1)],[vPoint(1,2),vPoint(2,2)]);+ Q* E/ c' k. s3 O4 {
hold on ;
! m$ \4 p1 i7 S1 ^( kplot([vPoint(1,1),vPoint(3,1)],[vPoint(1,2),vPoint(3,2)]);
- M$ g9 A0 W+ @; o9 l1 h4 d, ?plot([vPoint(2,1),vPoint(4,1)],[vPoint(2,2),vPoint(4,2)]);
, G/ @* {3 t3 A2 F8 m- E2 C! rplot([vPoint(3,1),vPoint(4,1)],[vPoint(3,2),vPoint(4,2)]);' A3 |/ \2 I4 D$ b- [) j
) t0 o6 z; j. k

; G; N- @1 R8 G: H% I" F* y) A已投稿到: 排行榜 圈子 阅读(39)|评论(0)|收藏(0)|打印|举报
) g3 p' X) ]) z4 [; B前一篇:遗传算法matlab程序# R+ B$ V& c) `* a5 Q
后一篇:Matlab工具箱
作者: fghi225    时间: 2009-9-9 18:27
标题: ~~~
+ L6 D* ^0 U3 K# 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