エレベーターはどうやって動くの?


最近、私はエレベーターソフトウェアを構築するために何を取るのだろうか?どのように、現在のエレベーターは動きますか?どのように、彼らはすべての異なる床から、そして、異なる方向で彼らの要求を優先させる方法を知っていますか.私はそれらの質問に対する答えを見つけるために掘り始めました、そして、私はそれに関する記事を書くことに決めました.この記事は答えを与えるだけでなく、実際に私の発見も適用します.

HOESはエレベーター作業を行うか?
すべてのエレベーターは現実の配分に基づいて異なった働きをし、そのようなアルゴリズムを構築するのはかなり難しい.すべてのアルゴリズムは互いに異なるかもしれませんが、最も基本的な例を見て、エレベーターはいわゆるC - Scanアルゴリズムを使用しています.このアルゴリズムはi/oスケジューリングとしても知られているディスクスケジューリングに使用される.

エレベーターの視点から、アルゴリズムは次のように動作します.
  • Request Arrayは、エレベーターが
  • から要求されたことを記憶している配列を表します
  • エレベーターサービスは、フロア0から最高床まで常にあります.
  • 下に移動しながら
  • 、エレベーターは、リクエストのいずれかをサービスしていません.
  • エレベーターが最初(フロア0)に達するとき、
  • 、方向を逆にしてください.
  • 昇降中の
  • 、エレベーターサービスはすべて1つずつ床.
  • 現在、現在サービスされているフロアは、エレベーターの新しい位置になります.エレベーターが最高床に達するまで、
  • ステップ6に進みます.
  • エレベーターが最高の床に到達した場合は、方向を逆にし、すべてのリクエストがサービスされるまでステップ3に進みます.
  • 手順を実行すると、いくつかのパフォーマンスの最適化がここで行われることがわかります.例えば、
  • ポイント3、エレベーターは、それが床0に下がっているどんな優れたリクエストでもサービスするならば、より速くなります.
  • ポイント7 -その床
  • の要求がないならば、最高の床に行く点がありません
  • ポイント8 -最も高い要求が
  • にサービスされたならば、それは方向を逆にするという意味をより多くします

    アルゴリズムのビルド
    アルゴリズムのこの実装は、バニラ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で何が起こっているかを強調しましょう.
  • の要求は、エレベータの現在のフロアに基づいて、より高い階のための1つと下階のための他のものの2つの別々のリストに分けられます.
  • 高階は昇順、例えば5、6、7、8
  • によってソートされる
  • 下階は降順でソートされているので、エレベーターが下降すると、最低の高さを最初に最低の床、例えば4 , 3 , 2 , 1に選ぶ.
  • このメソッドは、すべてのフロアリストを1つに統合した配列を返します.
  • は、エレベータが常に地上階のすべてのリクエストを終える必要があるので、最小限のフロアもリクエストリストに追加される.
  • 現在、すべての組織化された要求をサービスする時間.これをするために、アルゴリズムは組織化されたリストを通して繰り返されて、異なる要求に貢献します.
    この関数は次のようになります
      /**
       * 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
    

    結論
    エレベーターがその要求を優先する順序を見つけるのはおもしろかった.エレベーターの最後の目的地は常に地面になると言うのは安全です.
    これは、エレベーターがどのように働くことができるか最も基本的な方法です.最適化と現実世界のシナリオがたくさんあります.そこでは、エレベーターのアルゴリズムは、おそらくこのケースとほとんど異なります.