エレベーターはどうやって動くの?
16725 ワード
最近、私はエレベーターソフトウェアを構築するために何を取るのだろうか?どのように、現在のエレベーターは動きますか?どのように、彼らはすべての異なる床から、そして、異なる方向で彼らの要求を優先させる方法を知っていますか.私はそれらの質問に対する答えを見つけるために掘り始めました、そして、私はそれに関する記事を書くことに決めました.この記事は答えを与えるだけでなく、実際に私の発見も適用します.
HOESはエレベーター作業を行うか?
すべてのエレベーターは現実の配分に基づいて異なった働きをし、そのようなアルゴリズムを構築するのはかなり難しい.すべてのアルゴリズムは互いに異なるかもしれませんが、最も基本的な例を見て、エレベーターはいわゆるC - Scanアルゴリズムを使用しています.このアルゴリズムはi/oスケジューリングとしても知られているディスクスケジューリングに使用される.
エレベーターの視点から、アルゴリズムは次のように動作します. Request Arrayは、エレベーターが から要求されたことを記憶している配列を表しますエレベーターサービスは、フロア0から最高床まで常にあります. 下に移動しながら、エレベーターは、リクエストのいずれかをサービスしていません. エレベーターが最初(フロア0)に達するとき、、方向を逆にしてください. 昇降中の、エレベーターサービスはすべて1つずつ床. 現在、現在サービスされているフロアは、エレベーターの新しい位置になります.エレベーターが最高床に達するまで、ステップ6に進みます. エレベーターが最高の床に到達した場合は、方向を逆にし、すべてのリクエストがサービスされるまでステップ3に進みます. 手順を実行すると、いくつかのパフォーマンスの最適化がここで行われることがわかります.例えば、ポイント3、エレベーターは、それが床0に下がっているどんな優れたリクエストでもサービスするならば、より速くなります. ポイント7 -その床 の要求がないならば、最高の床に行く点がありませんポイント8 -最も高い要求が にサービスされたならば、それは方向を逆にするという意味をより多くします
アルゴリズムのビルド
アルゴリズムのこの実装は、バニラJavaScriptを使用して純粋に機能するでしょう.ブラウザでコードを直接テストすることができます.実装は3,7,8ポイントの性能最適化を適用する.
を開始するエレベータークラスを作成しましょう リクエストを処理し始める
の要求は、エレベータの現在のフロアに基づいて、より高い階のための1つと下階のための他のものの2つの別々のリストに分けられます. 高階は昇順、例えば5、6、7、8 によってソートされる下階は降順でソートされているので、エレベーターが下降すると、最低の高さを最初に最低の床、例えば4 , 3 , 2 , 1に選ぶ. このメソッドは、すべてのフロアリストを1つに統合した配列を返します. は、エレベータが常に地上階のすべてのリクエストを終える必要があるので、最小限のフロアもリクエストリストに追加される. 現在、すべての組織化された要求をサービスする時間.これをするために、アルゴリズムは組織化されたリストを通して繰り返されて、異なる要求に貢献します.
この関数は次のようになります
以下は完全な実装です.
結論
エレベーターがその要求を優先する順序を見つけるのはおもしろかった.エレベーターの最後の目的地は常に地面になると言うのは安全です.
これは、エレベーターがどのように働くことができるか最も基本的な方法です.最適化と現実世界のシナリオがたくさんあります.そこでは、エレベーターのアルゴリズムは、おそらくこのケースとほとんど異なります.
HOESはエレベーター作業を行うか?
すべてのエレベーターは現実の配分に基づいて異なった働きをし、そのようなアルゴリズムを構築するのはかなり難しい.すべてのアルゴリズムは互いに異なるかもしれませんが、最も基本的な例を見て、エレベーターはいわゆるC - Scanアルゴリズムを使用しています.このアルゴリズムはi/oスケジューリングとしても知られているディスクスケジューリングに使用される.
エレベーターの視点から、アルゴリズムは次のように動作します.
アルゴリズムのビルド
アルゴリズムのこの実装は、バニラJavaScriptを使用して純粋に機能するでしょう.ブラウザでコードを直接テストすることができます.実装は3,7,8ポイントの性能最適化を適用する.
を開始する
start
メソッドを割り当てましょう.階のリクエストをエレベーターの現在のフロアに渡します.class Elevator {
/**
* Start service elevator requests
* @param {number[]} requests - Floor Requests
* @param {number} currFloor - Current Floor
*/
start(requests = [], currFloor = 0) {}
}
必要条件2を見て、エレベーターは常に最初に上がります.我々は、我々が最初により高い床に貢献して、それから現在のエレベーター床の下で床に貢献するように要求を組織しなければなりません.class Elevator {
minimumFloor = 0;
/**
* Start service elevator requests
* @param {number[]} requests - Floor Requests
* @param {number} currFloor - Current Floor
*/
start(requests = [], currFloor = 0) {
const organisedRequests = this.organiseRequests(requests, currFloor);
}
/**
* Organise requests - higher floors first and then lower floors
* @param {number[]} arr - Service Requests
* @param {number} currFloor - Current Elevator Floor
*/
organiseRequests(arr, currFloor) {
const { highFloors, lowFloors } = arr.reduce(
(acc, curr) => {
const isHighFloor = curr >= currFloor;
return isHighFloor
? {
...acc,
highFloors: [...acc.highFloors, curr],
}
: {
...acc,
lowFloors: [...acc.lowFloors, curr],
};
},
{ lowFloors: [], highFloors: [] }
);
// Sorting high floors, asc order
highFloors.sort((a, b) => a - b);
// Sorting low floors, desc order
lowFloors.sort((a, b) => b - a);
// The last floor should always be the minimum floor - 0
return [...highFloors, ...lowFloors, this.minimumFloor];
}
}
organiseRequests
で何が起こっているかを強調しましょう.この関数は次のようになります
/**
* Serve all elevator requests
* @param {number[]} arr - Floor Requests
* @param {number} currFloor - Current Floor
*/
serviceRequests(arr, currFloor) {
arr.forEach((currItem) => {
currFloor = currItem;
console.log("Floor: ", currFloor);
});
}
ご覧のように、このメソッドは、組織化されたリストを繰り返すことによってサービスを要求します.言及するもう一つのものは、エレベーターの現在の床が現在サービスされた床に割り当てられるということです.(ポイント6)最後に、コンソールの現在のフロアをログオンします.以下は完全な実装です.
class Elevator {
minimumFloor = 0;
/**
* Start service elevator requests
* @param {number[]} requests - Floor Requests
* @param {number} currFloor - Current Floor
*/
start(requests = [], currFloor = 0) {
const organisedRequests = this.organiseRequests(requests, currFloor);
this.serviceRequests(organisedRequests, currFloor);
}
/**
* Organise requests - higher floors first and then lower floors
* @param {number[]} arr - Service Requests
* @param {number} currFloor - Current Elevator Floor
*/
organiseRequests(arr, currFloor) {
const { highFloors, lowFloors } = arr.reduce(
(acc, curr) => {
const isHighFloor = curr >= currFloor;
return isHighFloor
? {
...acc,
highFloors: [...acc.highFloors, curr],
}
: {
...acc,
lowFloors: [...acc.lowFloors, curr],
};
},
{ lowFloors: [], highFloors: [] }
);
// Sorting high floors, asc order
highFloors.sort((a, b) => a - b);
// Sorting low floors, desc order
lowFloors.sort((a, b) => b - a);
// The last floor should always be the minimum floor - 0
return [...highFloors, ...lowFloors, this.minimumFloor];
}
/**
* Serve all elevator requests
* @param {number[]} arr - Floor Requests
* @param {number} currFloor - Current Floor
*/
serviceRequests(arr, currFloor) {
arr.forEach((currItem) => {
currFloor = currItem;
console.log("Floor: ", currFloor);
});
}
}
エレベーターが実行されると、出力はコンソールに記録されます.function init() {
const requests = [100, 79, 34, 67, 60, 92, 11, 55, 41, 77];
const currFloor = 50;
const elevator = new Elevator();
elevator.start(requests, currFloor);
}
init();
出力:Floor: 55
Floor: 60
Floor: 67
Floor: 77
Floor: 79
Floor: 92
Floor: 100
Floor: 41
Floor: 34
Floor: 11
Floor: 0
結論
エレベーターがその要求を優先する順序を見つけるのはおもしろかった.エレベーターの最後の目的地は常に地面になると言うのは安全です.
これは、エレベーターがどのように働くことができるか最も基本的な方法です.最適化と現実世界のシナリオがたくさんあります.そこでは、エレベーターのアルゴリズムは、おそらくこのケースとほとんど異なります.
Reference
この問題について(エレベーターはどうやって動くの?), 我々は、より多くの情報をここで見つけました https://dev.to/jimjja/how-does-an-elevator-works-1g40テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol