首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟生产线

模拟生产线
EN

Software Engineering用户
提问于 2015-03-21 16:11:28
回答 2查看 617关注 0票数 1

我试着用Java模拟DVD生产线。我有一个问题,就是计算这种模拟的时间和每小时的DVD数量。

该生产线由4台机器组成,每台机器花一定的时间制作一张DVD。第三个可以同时工作超过一个DVD (最大)。100)。另外,第三部将永远接受更多的DVD来制作,只要它的容量是< 50%,我计划将其标签为m3Capacity。但现在,让我们忽略容量特性。

到目前为止,我使用的是一个随机数生成器(因为每台机器在每台机器开始处理新DVD时都有随机的DVD处理时间),我为四台机器中的每一台分配了一个随机处理时间,总结了它们在一次生产(totalProdTime = processTime1 + processTime2 + processTime3 + processTime4)中所花费的总时间,然后我继续总结这些totalProdTime值,直到整个模拟的总时间达到用户(totalProdTimeSim = totalProdTimeSim + mTotal.totalProdTime)指定的所期望的模拟时间为止。稍后,我只是验证totalProdTimeSim是否达到了所需的时间,仅此而已。

现在,问题是,这样的话,DVD的制作就会一直等到第四台机器的末端,然后再从第二张DVD开始。我想做的是,在第一台机器完成它的工作之后,第二台机器开始工作,第一台机器用它新生成的时间开始制作另一张DVD。其他机器也是如此。当机器2完成DVD的工作后,它立即开始制作另一张DVD。

现在,由于所有机器每次开始制作另一张DVD时都有随机的处理时间,所以经常会发生这样的情况:一台机器“想要制作另一张DVD”,而前一台机器还没有完成它在当前DVD上的工作。在这种情况下,空闲机器只是“等待”前一台机器完成处理,然后接受来自前一台机器的DVD。

因此,在我的示例中,所有机器都一个一个地工作,但我希望它们都能持续工作,即使它们完成了当前DVD的工作(除了第一次迭代中,更多的机器需要等待前面的机器转发他们以前工作过的DVD )。

你认为我应该如何计算总模拟时间和DVD输出?昨晚我一直在想这件事,但没有任何想法。

我应该如何工作的草图可以在下面的图片中找到。在草图中,所有机器都表现得好像经常有一些东西要处理,但是应该等待来自前一台机器的输入。

提前感谢!

EN

回答 2

Software Engineering用户

发布于 2015-03-21 18:52:27

一个奇怪的问题,我不确定它是否适合这里.这是一种蛮力的方法。

如果我要编写代码来解决这个问题,我将创建一个ProductionLine类,其中包含一个机器对象列表以及一个DiskOuput计数器。ProductionLine类将有一个方法('timePasses'),您可以调用它来模拟时间的流逝,比如1秒的增量。这将反过来调用具有timePasses方法的机器对象。机器知道需要多少次timePasses调用才能完成磁盘的旋转(随机的秒数)。当机器完成写入磁盘时,timePasses对象将返回一个值以指示磁盘已完成。然后,机器会重置写入磁盘所需的随机秒数,然后重新启动。ProductionLine类知道,当timePasses返回一个值时,由于磁盘已经完成,DiskOuput计数器应该增加。

现在有了一个所有机器同时启动的应用程序。您可以使用循环运行这个过程,直到一定时间过去,或者直到DiskOuput达到某个值为止。

现在,为了让你的机器依赖于第一个磁盘.您的ProductionLine将有一个机器列表(行中可用计算机的“池”)和一个RunningMachines列表(目前正在产生某种东西)。您只会在正在运行的机器上调用timePasses。当您第一次调用timePasses on ProductionLine时,它将从池中取出一台机器,进入RunningMachines并调用timePasses。每次调用机器上的timePasses表明新磁盘准备就绪时,ProductionLine可以检查是否有其他机器可用,如果可用,就将它们放到RunningMachines列表中,然后开始使用它。

票数 1
EN

Software Engineering用户

发布于 2015-04-21 07:36:00

你要找的东西叫做离散事件仿真。有一些多个图书馆你可以用来帮助你。

你的情况几乎是这种模拟的典型例子。每一行都是一个“代理”,当它接收到DVD时,它会选择一个随机的时间来处理,并要求系统“通知它”(创建一个事件)。当系统通知行时,它将当前DVD标记为已处理,将其传递到下一行并选择下一行。这些行(或代理)中的每一行(或代理)都是独立的,行为几乎像一个单独的“线程”。然后,系统负责通过在队列中选择下一个事件并执行它来“改进时间”。然后,您可以使用不同的参数或不同的随机时间多次重复此模拟,以获得有关系统的一些随机度量。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/276964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档