登录发现更多内容
首页
资讯
分类
目录
索引
酷站
发帖
用户名
Email
自动登录
找回密码
密码
登录
立即注册
立即登录
立即注册
其他登录
QQ
微信
门户
Portal
论坛
BBS
问AI
提问
搜索
搜索
热搜:
活动
交友
discuz
本版
文章
帖子
用户
帖子
设置
我的收藏
退出
3
0
0
首页
技术交流2
›
【琢磨琢磨推拉】该用推式还是拉式?
返回列表
【琢磨琢磨推拉】该用推式还是拉式?
[ 复制链接 ]
zorsite
技术交流2
3
3
2016-5-8 16:07:19
[i=s] 本帖最后由 zorsite 于 2016-5-8 16:19 编辑 [/i]
估计这将是一篇冷贴,高手不屑看,新手看了脑袋大。
QQ群里有人在问某案例如果不用拉式策略该怎么办?
这是一个很简单但又很经典的一个案例,布局如下:
[color=#000000][font=等线]这个案例的核心要求是:上面两台处理器只处理临时实体类型1,下面三台处理器只处理临时实体类型2.[/font][/color]
[color=#000000][font=等线][size=3][color=darkred]解决方法1:[/color][/size]
如果使用拉式策略,在处理器中设置拉入条件即可:
[size=3][color=darkred]解决方法2:
[/color][/size]有人坚持要用推式策略:L
在暂存区的发送至端口中编写以下代码:[code]if (getitemtype(item)==1) return duniform(1,2);
else return duniform(3,5);[/code][align=left]简单粗暴,问题解决。[color=red]注意,记得把处理器中的拉式策略取消。[/color][/align]
但是有一个问题,有可能随机产生的端口所连接的处理器正在使用中,而另外有处理器处于空闲状态。如何把临时实体发往处于空闲状态的那个处理器呢?
[size=3][color=darkred]解决方法3:[/color][/size]
删掉上面那两行代码,输入以下代码:[code]int totalop;
int startop;
if (getitemtype(item)==1)
{ startop=1;
totalop=2;
}
else
{
startop=3;
totalop=3;
}
doublearray openports = makearray(totalop);
int nrofportsopen = 0;
for ( int index = startop; index < startop+totalop; index++)
{
if (opavailable(current,index))
{
nrofportsopen++;
openports[ nrofportsopen ] = index;
}
}
double returnvalue;
if (nrofportsopen > 0)
{
int returnindex = duniform(1, nrofportsopen);
returnvalue = openports[returnindex];
} else
returnvalue = duniform(startop,startop+totalop-1);
return returnvalue;[/code]这段代码是由系统自带的“随机可用端口”稍作修改得到的,在这个案例中其实也不完美,比如说,3台暂存区都处于加工状态,这个时候来了新的临时实体,发往哪个端口?代码中设置的是随机端口。可是这3台处理器加工完毕的时间有先有后,能不能发送至最先加工完的那个处理器上?对不起,这段代码做不到。
[color=navy]为了能够直观的观察这段代码的缺陷,可以把发生器的发生时间间隔设置小一些,比如均值设置为6或者3,重置模型后点击步进按钮来观察模型。[/color]
[size=3][color=darkred]解决方法4:
[/color][/size]转换一下思路,如果要解决上面的问题,就必须要知道每一台处理器还剩多少时间能加工完毕,然后找到最先加工完的那一台。这样一来,目标就转换成了找到剩余加工时间最短的那一台处理器。
剩余加工时间=安装时间+加工时间+进入时间-当前时间
删掉以上代码,输入以下代码:[code]int totalop;
int startop;
if (getitemtype(item)==1)
{
startop=1;
totalop=2;
}
else
{
startop=3;
totalop=3;
}
double minitime= 2147483647;
int returnvalue=0;
for (int i = startop; i < totalop+startop ; i++)
{
double protime=getitemvar(rank(outobject(current,i),1),2);
double setuptime=getitemvar(rank(outobject(current,i),1),3);
double entrytime=getentrytime(rank(outobject(current,i),1));
double remainingtime=protime+setuptime+entrytime-time();
if (remainingtime<minitime)
{
minitime=remainingtime;
returnvalue=i;
}
}
return returnvalue;
[/code]终于把问题解决了,缺点是这段代码不具备随机性。[color=red]把这段代码加入到上一次代码的else区域试一下?[/color]此时可以把发生时间的均值改回10,然后步进模型查看效果。
该出手时就出手,该用拉式就用拉式吧,原谅我写代码不加注释吧!
[/font][/color]
点赞
0
收藏
0
────
0
人觉得很赞
────
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
举报
3 回复
Kimver
回复
举报
2016-5-8 22:30:41
我也想过这个问题,学习了,点个赞
回复
评论
举报
慧娴亚伦
回复
举报
2016-5-9 09:22:02
用 FlexSim建模要重点领会flex这个词。
在FlexSim仿真世界中,抵达一个目的地有无数条路,对于实际建模需求而言,只要能够抵达,那么这条“路”就不孬。但是选择一条更好的更快捷的“路”是一个仿真建模师从入门到精通必须要掌握的一个过程,也是真正区分高手的方法。
加老师给出的思考过程,对于深入学习FlexSim是非常重要的,学习仿真过程中提出“能不能用其他方式来完成这个建模要求”只是第一步,更为关键的是能不能通过进一步的思考和测试,通过自己的力量去实现新的解决方式。
但是在这个过程中,千万不要“钻牛角尖”,作为学习是可以尝试各种不同的方法,但是在实际应用中请务必使用最简单最直观的方法。此外,也不要想着一口气就将所有的原理弄透,把一些暂时无法理解的东西记录下来,只要坚持学习使用,就会在逐步深入的过程中“顿悟”原先那些看上去非常不合理的存在。
感谢加老师分享。
回复
评论
举报
ldl89772962
回复
举报
2016-9-30 10:52:40
感谢老师分享
回复
评论
举报
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
立即登录
点评
高级模式
本版积分规则
回帖后跳转到最后一页
返回
技术交流2
提问题
写回答
写文章
草稿箱
登录开启您的创作之旅
快速登录,立即开启您的创作之旅~
登录
热门问答
查看更多
1
Flexsim初级建模工程师水平标准
Flexsim初级建模工程师水平标准
62
234
2
厂区生产线布局优化案例!新做的!
厂区生产线布局优化案例!新做的!
42
224
3
无意中找到的资料,非常适合于初学者
无意中找到的资料,非常适合于初学者
39
229
4
流水作业线的仿真
流水作业线的仿真
36
83
5
flexsim中文教程,pdf文档已整理-重新整理
flexsim中文教程,pdf文档已整理-重新整理
31
114
博主榜
admin
+ 5
首页
分类
目录
索引
我的