フロア注文を移動するための最短経路を見つけるためにエレベータが使用するアルゴリズムは何ですか?
On 2月 15, 2021 by admin私はエレベーターをシミュレートしようとしています。いつものように、一度に1つの注文だけを行うことから始めて、エレベーターにメモリを追加しました。床が押された順序で移動するためのキューの形式。これは明らかに最善のアプローチではありません。
したがって、現時点では、非常にシンプルで「近視眼的」な方法を使用しています。つまり、現在のフロアについて、自分に最も近いフロアを見つけて次の目的地として設定し、リストにフロアがなくなるまでループします。
ただし、これは常に機能するとは限りません。たとえば、エレベーターは5階建ての建物の3階にあり、注文4,5,2を受け取りました。最短パスは、2> 4-> 5で4階建てですが、このロジックを使用すると、4-> 5-> 2で5階建てになります。コードにもよりますが、同じように選ばれる可能性があります。
最短経路を見つけてエレベーターをより効率的にするにはどうすればよいですか?
コメント
- ある程度関連: programmers.stackexchange.com/q/96278/149904
- 'あなたを私のオフィスに招待し、エレベーターがそこで使用するアルゴリズムを理解したいと思います。 ' t。
- @ gnasher729ああ、私は'あなたのことを知らなくてもできます、'は確かに私のオフィスと同じなので、'のフロアに立ち寄らないでください。ただし、すでに満員の場合を除きます。人。私は正しいですか?
- そうではありません。 4つのエレベーターがあります。ボタンを押すと、非常に長い間何も動きません。誰かが動くと、それはあなたの床の直前で止まり、あなたの床を通り過ぎてから降りてくる別の人に追い抜かれるまで、何年も待ちます。地面に降りる途中で、誰も入らない状態で少なくとも3回停止します。
- 関連するプログラミングゲーム/チャレンジ: play.elevatorsaga.com
回答
「効率」は最も重要な機能ではありません。最も重要なのは、すべての機能を確認することです。飢餓がないという命令が守られます。誰かが100を押し、人々が1と2を押し続ける場合、それらのフロア間を行き来し続けるのが効率的かもしれませんが、「ある時点で100を訪問するのは良いことです。
私は考えます(私が理解することに興味を持ったときの個人的な観察から)それらのほとんどは次のことを行います:
- 最初に押されたボタンの方向に進み始め、私たちがどちらの方向にいるかを追跡します行く
- フロアに到達してそのボタンが押されたら、ドアを停止して開き、このフロアのボタンをもう押されていないものとしてマークします。
-
- 同じ方向にある、訪問する必要のあるフロアがまだまだあります。その方向に進み続けます。
- そうでなくても、訪問する必要のあるフロアがまだある場合は、移動します。その方向に。
- そうでない場合は、「完了し、ボタンをもう一度押すと1から開始します。
注多くのエレベータには、ボタンが1つではなく、ドアの横に「上がりたい」と「降りたい」というボタンがあります。アルゴリズムを少し変更するだけで済みます。2では、そのフロアで押されたボタンがドアの横にあるボタンの1つだけである場合、その方向に進んでいる場合にのみドアを停止して開きます。エレベータ内でボタンが押されてドアが間違った方向に進んでいるためにドアが開いている場合は、ボタンを押したままにしておく可能性があります。
パス全体を把握する必要はありません。
コメント
- これは完全に私の心をスキップしました。私は効率に集中し、他のことも重要であることを忘れていました。 。 ' 2から> 100と言って、同じ方向であるという理由だけで1に戻すのはまだ効率的ではありません。少なくともそれは飢餓を保証しません。そして、完全にトピックから外れているのは、おそらくこれが、このロジックで2つのエレベーターを見つけることが一般的な理由です'? 'は、いつでも反対方向に向かっているエレベーターを見つけるのが一般的かどうか疑問に思います。とにかく、私は'最短のパス全体を見つける方法にまだ興味がありますが、これは私の質問に非常にきちんと答えます。ありがとう
- 100階建ての建物の場合、通常、特定の範囲の階(0-19、20-39など)のみにサービスを提供するエレベータと、長距離のみを移動するエクスプレスエレベータ(0から50、0から100など)があります。 、50から100ですが、間にフロアはありません)。そのため、目的地に到着するためにエレベーターを変更する必要がある場合があります。また、シャフトごとに複数のエレベータがあり、明らかに互いに通過できない場合があります。まったくトピックから外れています:IIRC、ユーザーエクスペリエンスサイトの上下の矢印ボタンの効率について質問がありました。これは非常に魅力的な読書になりました。
- ありがとう、私はそれを知りませんでした'。ある部分がシステム全体を破壊する場合、' t、また機械的な摩耗に重要な負荷を分散するために、細分化することは良い戦略のように思われます。これらの高速エレベーターは、クヌース'のエレベーターアルゴリズムの論理的な欠点が原因であるのではないかと思います。
- 他のことだけ' d追加すると、多くの場合、使用していないときに戻る' home 'フロアがあります。これはエレベータごとに異なる可能性があり、時間帯や予想される使用パターンによっても変わる可能性があります
- 方向に関係なく、上下ボタンを半ランダムに押す傾向があります' mは実際に旅行しています。私の場合、目的地は1つしかないため、エレベーターでその場所に移動します。下ボタンを押して、上の階を選び、エレベーターが動き出す前に下の階を選ぶと、最初に押した階ではなく、下の階に行くのではないかと思います。間違っている可能性があります。'次にエレベーターに乗ったときに必ずテストします。
回答
もう1つの答えは、標準のエレベータアルゴリズムを正しく示しています。これは、基本的に「できるだけ長く同じ方向に進み、途中で必要なすべての停止を行う」というものです。
他のエレベータアルゴリズムがあります。たとえば、上に行くにつれてアパートが高くなるアパートの建物を考えてみましょう。建物の所有者は、エレベータアルゴリズムを変更して、「できるだけ長く同じ方向に進むが、途中で停止する」ことを選択する場合があります。そうすれば、ロビーにいて2、5、10に行く人がエレベーターにいる場合、エレベーターは10、5、2の順に行き、家賃の高い順に人を降ろします。しかしもちろん、10歳の人がアパートを離れるときは、「ロビーに着くまでにもっと長く待たなければならないことがよくあります。
効率的な解決策を探しているなら次に、コストのメトリックを考え出し、さまざまなアルゴリズムを実装して、シミュレーションを実行します。平均コストだけでなく、1つのリクエストが処理されるのにかかる最長時間などの指標も測定することを忘れないでください。低い平均値に最適化すると、最悪の場合が最適化されなくなることがありますが、これは悪いことです。
コメント
- まれなようです(他のアルゴリズム)
回答
エレベータは一部のハードドライブコントローラと同じスケジューリングアルゴリズムを使用することに注意してください。標準のSCANアルゴリズムは、エレベータアルゴリズムとしても知られています。実際には、 LOOK アルゴリズムは、SCANよりもわずかに効率的であるため、より一般的だと思います。
コメント
- 確かに話すとき、エレベーターのコードを実装した専門的な経験はありますか?特に新しいエレベータシステム?ニューヨークでの9.11以降、乗客を降ろすよりも降ろす方が優先されているかどうか知りたいです。
- 乗客を降ろすのではなく、降ろしてください。私は駐車場でエレベーターをよく使用します。駐車場では、1階から6階の3階が地上にあるため、脱出するには3階が最適です。
回答
この回答は、より高度な宛先制御システムに関するものです。複数のエレベーターがあり、行きたい階を指定し、システムがエレベーターを割り当てる建物の場合。
アイデアは非常に単純で、理論的には、すべてのエレベーターがどこに行くのかがわかります。したがって、エレベータごとに、到着予定時刻がいつで、他のエレベータがどれだけ遅くなるかを計算できます。最速のエレベーターを貪欲に選んでください。
グループがボタンを1回だけ押す、人がボタンを複数回押すなど、これには制限があります。
コメントを残す