エレベータは、移動階の注文への最短経路を見つけるためにどのアルゴリズムを使用していますか?


27

エレベータをシミュレートしようとしています。いつも一度に1つの注文のみを受け取ることで非常に簡単に始め、キューの形でエレベータにメモリを追加して、床が押された順に移動するようにしました。これは明らかに最善のアプローチではありません。

そのため、現時点では、非常にシンプルで「近視眼」のロジックを使用しています。つまり、現在のフロアで自分に最も近いフロアを見つけ、次の目的地として設定し、リストにフロアがなくなるまでループします。

しかし、これは常に機能するわけではありません。たとえば、エレベーターは5階の建物の3階にあり、注文4,5,2を取得しました。最短経路は2から4になります。コードに応じて、コストが5の4-> 5-> 2が選択される可能性は同じです。

最短経路を見つけてエレベーターをより効率的にするにはどうすればよいですか?



6
私のオフィスにあなたを招待し、エレベーターがそこで使用するアルゴリズムを理解したいと思います。絶対にできないからです。
gnasher729

1
@ gnasher729ああ、私はあなたを知らなくてもできます。それは確かに私のオフィスと同じだからです:すでに人でいっぱいのときを除いて、私がいる階に立ち寄らないでください。私は正しいですか?
アンドレスF.

2
そうでもない。4つのエレベーターがあります。ボタンを押すと、非常に長い間何も動きません。移動すると、フロアの直前で停止し、年齢を待ってから、フロアを通過して別のフロアに追い越されてから下降します。地上に降りる途中で、少なくとも3回停止し、誰も入場しません。
gnasher729

2
関連するプログラミングゲーム/チャレンジ:play.elevatorsaga.com
dwikle

回答:


30

「効率」は最も重要な機能ではありません。最も重要なことは、すべての注文が確実に行われ、飢vがないことです。誰かが100を押し、人々が1と2を押し続ける場合、それらのフロアの間を行き続けることは効率的かもしれませんが、ある時点で100が訪問されるのは良いことです。

(私が理解することに興味を持っていたときの個人的な観察から)それらのほとんどがそうだと思う:

  1. 最初に押されたボタンの方向に進み、どの方向に進んでいるかを追跡します
  2. フロアに到達してそのボタンが押されたら、ドアを停止して開き、このフロアのボタンをもう押されていないものとしてマークします。
    • 訪問する必要がある同じ方向のフロアがまだある場合は、その方向に進みます。
    • そうでなくて、訪問する必要があるフロアがまだある場合は、その方向に移動します。
    • そうでない場合は完了です。ボタンをもう一度押すと1から開始されます。

多くのエレベーターには、ボタンの代わりにドアの横に「上に行きたい」と「下に行きたい」というボタンがあります。アルゴリズムは少し変更するだけで済みます。2で、その階で押されたボタンがドアの横にあるボタンの1つだけである場合、その方向に進む場合にのみドアを停止して開きます。エレベーター内でボタンが押されたためにドアが開いていて、間違った方向に進んでいる場合は、ボタンを押したままにしておくことができます。

次に進む方向だけで、パス全体を把握する必要はありません。


これは完全に私の心をスキップしました、私は効率にとても集中し、他のものも重要であることを忘れていました。同じ方向にあったからといって、少なくとも2〜100から1に戻るのは効率的ではありませんが、少なくとも飢starはありません。そして、完全に話題から外れて、おそらくこれがこのロジックで2つのエレベーターを見つけるのが一般的な理由でしょうか?ある特定の時間にエレベータが反対方向に移動しているのを見つけるのがより一般的かどうか疑問に思います。とにかく、私はまだ最短パス全体を見つける方法についての興味が、これは、非常にきれいに感謝私の質問に答えるん
ラエドTabani

7
100階建ての建物に着くと、通常、特定の範囲のフロア(0〜19、20〜39など)のみにサービスを提供するエレベーターと、長距離のみ(例えば0 50、0〜100、50〜100、ただし間に階はありません)。目的地に着くにはエレベーターを変更する必要があります。また、明らかに、互いに通過できないシャフトごとに複数のエレベーターがあるかもしれません。完全にトピック外:IIRC、ユーザーエクスペリエンスサイトにある上下の矢印ボタンの効率についての質問があり、非常に魅力的な読書ができました。
ヨルグWミットタグ

おかげで、私はそれを知りませんでした。1つの部分がシステム全体を破壊しない場合、および機械的摩耗に重要な負荷を分散させる場合、再分割は優れた戦略のようです。これらの特急エレベーターは、Knuthのエレベーターアルゴリズムの論理的な欠点によるものかと思います。
レードタバニ

私は追加したいだけ他の事は、多くの場合、彼らは使用しないで、これは別のエレベータの異なることができたときに戻って、そしておそらくは一日の時間と予想される使用パターンに応じて変化することを「ホーム」床を持っているということです
JK 。

実際に移動する方向に関係なく、上下ボタンを半ランダムに押す傾向があります。私の場合、目的地は1つだけなので、選択したかどうかに関係なく、エレベーターでその場所に移動しますダウン。ダウンボタンを押して、上の階を選択し、エレベーターが移動する前に下の階を選択すると、最初に押した階ではなく、下の階に移動します。間違っている可能性があります。次回エレベータに乗るときに必ずテストします。
Ucenna

13

もう1つの答えは、基本的に「可能な限り同じ方向に進み、途中で必要なすべての停止を行う」という標準的なエレベータアルゴリズムを正しく提供します。

他のエレベータアルゴリズムがあります。たとえば、上に行くほどマンションが高くなるマンションを考えてみましょう。建物の所有者は、「可能な限り同じ方向に進むが、途中で停止する」ようにエレベータアルゴリズムを変更することを選択する場合があります。そうすれば、エレベーターにいる人がロビーにいて、2、5、および10に行く場合、エレベーターは10、5、2の順に進み、支払う家賃の順に人を降ろします。しかし、もちろん10代の人々がアパートを出るとき、ロビーに着くまでにもっと長く待たなければならないことがよくあります。

効率的なソリューションを探している場合は、コストのメトリックを考え出し、さまざまなアルゴリズムを実装して、シミュレーションを実行します。平均コストだけでなく、1つのリクエストの処理にかかる最長時間などのメトリックも測定することを忘れないでください。低い平均値に最適化すると、最悪の場合の最適化が解除されることがありますが、これは悪いことです。


1
それはまれなようです(他の類似)
-FindOutIslamNow

10

エレベーターは、一部のハードドライブコントローラーと同じスケジューリングアルゴリズムを使用することに注意してください。標準のSCANアルゴリズムは、エレベーターアルゴリズムとしても知られています。実際には、LOOKアルゴリズムはSCANよりもわずかに効率的であるため、より一般的だと思います。


確かにそう話すとき、エレベーターのコードを実装する専門的な経験はありますか?特に新しいエレベーターシステム?NYCで9/11を過ぎた後、乗客を降ろすことよりも乗客を降ろすことの方が高い優先順位を持っているかどうかは興味があります。
ジョン・ザブロスキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.