全球FlexSim系统仿真中文论坛

搜索
查看: 4874|回复: 6
打印 上一主题 下一主题

根据类型设置优先处理-FMAT样题第一题

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2015-8-17 20:46:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2015-8-17 20:49 编辑

在模型1中实现这样的逻辑:发生器可以产生多种不同类型的产品(具体类型数量可自行决定),不同的产品加工优先级根据其类型号而各不相同,本题中要求其类型号越小则加工优先级越高,即多个产品等待加工的时候,优先加工产品类型号最小的产品。


此题是FlexSim建模水平认证考评大纲(2015版)
中的第一个建模题。刚好最近也做了一个返工优先处理的模型,见http://flexsim.asia/viewthread.php?tid=5045&page=1&fromuid=610#pid17589

于是照着同样的思路把这一题也做了一下,欢迎大家批评指正。

假设发生器产生duniform(1,3)类型的临时实体,需要设置类型为1的临时实体进入暂存区后要排在最前列。假设已经有一个类型1的临时实体,则新进入的排在第二。如果此时再进入类型2的临时实体,则排在第三。


仍然是通过在暂存区设置标签来实现。
暂存区的创建触发中添加一下代码:

  1. int value = getitemtype(item);
  2. switch (value)
  3. {
  4. case 1:  
  5. {
  6.   inc(label(current,"type1"),1);
  7.   setrank(item,getlabelnum(current,"type1"));
  8.   break;
  9. }
  10. case 2:
  11. {
  12.   inc(label(current,"type2"),1);
  13.   setrank(item,getlabelnum(current,"type1")+getlabelnum(current,"type2"));
  14.   break;
  15. }
  16. }
复制代码
离开触发中添加一下代码:

  1. int value = getitemtype(item);
  2. switch (value)
  3. {
  4. case 1:  inc(label(current,"type1"),-1);break;
  5. case 2:  inc(label(current,"type2"),-1);break;
  6. }

复制代码
具体操作见图。









本帖子中包含更多资源

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

x
2#
慧娴亚伦 发表于 2015-8-18 08:34:28 | 只看该作者
感谢分享!加老师的思路是推式的,在暂存区里面根据要求来排布,对建模逻辑的培养非常有帮助!
3#
FFFrenk 发表于 2015-8-19 20:16:11 | 只看该作者
本帖最后由 FFFrenk 于 2015-8-24 11:37 编辑

感谢分享~


我也试着做了这个模型,本着分享才有进步的思想,也拿出自己的模型与大家分享,欢迎指正。

看到题目,我第一反应是,可以用拉入策略,很快能够完成。在处理器上的拉入策略中选择“pull best item”,就直接有下拉框可以选择拉入上游中itemtype值为最小的临时实体。其实题目比较简单,考验的是建模者对FlexSim自带逻辑的理解。

然后看了楼主的模型,使用了推式,能够实现效果。

不过,个人觉得,此方法有局限性:
1.目前只针对三种类型,如果更多类型的实体,代码会更加复杂,缺乏通用性。
2.实现上述逻辑的方法,其实还能够再简化。

我就贴出我自己的模型(根据类型设置优先处理推式v7.3),只在上游的on entry中写如下代码:
  1. treenode item = parnode(1);
  2. treenode current = ownerobject(c);
  3. int port = parval(2);

  4. for (int index=1;index<=content(current)-1;index++)
  5. {
  6.         if (getitemtype(item)<getitemtype(rank(current,index)))
  7.         {
  8.                 setrank(item,index);
  9.                 break;
  10.         }
  11. }
复制代码
可能会比较简单,欢迎指正,互相交流学习~~~

本帖子中包含更多资源

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

x

评分

参与人数 1威望 +10 收起 理由
慧娴亚伦 + 10 感谢分享!

查看全部评分

4#
missman 发表于 2015-9-10 14:58:17 | 只看该作者
本帖最后由 missman 于 2015-9-12 08:29 编辑

我采用了另一种方式——【拉入方式】实现效果,请参考。

代码位置在处理器的拉入条件中。
  1. treenode current = ownerobject(c);
  2. treenode item = parnode(1);
  3. int port =  parval(2);
  4. /***popup:SpecificType*/
  5. /**Specific Itemtype*/

  6. int type = 99999;
  7. treenode inobj=inobject(current,1);
  8. int contents=content(inobj);
  9. for(int index=1;index<=contents;index++)
  10. {
  11.         treenode part=rank(inobj,index);
  12.         int type_part=getitemtype(part);
  13.         if(type_part<=type)    //也可以直接用:type=min(type,type_part);
  14.                 type=type_part;
  15. }
  16. return getitemtype(item) == type;
复制代码

本帖子中包含更多资源

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

x
5#
jkqwe111 发表于 2015-10-5 17:03:20 | 只看该作者
6#
 楼主| zorsite 发表于 2015-10-6 07:03:29 | 只看该作者
本帖最后由 zorsite 于 2015-10-6 07:14 编辑
FFFrenk 发表于 2015-8-19 20:16
可能会比较简单,欢迎指正,互相交流学习~~~
  1. for (int index=1;index<=content(current)-1;index++)
  2.     {      
  3.         if (getitemtype(item)<getitemtype(rank(current,index)))
  4.             {
  5.                 setrank(item,index);
  6.                 break;      
  7.             }
  8.     }
复制代码

FFFrenk的代码让我大开眼界。这段代码不是“可能会比较简单”,在我看来,简直就是简单到不能再简单了,一下子就抓住了本质。




missman 发表于 2015-9-10 14:58
我采用了另一种方式——【拉入方式】实现效果,请参考。代码位置在处理器的拉入条件中。
  1. int type = 99999;
  2. treenode inobj=inobject(current,1);
  3. int contents=content(inobj);
  4. for(int index=1;index<=contents;index++)
  5. {    treenode part=rank(inobj,index);
  6.     int type_part=getitemtype(part);
  7.     if(type_part<=type)  //也可以直接用:type=min(type,type_part);
  8.      type=type_part;
  9. }
  10. return getitemtype(item) == type;
复制代码



missman的拉式策略也让我受益匪浅,看过他的代码再去学习拉入策略中的“pull best item”,有事半功倍之效。
请教missman:for循环找到了最小itemtype之后,是如何拉入第一个最小itemtype临时实体的?当代码运行到return getitemtype(item) == type;语句时,getitemtype(item) 中的item,指向哪一个临时实体?
7#
657776724 发表于 2015-10-21 15:25:34 | 只看该作者
6# zorsite


说一下我的认识:
拉入策略会对上游的临时实体从第一个临时实体开始评估,如果第一个评估没有通过,就会自动转到第二个。在对每一个临时实体进行评估之前,该段代码就会搜索出上游中最小的临时实体类型,并将与正在评估的这个临时实体进行对比,如果评估通过,则拉入这个临时实体。否则,继续下一个item。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2025-5-7 10:38 , Processed in 0.087970 second(s), 16 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

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