2011-05-29 75 views
1

我正在使用电梯仿真的设计。我有一个电梯控制器和一系列升降机。升降机在特定状态(例如STATIONARY,MOVING,DOORS_OPEN等)中移动。 - 在MOVING状态下,升降机过程将简单地休眠X毫秒。我目前主要关注电梯控制器过程和电梯过程集合之间的交互。另一个电梯(电梯)仿真建模问题

本质上,电梯控制器需要协调电梯,因此需要发出电梯请求并确定哪个电梯最适合服务该请求,然后通知该电梯。

我最初的想法是让每个电梯在楼层请求收据上移动通过各种状态,然后在电梯控制器完成移动到特定楼层后通知电梯控制器。然而,通过这样的设计,电梯控制器可以查询电梯以查看其附近的哪个楼层,对该电梯做出决定(即,停在下一层楼),但是当它告诉电梯停止时,电梯可能有移动过去的那一层(由于说网络点而延迟)。

为了避免这些类型的问题(电梯控制器根据过时信息做出决定),我想让电梯控制器负责将每个电梯的状态移动。通过这个模型,电梯控制器知道电梯处于什么状态,告诉它进行转换,然后知道后面会处于什么状态。因此,电梯控制器始终具有电梯正在执行的最新信息,其动作永远不会与各个电梯状态不同步。

人们对这种类型的方法有任何的担忧(线程,可伸缩性)吗?有没有更好的建模方法?思想欢迎!

+0

为什么你想首先使用多线程?听起来像是不必要的复杂性,除非你真的需要表现。 – CodesInChaos 2011-05-29 21:20:19

+0

多线程,因为这是它在实践中的工作方式 – 2011-05-30 06:36:32

回答

1

基于您决定构建更复杂的电梯控制器的关键词是某些电梯可能已移过控制器预期的状态。我认为这些“事件”的频率很低,对系统有效性的负面影响也是如此。我会保持简单,并乐观地采取行动。预计电梯会有很好的响应,但是(如果真的有必要)偶尔会处理电梯没有按照应该做的事情处理情况,和/或选择另一个电梯。

1

即使将所有控制权移至提升控制器,同步问题仍会在别处出现。例如,如果控制器在电梯运输过程中发送信息,则控制器无法100%准确地知道收到信息时电梯将处于什么楼层。

我认为你最好的做法是坚持面向对象的设计最佳实践,并专注于关注的逻辑分离。即。让升降机担心与升降机相关的问题,并让控制器担心安排。

升降机的命令可以发出,使升降机确认他们是否可以执行请求的动作。在这种情况下,您需要设计调度算法,以便控制器不会知道请求是否会在请求发生后的几分钟之内执行 - 如果控制器正在执行路由/调度,这应该没问题。

当然,这一切都取决于您需要模拟的真实性。

+0

关于第一点,我想让电梯通知每层楼的电梯控制器已到达,然后才继续,直到电梯控制器确认为止。诚然,这是额外的复杂性(增加了一点抖动),但电梯控制器使用静态信息做出决定..我喜欢你关于良好OO设计的观点 - 这非常有道理 – 2011-05-30 06:41:08

+0

@DaveSturgeon谢谢。关于有电梯等待控制器确认每个楼层。这是因为你想要控制器总是“正确”?我同意让控制器自行纠正会更加复杂,但是这也会导致有趣的解决方案......如果控制器可能是错误的,那么决策就会变成概率性的,并且控制器可能会处理新的信息(即有人称之为电梯)更优雅。你可能想看看[在线算法](http://en.wikipedia.org/wiki/Online_algorithms)。 – Colin 2011-05-30 17:15:48

+0

是的,有了最新的信息,电梯控制器应该能够做出最好的决定。所以本质上,电梯控制器主要是一个根据请求和当前电梯状态作出决定的循环。在每次迭代中,它将其中一个电梯推进到一个新的状态,这将使整个系统更接近当前请求队列的要求。你提到的在线算法看起来很有趣 - 感谢这个指针 – 2011-05-30 19:20:40