全球FlexSim系统仿真中文论坛

标题: 【TFT 2014.11.03 FlexSim仿真模型题(23)】 [打印本页]

作者: 慧娴亚伦    时间: 2014-11-3 10:39
标题: 【TFT 2014.11.03 FlexSim仿真模型题(23)】
问题描述:本题来源于FlexSim官方交流群中一位工程师在实际建模中遇到的问题。在实际物流拣货操作过程中,一种常见的策略是一个订单固定由一个操作员来进行拣货处理,这就需要合理分配每一次拣货(搬运)操作员选择。

模型要求:
1、附件中有本题7.1版本的原始布局,使用其他版本请也按照附件中的模型进行布局,以方便审核和对比;
2、原题模型中安排三个合成器完成不同的订单,同时也安排三名操作员进行订单的拣选,要求一个订单到达需要开始拣选任务的时,选择一名操作员进行拣选作业,此后该订单就由该操作员完成该订单剩余的拣选任务;
3、三名操作员并不限定为要一直完成同一个合成器订单任务。


提示:1 TFT第二十一次的活动的某些代码思路有助于完成本次试题;
         2 可以添加您认为需要的任何辅助实体来完成模型要求。
作者: xinglei    时间: 2014-11-3 11:27
存在一个问题,三人无法全动,希望楼主指正
作者: ldd001    时间: 2014-11-3 15:50
做了个比较麻烦的
作者: FFFrenk    时间: 2014-11-3 17:14
请版主大大审阅
作者: 草原一棵树    时间: 2014-11-3 17:32
实践一下,请版主赐教
作者: 慧娴亚伦    时间: 2014-11-4 09:07
回复2楼:
    三个人无法全动的原因是,任务分配器指定分配给1端口的操作员来执行任务,因此只有1号操作员会进行搬运作业,您的模型基本没有完成题目要求,由于您是首次参与活动也是第一个回复,特奖励您积分1个。
作者: 慧娴亚伦    时间: 2014-11-4 09:31
回复3楼
      完成了模型的要求。使用gettaskinvolved()命令获取了当前任务要达到的目的地,将其存在标签里面,在不同的任务时进行对比,以选取对应的操作员进行工作。此外本题仅仅需要操作员进行拣选工作,不需要绑定进行打包工作,但是3楼模型的代码也很好的满足了打包工作的要求,思路清晰,代码的编写也比前几次好了很多,另外建议编写自定义代码的时候尽量将默认代码部分,特别是注释部分的内容删除完整,否则注释可能出现误导。

恭喜您!论坛ID为 ldd001 的朋友在第三层的回复是第一个有效回复,获得积分5分。
24小时后本题结束(即2014年11月05日09时28分),其后的回复不计为有效回复。
作者: ldd001    时间: 2014-11-4 09:51
[b] [url=http://www.flexsim.asia/redirect.php?goto=findpost&pid=14664&ptid=4831]7#[/url] [i]慧娴亚伦[/i] [/b]


完成打包工作部分纯属意外,以前多次因为审题不细造成仅完成部分内容,这次就想多了~:loveliness: 觉得肯定是要也完成打包工作!
作者: 慧娴亚伦    时间: 2014-11-4 09:54
回复4楼
       完成了模型要求。思路上跟第二十一次试题的三楼回复是一样的,通过获取和判定卸载任务的位置来进行任务指派。

恭喜您!论坛ID为 FFFrenk 的朋友在第四层的回复是第二个有效回复,获得积分4分。
作者: east0593    时间: 2014-11-4 10:02
参照3楼的思路,对于打包部分似乎也可以通过任务分配器完成!
作者: 慧娴亚伦    时间: 2014-11-4 10:17
回复5楼
      完成了模型要求。思路上跟2楼相近,在初次任务时,选择使用非优先级则选择距离最近的操作员,主要代码在任务分配器,结合了任务分配器的默认代码进行改造,使得模型相对来说更加完善。

恭喜您!论坛ID为 草原一棵树 的朋友在第五层的回复是第二个有效回复,获得积分1分,由于是首次参与活动,并且代码上有一定创新再额外奖励积分1分,以示鼓励。
作者: 慧娴亚伦    时间: 2014-11-4 13:00
回复10楼
       完成了模型要求。模型与三楼高度雷同,修改了让同一分配器来分配打包的任务,会导致同一个订单拣选和打包的操作员是不同的。

恭喜您!论坛ID为 east0593 的朋友在第十层的回复是第四个有效回复,获得积分1分。
作者: xinglei    时间: 2014-11-4 14:46
[b] [url=http://www.flexsim.asia/redirect.php?goto=findpost&pid=14663&ptid=4831]6#[/url] [i]慧娴亚伦[/i] [/b]

谢了
作者: 慧娴亚伦    时间: 2014-11-5 09:31
本次TFT活动已经截止。
      本次活动是TFT的第二十三次正式活动。本次试题与第二十一次活动的原理实际上是一样的。我们可以借助任务分配器的分配功能,实现更符合现实的搬运或者其他相关任务。思路的核心在于获取关键任务的involved参数,从中得到相关实体的引用,再判断新分配的任务是否符合某个条件而进行分配。

本次题目一共有5位朋友得到了有效回复。他们的论坛ID分别是:
      xinglei、ldd001、FFFrenk 、 草原一棵树、east0593
      他们将获得指定积分,没有获得积分的朋友期待您的下次参与.

      由于有第二十一次模型的代码提示,一直都在关注TFT活动的朋友应该不难完成本次试题要求。4楼的模型代码比较简洁,而3楼的模型还考虑到了打包工作也必须绑定原先拣货的操作员,5楼的模型特别选择了如果是一个新的装卸任务时,选择操作员是根据完成任务的距离最小来选择的。以上几位朋友模型都推荐大家参考,在此不再额外提供参考模型。

      希望有更多的朋友,特别是下载了试题原题的朋友都能花一些时间上传模型参与活动,最后再次感谢大家对活动的支持!
作者: 657776724    时间: 2015-6-30 10:04
之前做模型的时候没有看到楼主在合成器里面写了数量,所以就自己做了一个全局表作为订单,并在进入触发的时候选择更新组件列表。
模型基本与前面的思路一致,在卸载触发的时候,对比托盘上的数量与全局表的数量,在差一个的时候解除操作员的绑定,使他能够进行其他合成器的拣选任务[attach]2670[/attach]
作者: 慧娴亚伦    时间: 2015-6-30 13:37
[i=s] 本帖最后由 慧娴亚伦 于 2015-6-30 14:02 编辑 [/i]

回复15楼:
      完成了模型要求,一个建议,如果使用自定义代码尽量将原先的代码注释(比如您模型中分配器的passto)不要继续沿用原来的默认内容。
作者: yuzhu    时间: 2015-12-9 11:05
成长中
作者: yuzhu    时间: 2015-12-9 11:07
学习中
作者: Kimver    时间: 2016-4-16 12:05
灵活性不够,一名操作员固定完成一台合成器的工作
作者: 慧娴亚伦    时间: 2016-4-17 15:42
回复19楼:
      完成了题目的要求,通过判断任务的类型来决定。
      个人建议您还是需要改变一下嵌套判断这样的思路,以及代码编写的方式,代码的易读性上有很大的缺陷。
作者: Kimver    时间: 2016-4-19 11:38
回复20楼:
      多谢指正,嵌套判断确实挺绕的,我把代码修改了一下,分配器中的passto中的代码改成以下代码,请指教。[code]int desNum = tonum(gettaskinvolved(tasksequence,4,1));

for (int i = 1; i <= 3; i++)
{
       
        if (getlabelnum(outobject(current,i),1)==desNum)
        {
        return i;
        break;
        }
        if (getlabelnum(outobject(current,i),1)==0)
        {
        return i;
        break;
        }

}[/code]
作者: 豆滴滴    时间: 2016-12-13 17:43
也同样适用于Dock卸货叉车分配~
作者: 我很强壮    时间: 2016-12-21 08:32
学习一下
作者: 我很强壮    时间: 2016-12-27 08:20
学习一下
作者: 慧娴亚伦    时间: 2016-12-29 20:10
[b] [url=http://www.flexsimasia.com/redirect.php?goto=findpost&pid=21646&ptid=4831]24#[/url] [i]我很强壮[/i] [/b]


你已经学习两下了。
作者: lyk64737111    时间: 2017-3-8 12:22
xuexi
作者: lyk64737111    时间: 2017-3-8 12:22
学习了学习了
作者: zorsite    时间: 2017-5-23 01:38
这个问题的关键在于两点:
1.操作员作业批次的确认
2.同一批次内将任务发送给同一操作员
解决方法:

1.在操作员上设置搬运数量标签,记录搬运数量,从而判断当前批次是否搬运完毕。
2.在任务分配器的passto触发中,根据操作员上的作业站点标签判断应将任务发送给哪一操作员。
关键代码如下:

1.操作员OnReceiveTaskSequence触发:
[code]/**在标签记录任务信息*/
treenode current = ownerobject(c);
treenode ts = parnode(1);

treenode combiner=gettaskinvolved(ts,4,1);//任务涉及到的合成器
int batch=inc(label(current,"batch"),1);//当前item是合成器需要的第几个
int sum= getnodenum(getvarnode(combiner,"targetcomponentsum"));//全成器一共需要几个
if (batch==sum)
{//如果合成器需要的item全部满足,重置标签
        setlabel(current,"lasttsinvolved1",0);
        setlabel(current,"batch",0);
}        
//否则在操作员上记录任务涉及到的合成器,以便任务分配器查找
else setlabel(current,"lasttsinvolved1",tonum(combiner));[/code]
2.任务分配器的passto触发:
[code]
treenode combiner=gettaskinvolved(tasksequence,4,1);//任务涉及到的合成器
int numofoperator=nrop(current);
for (int i = 1; i <= numofoperator; i++)
{//遍历每一个操作员
        treenode  taskinvoled=tonode(getlabel(outobject(current,i),1));
        if (combiner==taskinvoled)         return i;//如果操作员上的标签与合成器匹配,则返回该操作员
}
return 0;//如果都不匹配,则返回第一可用操作员。

[/code][attach]3738[/attach]
作者: 方卿    时间: 2017-5-26 02:01
很不错的案例
作者: gaoshanliushui    时间: 2017-10-23 23:32
:)




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3