使用面向对象的分析和设计对电梯建模[关闭]


134

在面向对象的设计和分析方面,似乎有一些问题在访谈和课堂上很常用。这就是其中之一;不幸的是,我在大学的OOP教授实际上并没有给出答案,所以我一直在想。

问题如下:设计一组基本的对象/方法,用于模拟电梯组。对象及其属性/方法是什么?

为了争辩,让我们假设我们的建筑物有20层。底层是大厅,而第二层是与停车场相连的(因此,人们将进入或离开位于底层或第二层的建筑物)。有一个供所有楼层使用的电梯排;电梯列中有三个电梯井,每个井轴有一个电梯。

在面向对象的模型中对此建模的正确方法是什么?


9
这是我最喜欢的面试问题。提出这个问题很简单,但是要想正确则出奇的复杂。它涉及队列之类的东西,可以轻松扩展以引发更多挑战。例如,如何优化算法以减少等待时间。
罗布·迪·马可

是的,这是一个非常好的开放式问题。从来没有被问到一个不幸的是:(
Uri

Answers:


165

首先是电梯课程。它有一个方向(上,下,站,维护),当前楼层和按该方向排序的楼层请求列表。它从该电梯接收请求。

然后有一家银行。它包含电梯,并接收来自楼层的请求。这些被安排到所有活动的电梯中(不在维护中)。

调度将类似于:

  • 如果可以的话,请为该楼层选择一个站立式电梯。
  • 否则,请选择一部电梯移至该楼层。
  • 否则,请选择另一层的站立式电梯。
  • 否则请选择负载最低的电梯。

每个电梯都有一组状态。

  • 维护:电梯对外部信号无反应(仅对自身信号有反应)。
  • 支架:电梯固定在地板上。如果收到电话。电梯在那层楼上,门打开了。如果在另一层,则朝该方向移动。
  • 上:电梯上移。每次到达地板时,它都会检查是否需要停止。如果是这样,它将停止并打开门。它等待一段时间,然后关上门(除非有东西穿过它们。然后,从请求列表中删除地板,检查是否有其他请求。如果是,则电梯再次开始移动。如果没有,则进入国家立场。
  • 向下:喜欢向上但方向相反。

还有其他信号:

  • 报警。电梯停止。如果它在地板上,则门打开,清除请求列表,将请求移回银行。
  • 门打开了。如果电梯在地板上并且不动,则打开门。
  • 关门。如果它们是打开的,则关上门。

编辑:一些电梯不开始在bottom / first_floor esp。如果是摩天大楼。

min_floor和max_floor是Elevator的两个附加属性。



1
似乎这种调度方法缺少一些优化,例如,如果电梯已经到达有人要电梯的楼层,则无需调度另一部电梯。
Liron Yahdav

接收请求和调度是同步的还是异步的?如果异步,那么我们将如何实现呢?
Rohitashwa Nigam

18

唐纳德·克努斯(Donald Knuth)的《计算机编程艺术》第1卷演示了电梯和数据结构。Knuth提出了非常详尽的讨论和计划。

Knuth(1997),“信息结构”,《计算机编程艺术》第一卷。1第302-308页


9
链接到上面的Google图书。
vine'th 2011年

2
本书的这一部分详细介绍了如何运行电梯模拟。它没有描述如何建模(以OOP方式)。但是,是的。
user7 2014年

17

我已经看到了这个问题的许多变体。主要区别之一(确定难度)是是否存在集中尝试,以建立具有负载均衡功能的“智能高效系统”(例如,早上将更多的闲置电梯送到大堂)。如果是这种情况,那么设计将包括一个具有真正有趣设计的整个子系统。

完整的设计显然太多了,这里有很多替代品。广度也不清楚。在采访中,他们将尝试弄清楚您的想法。但是,这些是您需要做的一些事情:

  1. 中央控制器的表示形式(假设有一个)。

  2. 电梯代表

  3. 电梯接口单元的表示(每个电梯的接口单元可能不同)。显然,也请呼叫每层上的按钮,等等。

  4. 每个楼层上的箭头或指示器的表示(几乎是电梯模型的“视图”)。

  5. 人和货物的表示形式(对于考虑最大负载可能很重要)

  6. 建筑物的外观(在某些情况下,某些楼层有时可能会被遮挡,等等)


7

看到:

Lu Luo, A UML Documentation for a Elevator System
Distributed Embedded Systems, Fall 2000
Ph.D. Project Report
Carneghie Mellon University

链接



2

设计电梯系统时应考虑的事项

Elevator
Floor/Location Identifier
Number of steps
Rotation speed
Daterange
InstallationDate
MaintainenceDate
Department Identifier
AllowedWeight
Detail / Description
Poison Ratio (Statistics)
Start
Stop
SetDirection
SetRotationSpeed
EmergencyStop = Stop + Alert
EmergencyAccidentSenser Handler

每次按下按钮都会导致必须提供电梯请求。这些请求中的每一个都在全球范围内跟踪

建筑物中的电梯数量将由用户确定。该建筑物将包含固定数量的楼层。可以容纳电梯的乘客人数将是固定的。乘客离开目的地楼层的电梯时将被计算在内。目标楼层将使用“随机”泊松间隔来确定。当电梯中的所有乘客都到达其目的地楼层时,电梯将返回大厅以接载更多乘客


2

主要要担心的是如何通知电梯需要上下移动。以及是否要使用集中式类来控制此行为以及如何分配控件。

看起来可能非常简单或非常复杂。如果我们不花时间并发,也不花时间去电梯到达某个地方,那么这似乎很简单,因为我们只需要检查电梯的状态即可,例如它是上下移动还是静止不动。但是,如果我们使Elevator实现Runnable,并不断检查和同步队列(linkedList)。Controller类将分配要进入队列的楼层。当队列为空时,run()方法将等待(queue.wait()),将楼层分配给此电梯后,它将调用queue.notify()来唤醒run()方法,然后运行( )方法将调用goToFloor(queue.pop())。这将使问题过于复杂。我试图将其写在纸上,但认为它没有用。看来我们实际上并不需要考虑并发或时序问题,

有什么建议吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.