|
本帖最后由 domcylai 于 2011-11-8 10:17 编辑
2 L. e3 r" d7 M8 g! @
# O% H( C# s; W$ W( V问题描述:现实中某家电配送中心为构建B2C物流仓储系统,为入库系统和出库分拣系统的平衡性研究而引入Flexsim。目前该仓储系统中,入库是基于电子标签,当货物进入系统中贴上标签,由电脑系统安排路线指引小车入库补货;出库方面,由工人驾车拣货,拉至集货区由人工分拣、包装最后配车。
9 R1 p& N: u$ M: W问题特征:由于分拣环节使用人工分拣,效率较低,而且B2C的特点是种类多(多达上千总货物),因此拣货环节是整个配送中心的瓶颈,为找出仓库基于现有设备和出库方式所能够完成的最大出库物数量的临界值* s. V* w _- X( o8 @
本贴为了方便课题的研究,如何实现优化入库部分而作。例如:这个模型表述每天有10~20个波次的订单,每个订单平均有27~54个订单,每个订单需拣选若干货物。! X) ~/ L/ M4 i# H' ]
首先:建立Flexsim 全局表Global_Tables : Waves(波次) Orders(订单) Statistics(统计信息)
# q* D: D4 E3 _* x) H$ E f- p
( y9 e' H; s+ C7 w" g' I: f6 ^其次:Waves表示每天共有几个波次,淡季最少10个波次,旺季最多20个波次每个波次随机27~54个订单,关键代码如下:
% M' d1 Q4 ?3 f1 E& h- _
$ J0 s( i: R; e2 v0 b//There are average of 10~20 per orders one day
K/ W9 j: u! c* X. [settablesize("Waves",duniform(10,20),2); //Set the tablesize:"Waves"
: G( b5 F6 b+ lfor(int i=1;i<=gettablerows("Waves");i++)) Y! M8 A8 c. [5 o/ [, g/ y B
{
# W; E8 [) N6 u) r* Zsettablenum("Waves",i,1,duniform(27,54)); r& w ^. {8 p! j; ]$ S
}
$ P9 A7 I/ G$ _- e- e# e0 g0 @7 V6 T& q* J2 w) U0 ?/ g
若按照每天8h工作时间算,分摊下来没波次到达时间:time=28800/波次吗,则有:
. a' c! {( p: Z3 u5 z, T
" R) O5 `3 j- `+ n; V//Updat repeat time
. j+ v* J5 ?$ \2 E# q4 q% t9 eint repeat = 28800/gettablerows("Waves"); //Arrival time of orders per day
& w9 q- A& u& C- k- R0 Psetnodenum(node("/Tools/UserEvents/Waves>2/1",model()),repeat); //Set this time in node(repeat)
& b) B. V6 h8 [( d" q//set the UserEvent1 num 1;
. {: d9 {! d6 Z2 d2 ]5 _treenode runnum=node("/Tools/UserEvents/Waves>variables/runnum",model());" o% q; {8 Z0 \# z( h5 Z7 e
setnodenum(runnum,1);
3 L% K1 f8 }; X' j* Gsetnodenum(node("/Tools/UserEvents/Waves>variables/repeat",model()),1);
9 M7 |) ?: u3 a0 S8 p( V$ o. U5 {; N: l) E
然后:完成上述Table "Waves" 以后,根据Waves中行中的值设置"Orders"的列,并表示1波次订单数,而此时"Orders"行中的值则表示需配送的货物的数量(如有需要,列数代表不同数量的货物),关键代码如下:5 q! N+ K3 {9 x% U6 X
//Updat Global_Tables% Q5 W& G t( |/ D4 r0 N% j
5 F% h# N9 f2 q7 a
settablenum("Statistics",1,1,i); //Statistics waves in "Statistics" row1 col1- e4 A0 e. g' G7 E8 b, L
settablesize("Orders",gettablenum("Waves",i,1),2); //Set the tablesize:"Orders"
5 `3 g- y4 }0 I, x settablenum("Statistics",1,2,gettablerows("Orders")); //Statistics Orders in "Statistics" row1 col2
7 T9 w9 m9 G0 h) L7 h0 U: Z. D' c3 V! j5 r
//Updat Order list and Statistics
8 i0 N5 i4 k$ v ; H- O; P. | Y6 ?
int num1 = 0; //use num1 to Statistics the number of bulkgoods+ K1 l& o( ~/ f: M# g& U
int num2 = 0; //use num2 to Statistics the number of FCL6 j8 ~9 D; [) t G" _% V" X2 d
& L! Q( p* L6 _/ E
for(int j=1;j<=gettablenum("Statistics",1,2);j++) //j is the rows of "Orders"
' ]. r' C* B1 r" j {
: @" i! { q5 r settablenum("Orders",j,1,duniform(1,8)); //每个订单对应散货bulkgoods数量
+ c+ W" c( m7 e. k0 @* |' k settablenum("Orders",j,2,duniform(1,2)); //每个订单对应整箱FCL数量
. C, P* B0 u4 u3 B H
: {; n: O( t" K7 n. S; [$ p //Statistics4 A" b9 T6 G: Z& X! V
num1 = gettablenum("Orders",j,1) + num1;
/ r7 s2 J, Y; c1 y& Z/ ?+ b+ V4 n num2 = gettablenum("Orders",j,2) + num2;
5 [; f$ |$ p2 w( b9 {/ h }' M+ n) R! D' M f
settablenum("Statistics",1,3,num1); 1 y, @: k* h6 O( i, M
settablenum("Statistics",1,4,num2);
! S# ~% O& T5 x4 ^* B2 Z( L* b: Q4 X1 c; u9 s; T1 a4 w6 t4 v/ _
上述代码就完成了3个表的绘制,如何制作某个循环:依时间顺序读取Waves中每一行的值,且读完最后一行停止(表示今日配送任务完全下达),& n' w; h- D0 B* ^/ k" O) e
请参照"用户事件"帖子:, x9 [1 X4 x% D7 s$ }9 L
http://www.flexsim.asia/viewthread.php?tid=1303&extra=page%3D1 |
|