オブジェクト指向の分析と設計を使用したエレベーターのモデリング[終了]


134

オブジェクト指向の設計と分析に関しては、インタビューやクラスで一般的に使用されているように見える一連の質問があります。これはそのうちの1つです。残念ながら、大学の私のOOP教授は実際には答えを出していないので、私は不思議に思っていました。

問題は次のとおりです。エレベーターバンクのシミュレーションに使用するオブジェクト/メソッドの基本セットを設計します。オブジェクトとその属性/メソッドは何ですか?

議論のために、私たちの建物が20階建てであると仮定しましょう。最下階はロビー、2階は駐車場につながっています(したがって、人々は最下階または2階のどちらかの建物に出入りします)。すべてのフロアにサービスを提供するエレベーターバンクが1つあります。エレベーターバンクには3つのエレベーターシャフトがあり、シャフトごとに1つのエレベーターがあります。

これをオブジェクト指向モデルでモデル化する正しい方法は何でしょうか?


9
これは私のお気に入りのインタビューの質問です。質問するのは簡単ですが、正しく理解するのは驚くほど複雑です。キューのようなものを含み、より多くの課題を投げ込むために簡単に拡張できます。たとえば、待機時間を短縮するためにアルゴリズムをどのように最適化しますか。
Rob Di Marco、

ええ、それは本当に素晴らしい自由回答式の質問です。残念ながらその質問はありません:(
Uri

回答:


165

まずエレベーターのクラスがあります。これには、方向(上、下、スタンド、メンテナンス)、現在のフロア、および方向でソートされたフロアリクエストのリストがあります。このエレベーターからの依頼を受けます。

次に銀行があります。それはエレベーターを含み、床からの要求を受け取ります。これらはすべてのアクティブなエレベーターにスケジュールされます(メンテナンス中ではありません)。

スケジュールは次のようになります。

  • 利用可能な場合は、このフロアのスタンディングエレベーターを選択してください。
  • それ以外の場合は、このフロアに移動するエレベーターを選択します。
  • それ以外の場合は、別の階にある立っているエレベーターを選びます。
  • それ以外の場合は、負荷が最も低いエレベーターを選択してください。

各エレベーターには一連の状態があります。

  • メンテナンス:エレベーターは外部信号に反応しません(それ自体の信号にのみ反応します)。
  • スタンド:エレベーターは床に固定されています。電話を受けた場合。そしてエレベーターはその階にあり、ドアは開いています。別の階にある場合は、その方向に移動します。
  • 上へ:エレベーターが上に移動します。フロアに到達するたびに、停止する必要があるかどうかをチェックします。もしそうなら、それは停止し、ドアを開きます。一定時間待機し、ドアが閉じます(何かがドアを通過している場合を除きます)。次に、要求リストからフロアを削除し、別の要求があるかどうかを確認します。そうである場合、エレベーターは再び動き始めます。ない場合は、状態スタンド。
  • 下:上と同じですが、逆方向です。

追加の信号があります:

  • 警報。エレベーターが停止します。そして、それがフロアにある場合、ドアが開き、要求リストがクリアされ、要求は銀行に戻されます。
  • ドアが開いています。エレベーターが床の上にあり、移動していない場合にドアを開きます。
  • ドアが閉まります。開いている場合はドアを閉めました。

編集:一部のエレベーターは下/ first_floor espで開始しません。高層ビルの場合。

min_floorとmax_floorは、エレベーターの2つの追加属性です。


16
エレベーターシミュレーションplay.elevatorsaga.com
Samar Panda

1
このスケジューリングアプローチには一部の最適化が欠落しているようです。たとえば、エレベータがすでにエレベータを要求したフロアに向かっている場合、別のエレベータが来るようにスケジュールする必要はありません。
Liron Yahdav

受信リクエストとスケジューリングは同期ですか、非同期ですか?非同期の場合、どうすればそれを達成できますか?
Rohitashwa Nigam

18

Donald Knuthの 『Art of Computer Programming Vol.1』には、エレベーターとデータ構造のデモがあります。クヌースは非常に徹底的な議論とプログラムを提示します。

クヌース(1997)「情報構造」、コンピュータプログラミングのアート Vol。1 pp.302-308


9
上記のGoogleブックにリンクされています。
2011

2
本のこのセクションでは、エレベータシミュレーションの実行方法を(詳細に)記述します。モデル化する方法(OOPの方法)については説明していません。しかし、ええ..素晴らしい本!
user7 2014

17

私はこの問題の多くの変種を見てきました。(難易度を決定する)主な違いの1つは、ロードバランシング(たとえば、朝より多くのアイドル状態のエレベーターをロビーに送る)を行う「スマートで効率的なシステム」を集中管理する試みがあるかどうかです。その場合、デザインにはサブシステム全体が含まれ、とても楽しいデザインになります。

完全なデザインは明らかにここで提示するには多すぎ、多くの代替案があります。幅も明確ではありません。インタビューでは、彼らはあなたがどう思うかを理解しようとします。ただし、次のものが必要になります。

  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

心配する主なことは、エレベータに上下に移動する必要があることをどのように通知するかです。また、この動作を制御する集中型クラスを用意する予定であり、その制御をどのように分散できるかについても説明します。

非常に単純な場合も、非常に複雑な場合もあります。同時実行またはエレベーターが1か所に到達するまでの時間を使用しない場合、エレベーターの状態を確認するだけでよいので、エレベーターの状態を確認するだけでよいので、簡単に思えます。しかし、ElevatorにRunnableを実装させ、常にキュー(linkedList)をチェックして同期させると、Controllerクラスは、キューに入れるフロアを割り当てます。キューが空の場合、run()メソッドは待機し(queue.wait())、フロアがこのエレベーターに割り当てられると、queue.notify()を呼び出してrun()メソッドを起動し、run() )メソッドはgoToFloor(queue.pop())を呼び出します。これは問題を複雑にしすぎます。紙に書こうとしたがうまくいかない。ここでは、並行性やタイミングの問題を実際に考慮する必要はないようです。

なにか提案を?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.