发帖
 找回密码
 立即注册
搜索
10 0 0

【脑洞大开】如何快速获取暂存区各类型临时实体数量

技术交流2 10 10 2016-4-19 12:19:49
在某一时点(时点自己决定)想要获取暂存区中临时实体有多少种类型,以及每种类型的临时实体有多少个。
如何编写代码最简洁、占用系统资源最少、逻辑最清晰?
请回复的时候附上主要代码。
附件基于Flexsim7.7.4。

──── 0人觉得很赞 ────

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2016-4-19 14:21:49
响应加老师号召,完成模型。
不过我一向不是极简主义者,因此可能提供的模型与“最简洁,所占资源最少”无缘。
我的思路主要集中在,用一个全局表来显示,为了使得能够获取不同类型的变动情况,还特别添加一个dashboard来表示。
主要代码在暂存区的进入触发,重置触发里面只是在重置中修正了一下全局表的大小。[code]int type = getitemtype(item);

//如果已存在该类型,则对应单元格加1
for(int i=1;i<=gettablerows("GlobalTable1");i++)
{
        if(gettablenum("GlobalTable1",1,2) == 0)
        {
                settablenum("GlobalTable1",1,2,type);
                settablenum("GlobalTable1",1,1,1);
                settableheader("GlobalTable1",1,1,concat("type",numtostring(type)));
                return 0;
        }
                               
        if(type == gettablenum("GlobalTable1",i,2))
        {
                inc(gettablecell("GlobalTable1", i, 1),1);
                return 0;
        }
}


//如果是一个新的类型则多添加一行
addtablerow(reftable("GlobalTable1"),1,DATATYPE_NUMBER);
settableheader("GlobalTable1",1,1,concat("type",numtostring(type)));
settablenum("GlobalTable1",1,2,type);
settablenum("GlobalTable1",1,1,1);
[/code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2016-4-19 17:13:25
[i=s] 本帖最后由 zorsite 于 2016-4-20 16:18 编辑 [/i]

谢谢陈老师捧场~~:handshake
我的代码写在模型的停止运行中。谢谢[url=http://flexsim.asia/space.php?uid=29661]FFFrenk[/url]的提醒,临时实体的类型并不总是整数,所以以下代码在使用上有局限性。[code]treenode queue=node("Queue3", model());

settablesize("统计结果",0,0);//清空全局表
//先把数据写入数组
int cont=content(queue);//获取暂存区中临时实体总数
intarray array=makearray(cont);//创建一个数组
for (int i=1;i<=cont;i++)
{
        int type=getitemtype(rank(queue,i));
        array[type]+=1;//计算每种临时实体的数量
}
//再把数据写入全局表
int row=1;
for (int i=1;i<=cont;i++)
{        if (array)//如果某种临时实体的数量不为零
        {
                settablesize("统计结果",gettablerows("统计结果")+1,2);//新增一行
                settablenum("统计结果",row,1,i);//记录其类型
                settablenum("统计结果",row,2,array);        //记录其数量
                row+=1;
        }        
}
settableheader("统计结果",2,1,"类型");
settableheader("统计结果",2,2,"数量");[/code]
2016-4-19 20:25:06
[quote]谢谢陈老师捧场~~:handshake
我的代码写在模型的停止运行中。treenode queue=node("Queue3", model());

settablesize("统计结果",0,0);//清空全局表
//可以没有直接增加全局表的命令……
//先把数据写入数组
...
[size=2][color=#999999]zorsite 发表于 2016-4-19 17:13[/color] [url=http://www.flexsim.asia/redirect.php?goto=findpost&pid=20192&ptid=6243]http://www.flexsim.asia/images/common/back.gif[/url][/size][/quote]

看了一下加老师代码,有个小问题....
itemtype有可能是多精度型(包括小数、负数)的,并不都是正整数....
2016-4-19 21:42:53
思路是:将 type 转换成 str 作为某个东西的引用,这样就省去了一轮的 Loop ;
具体来说,是用 bundle 中 getbundlefieldnr 可以传递引用参数来实现。
恰好,7.7版本开始, FlexSim 可以使用 bundle 存储表格数据,不仅带来了更加轻便的数据处理,也带来了很多新的特性。(赶快升级呀!)

以下是实例:
创建一个名为"GlobalTable1"的全局表,并改成 Use Bundle。

之后就是在需要统计的时间点或者事件处,运行如下代码:[code]
treenode queue=node("Queue3", model());

treenode targetTable=reftable("GlobalTable1");
settablesize(targetTable,1,1);
forobjecttreeunder(queue)
{
        string typeStr=numtostring(getitemtype(a),0,5);
        int col=getbundlefieldnr(targetTable, typeStr)+1;
        if (col)
        {
                settablenum(targetTable,1,col,gettablenum(targetTable,1,col)+1);
        }
        else
        {
                addtablecol(targetTable);
                int nrCols=gettablecols(targetTable);
                settableheader(targetTable,2,nrCols,typeStr);
                settablenum(targetTable,1,nrCols,1);
        }
}
[/code]ps:有个小缺陷,全局表第一行第一列的内容无法加入统计。
2016-4-20 16:10:52
flexsim的数组功能很弱,我一直想要找一种更为灵活的工具来实现这一目的。
[url=http://flexsim.asia/space.php?uid=29661]FFFrenk[/url]给了我新的思路,用bundle data。
相比数组,bundle更灵活,但是不能放在内存中(我不知道如何放入),只能保存在全局表中。
一下是我的代码:
[code]treenode queue=node("Queue3", model());
treenode bundle=reftable("bundle");
//创建两张全局表:bundle和统计结果。bundle全局表要勾选上Use Bundle。
clearbundle(bundle);//清除所有数据
addbundlefield(bundle,"type",1);
addbundlefield(bundle,"qnt",1);//新增字段
forobjecttreeunder(queue)
addbundleentry(bundle,getitemtype(a),1);//把每一个临时实体的类型写入bundle表
query("select type, sum(qnt) as quantity from $1 group by type order by type",bundle);//按类型分组统计数量
//如果全局表勾选了Use Bundle,只能使用$来传递表名,不能使用 query("select * form bundle");
//使用as语句指定别名时,别名不能和原来的名字相同:不能使用 sum(quantity) as quantity
dumpquery(reftable("统计结果"));//输出到统计结果表[/code]
2016-4-25 20:03:09
[b] [url=http://www.flexsim.asia/redirect.php?goto=findpost&pid=20186&ptid=6243]2#[/url] [i]慧娴亚伦[/i] [/b]
2016-4-25 20:03:43
[b] [url=http://www.flexsim.asia/redirect.php?goto=findpost&pid=20186&ptid=6243]2#[/url] [i]慧娴亚伦[/i] [/b]
非常感谢。
2016-5-29 17:41:11
:lol 看到加老师使用了 SQL这种「作弊」的手段,我也小试牛刀,代码如下:[code]
treenode Queue=node("Queue3", model());//the queue
query("select $2 as Type , count(*) as TypeNum from $1 group by Type",
        /*$1*/Queue,
        /*$2*/getitemtype($iter(1)));
dumpquery(reftable("ResultTable"), 1);
[/code]
2016-12-1 09:59:56
[b] [url=http://www.flexsimasia.com/redirect.php?goto=findpost&pid=20185&ptid=6243]1#[/url] [i]zorsite[/i] [/b]
都是大神级别的老师啊~我想实现一个实时的物料拉动,暂存区的实体数量一旦达到某个设定值就会触发发生器批量生产输出,如何用代码实现啊,求助求助:dizzy:
您需要登录后才可以回帖 立即登录
高级模式
12下一页
技术交流2
热门问答
查看更多
1
Flexsim初级建模工程师水平标准
Flexsim初级建模工程师水平标准
62
234
2
厂区生产线布局优化案例!新做的!
厂区生产线布局优化案例!新做的!
42
224
3
无意中找到的资料,非常适合于初学者
无意中找到的资料,非常适合于初学者
39
229
4
流水作业线的仿真
流水作业线的仿真
36
83
5
flexsim中文教程,pdf文档已整理-重新整理
flexsim中文教程,pdf文档已整理-重新整理
31
114
博主榜
+ 5