查看: 6|回复: 6

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

[复制链接]

主题

0

回帖

544

积分

中级会员

积分
544
发表于 2015-8-17 20:46:00 | 显示全部楼层 |阅读模式
[i=s] 本帖最后由 zorsite 于 2015-8-17 20:49 编辑 [/i]

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


[font=宋体][size=10.5pt]此题是[size=20pt]FlexSim[font=黑体]建模水平认证[/font][/size][font=黑体][size=20pt][b]考评[/b][/size][/font][size=20pt]大纲[/size][font=黑体][size=20pt][b]([font=Times New Roman]2015[/font][font=黑体]版)[/font][/b][/size][/font]
中的第一个建模题。刚好最近也做了一个返工优先处理的模型,见[url=http://flexsim.asia/viewthread.php?tid=5045&page=1&fromuid=610#pid17589]http://flexsim.asia/viewthread.php?tid=5045&page=1&fromuid=610#pid17589[/url]。[/size][/font]
[font=宋体][size=10.5pt]于是照着同样的思路把这一题也做了一下,欢迎大家批评指正。
[/size][/font]
[font=宋体][size=10.5pt]假设发生器产生duniform(1,3)类型的临时实体,需要设置类型为1的临时实体进入暂存区后要排在最前列。假设已经有一个类型1的临时实体,则新进入的排在第二。如果此时再进入类型2的临时实体,则排在第三。[/size][/font]


[font=宋体][size=10.5pt]仍然是通过在暂存区设置标签来实现。[/size][/font]
[font=宋体][size=10.5pt]暂存区的创建触发中添加一下代码:[/size][/font]
[font=宋体][size=10.5pt][code]
int value = getitemtype(item);
switch (value)
{
case 1:  
{
  inc(label(current,"type1"),1);
  setrank(item,getlabelnum(current,"type1"));
  break;
}
case 2:
{
  inc(label(current,"type2"),1);
  setrank(item,getlabelnum(current,"type1")+getlabelnum(current,"type2"));
  break;
}
}
[/code]离开触发中添加一下代码:[code]
int value = getitemtype(item);
switch (value)
{
case 1:  inc(label(current,"type1"),-1);break;
case 2:  inc(label(current,"type2"),-1);break;
}

[/code]具体操作见图。
[/size][/font]
[font=宋体][size=10.5pt][/size][/font]
[font=宋体][size=10.5pt]






[/size][/font]

本帖子中包含更多资源

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

×

主题

0

回帖

4万

积分

版主

积分
45331
发表于 2015-8-18 08:34:28 | 显示全部楼层
感谢分享!加老师的思路是推式的,在暂存区里面根据要求来排布,对建模逻辑的培养非常有帮助!

主题

0

回帖

2945

积分

高级会员

积分
2945
发表于 2015-8-19 20:16:11 | 显示全部楼层
[i=s] 本帖最后由 FFFrenk 于 2015-8-24 11:37 编辑 [/i]

感谢分享~


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

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

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

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

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

for (int index=1;index<=content(current)-1;index++)
{
        if (getitemtype(item)<getitemtype(rank(current,index)))
        {
                setrank(item,index);
                break;
        }
}[/code]可能会比较简单,欢迎指正,互相交流学习~~~

本帖子中包含更多资源

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

×

主题

0

回帖

2398

积分

高级会员

积分
2398
发表于 2015-9-10 14:58:17 | 显示全部楼层
[i=s] 本帖最后由 missman 于 2015-9-12 08:29 编辑 [/i]

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

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

int type = 99999;
treenode inobj=inobject(current,1);
int contents=content(inobj);
for(int index=1;index<=contents;index++)
{
        treenode part=rank(inobj,index);
        int type_part=getitemtype(part);
        if(type_part<=type)    //也可以直接用:type=min(type,type_part);
                type=type_part;
}
return getitemtype(item) == type;[/code]

本帖子中包含更多资源

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

×

主题

0

回帖

163

积分

注册会员

积分
163
发表于 2015-10-5 17:03:20 | 显示全部楼层
{:3_41:}

主题

0

回帖

544

积分

中级会员

积分
544
 楼主| 发表于 2015-10-6 07:03:29 | 显示全部楼层
[i=s] 本帖最后由 zorsite 于 2015-10-6 07:14 编辑 [/i]

[quote]
FFFrenk 发表于 2015-8-19 20:16
可能会比较简单,欢迎指正,互相交流学习~~~[code]for (int index=1;index<=content(current)-1;index++)
    {      
        if (getitemtype(item)<getitemtype(rank(current,index)))
            {
                setrank(item,index);
                break;      
            }
    }[/code][/quote]
FFFrenk的代码让我大开眼界。这段代码不是“可能会比较简单”,在我看来,简直就是简单到不能再简单了,一下子就抓住了本质。




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

missman的拉式策略也让我受益匪浅,看过他的代码再去学习拉入策略中的“pull best item”,有事半功倍之效。
请教missman:for循环找到了最小itemtype之后,是如何拉入第一个最小itemtype临时实体的?当代码运行到return getitemtype(item) == type;语句时,getitemtype(item) 中的item,指向哪一个临时实体?

主题

0

回帖

3389

积分

高级会员

积分
3389
发表于 2015-10-21 15:25:34 | 显示全部楼层
[b] [url=http://www.flexsim.asia/redirect.php?goto=findpost&pid=18200&ptid=5361]6#[/url] [i]zorsite[/i] [/b]


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

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|京ICP备14043114号-2

在本版发帖
关注公众号
QQ客服返回顶部