|
初学者掌握的函数比较少,当flexsim的基本功能无法满足建模的构思时就显得力不从心。如果能够适当使用函数来编写代码,会事半功倍。下面是我的一次经历:
【模型需求】货物每天分34次到达,每次到达都有一个规定的时间(较多集中在18:00-20:00),员工16:30上班,仿真时间从16:30开始,也就是说flexsim中的0时刻代表16:30。将货物到达时间折合成秒数如下表所示。
-16200 -14700 -13800 -13500 -13200 -12600 -12300 -11700 -11400 5400 6000 6300 6600 7500 7800 8100 8100 8100 8400 8400 8400 8400 8700 9000 9300 9300 9600 9600 9900 10200 10200 10200 11700 12900
每次货物到达的数量假设为duniform(1,100)。希望用发生器的到达时间表对此进行模拟。
【解决方法】
1.因为flexsim的到达时间表不能直接将负数的时间值进行统一的归并,会按照到达时间表的差值来确定后面的到达时间,因此,需要手动将0时刻以前到达的货物数量进行求和,并记为0时刻到达。加上后面的25次,总共到达26次。因此需要建立一个到达时间表,到达次数为26次。
2.建立一个3列34行的全局表,用来记录相关数据。列1记录货物数量,列2记录规定的到达时间,列3记录实际到达时间。假设实际到达时间为normal(规定时间,1800)。
3.希望在每次重置时更新实际到达时间,因此需要在发生器的重置触发中写入如下代码。
for(int i = 1 ; i <= 34 ; i++)
{
settablenum( "出口处理卸车", i, 1, duniform(1,100));
settablenum( "出口处理卸车", i, 3, normal(gettablenum("出口处理卸车",i,2),1800));
}
4.将全集表中的实际到达时间写入发生器的到达时间表。在发生器的重置触发中继续写入如下代码。
int sum = 0;
for(int a = 1 ; a<= 9 ; a++)
{
int n = gettablenum("出口处理卸车",a,1);
sum += n;
}
treenode c = rank(rank(variables(current),6),1);//用rank函数来指代发生器的到达时间表
setnodenum(rank(c,1),0);//用rank函数指代相应的单元格
setnodenum(rank(c,4),sum);
for(int b = 10 ; b<= 34 ; b++)
{
treenode arrival = rank(rank(variables(current),6),b-8);
setnodenum(rank(arrival,1),gettablenum("出口处理卸车",b,3));
setnodenum(rank(arrival,4),gettablenum("出口处理卸车",b,1));
}
5.这时会发现,每次重置时,发生器到达时间表都会更新,但是到达时间并未完全按照升序排列。这样的话软件模拟的到达时间会有很大误差,例如到达时间表设置为0,3,2,1,5,而实际到达时间则为0,3,3,3,7,这样,模型的结束时间比预期的结束时间晚了两个单位。
6.为了解决该问题,我问了很多人,也想过用excel表导入的方法(手动排序),但没能解决问题。后来尝试在《Flexsim库函数命令简介.xls》这个文件中搜索可用的函数,终于成功了。
在附件的excel文件中搜索“排序”,查到一个函数: “multisorttable(str/node/num table,num col1[,num clol2,num col3,…]) 说明:通过指定的列对表进行排序。”
于是在发生器重置触发最后一行加入了:
multisorttable(rank(variables(current),6),1);
问题终于得到了解决。
【心得体会】
遇到问题时可以尝试用函数来解决,在附件中查找中文关键词,选取合适的函数,借助操作手册使用函数。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|