私はエレベーターをシミュレートしようとしています。いつものように、一度に1つの注文のみを取得することから始め、その後、エレベーターをキューの形式でメモリに追加して、床が押された順に移動するようにしました。これは明らかに最良のアプローチではありません。
したがって、現時点では、非常にシンプルで「近視眼的」なロジックを使用しています。つまり、現在のフロアで自分に最も近いフロアを見つけ、それを次の目的地として設定し、リストにフロアがなくなるまでループします。
しかし、これは常に機能するとは限りません。たとえば、エレベーターが5階の建物の3階にあり、注文が4,5,2であった場合、最短経路は2-> 4-> 5となり、4階建てになりますが、このロジックを使用します。コードに応じて、5のコストがかかる4-> 5-> 2が選択される可能性は同じです。
最短経路を見つけてエレベーターをより効率的にするにはどうすればよいですか?
「効率」は最も重要な機能ではありません。最も重要なことは、すべての注文が確実に実行され、不足がないことを確認することです。誰かが100を押して、人々が1と2を押し続ける場合、それらのフロアの間を移動し続けるのが効率的かもしれませんが、ある時点で100にアクセスするのはいいことです。
私はthink(私が理解することに興味があったときの個人的な観察から)それらのほとんどが行うこと:
多くのエレベーターには、ドアの横にボタンが1つではなく、「上に行きたい」と「下に行きたい」というボタンがあります。アルゴリズムはわずかな変更のみを必要とします。2で、そのフロアで押された唯一のボタンがドアの隣のボタンの1つである場合、その方向に進んでいる場合にのみドアを停止して開きます。エレベーター内でボタンが押されてドアが開き、間違った方向に進んでいる場合は、ボタンを押したままにする可能性があります。
path全体を把握する必要はありません。次の方向に進むだけです。
もう1つの答えは、基本的に「できるだけ長い間同じ方向に進み、途中で必要なすべての停止を行う」という標準のエレベーターアルゴリズムを正しく提供します。
他のエレベーターアルゴリズムがあります。たとえば、上に行くにつれてアパートが高くなるアパートの建物を考えてみましょう。建物の所有者は、エレベータアルゴリズムを変更して、「できるだけ同じ方向に進むが、途中で停止する」ように選択する場合があります。ロビーにいるエレベーターに2、5、10の人がいる場合、エレベーターは10、5、2の順に進み、支払った家賃の順で人を降ろします。しかしもちろん、10 leaveの人々がアパートにいるときは、ロビーに到着するまでの待ち時間が長くなることがよくあります。
効率的なソリューションを探している場合は、コストの指標を考え出し、さまざまなアルゴリズムの束を実装して、シミュレーションを実行します。平均コストだけでなく、1つのリクエストが処理されるのにかかる最長のメトリックなども測定することを忘れないでください。低い平均値を最適化すると、最悪のケースが最適化解除されることがありますが、これは悪いことです。
エレベーターは一部のハードドライブコントローラーと同じスケジューリングアルゴリズムを使用することに注意してください。標準のSCANアルゴリズムは エレベーターアルゴリズム としても知られています。実際には [〜#〜] look [〜#〜] アルゴリズムの方が一般的だと思います。SCANよりもわずかに効率的だからです。
この回答は、より高度な 宛先制御システム についてです。複数のエレベーターがある建物で、人々は行きたい階を指示し、システムがエレベーターを割り当てます。
アイデアはかなりシンプルです。理論的には、誰もがすべてのエレベーターがどこに行くのかを知っています。そのため、各エレベーターについて、到着予定時刻と他のエレベーターの速度を計算できます。最速のエレベーターを貪欲に選んでください。
これには、ボタンを1回だけ押すグループや、ボタンを複数回押す人々などの制限があります。