设为首页收藏本站

最大的系统仿真与系统优化公益交流社区

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2271|回复: 2

函数学习心得

  [复制链接]
发表于 2013-8-18 14:26:23 | 显示全部楼层 |阅读模式
初学者掌握的函数比较少,当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
发表于 2013-8-18 21:08:51 | 显示全部楼层
不错,值得一看
发表于 2013-11-24 13:26:45 | 显示全部楼层
好东西,顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|SimulWay 道于仿真   

GMT+8, 2024-5-7 19:46 , Processed in 0.012098 second(s), 15 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表