数学建模社区-数学中国
标题:
[求助]车间调度的遗传算法
[打印本页]
作者:
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$ O
Xp=zeros(m,n);%最优决策变量
/ Y, T: \9 L) q; H9 T
LC1=zeros(1,M);%收敛曲线1
1 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:n
3 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:2
N-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
else
7 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=1
2*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<=f2
3 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 o
end
$ 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: r
plotif=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) q
plot(LC1);
9 Z, W7 |% y( [8 N1 E# Z+ V8 I
figure(3);
% p; p( G/ X- }. t% b- C F+ N
plot(LC2);
+ m; V3 }4 A. D8 e& `/ X8 Z- n% K
& k1 k' I6 \, t
4 t3 f8 z, C1 P. _$ j6 d
5 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& O
Y2p=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! h
Q2=zeros(m,1);
K4 U$ I/ M$ \! p$ ]- B
R=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( ?' _
end
1 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 |
end
0 {3 h" g9 L4 E5 R" F1 j
Y1p(:,1)=Q1;
( O/ \. v$ {: A4 N. O9 I$ M
Y2p(:,1)=Q2;
! \- d6 M1 m! k$ y
Y3p(:,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:lenpos
2 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
end
2 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! @, i
end
k s1 z! C# F: K- A+ T
$ i0 G0 @% h7 C* Z' M
" |- N# r: ^" y8 B: r
function 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 O
vPoint(1,
= [mPoint1,mText-1];
4 z) M9 i+ M( R J
vPoint(2,
= [mPoint2,mText-1];
( Z3 l# a+ _8 D1 }5 F
vPoint(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 G
plot([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