10階建て・かご3台・定員8人のビルに湧く乗客を、update() の中身だけでさばきます。
かごの加減速・扉・乗降はシミュレータが処理するので、あなたは どのかごをどの階へ向かわせるか を指示するだけです。
成績は 平均待ち時間(短いほど良い)で決まります。
呼ばれ方
update(w, out) が 0.1 秒ごと に呼ばれます。
out に命令を積みます。積まなければ現状維持(前回の目的階へ向かい続ける/停止したまま)です。
読める情報:w(sim::World)
w.time | 経過秒(double) |
w.floors | 階数(1..floors。1F が最下階) |
w.elevators[i] | かご i の状態 |
w.hallCalls | 押されている呼び出しだけが入った配列 |
かご(sim::ElevatorView)
id | 0 始まり(画面の E1 = id 0) |
pos | 現在位置。1.0 = 1F、2.5 = 2F と 3F の中間 |
dir | +1 上昇中 / -1 下降中 / 0 停止 |
load / capacity | 乗車人数 / 定員(8) |
doorOpen | 扉が開いている(開閉動作中も true)。この間は移動しない |
target | 現在の目的階。なければ -1 |
carCalls[f] | かご内で f 階のボタンが押されている(その階で降りたい人が乗っている) |
呼び出し(sim::HallCall)
floor | 階 |
up | true = 上ボタン / false = 下ボタン |
waitSec | その方向で最も長く待っている人の待ち秒数 |
count | その方向で待っている人数 |
出せる命令
out.push_back({ elevatorId, targetFloor }); // かご elevatorId を targetFloor 階へ
- 範囲外の番号や階は無視されます。
- 移動中に別の階を指示すると、減速・反転して向かいます。
- 目的階に着くと自動で扉が開き、降車 → 乗車 → 閉扉まで進みます。閉扉後
target は -1 に戻るので、次の命令を出します。
- 目的階に呼び出しも降車もない場合は扉を開けず、
target が -1 に戻ります。
シミュレータの固定ルール
- かご:最高 2.0 階/秒、加速 1.5 階/秒²。扉の開閉 0.6 秒、乗降は 1 人 0.25 秒、扉は最低 1.0 秒開きます。
- 乗車方向は開扉時に決まります(かご内の行き先 → 到着時の進行方向 → 最初に乗った人)。逆方向の人は乗りません。
- 満員(8 人)のときは乗れません。満員のまま呼び出し階を通過するとイベントに「満員通過」が出ます。
- シナリオ:朝(1F→上階 75%)/昼(双方向)/夕(上階→1F 75%)/ランダム。同じシードなら同じ乗客が湧きます。
書くときの決まり
- 編集できるのは
update() の中身だけです(白い行)。補助の処理はラムダ式で書けます。
- 使える構造体の定義は、エディタ上部の
controller.h タブで見られます。コード中の名前(hallCalls や target など)にマウスを載せると、説明が出ます。
- tick をまたいで値を覚えておきたいときは
static 変数を使います。リセットすると初期化されます。
- 使えるヘッダは
<vector> <array> <algorithm> <numeric> <utility> <cmath> <cstdlib> <climits> <cstdio> で、あらかじめ読み込まれています。
# の文字は使えません(#include や #define は書けません。コメントや文字列の中でも不可)。
- 例外(
try / throw)、時計、乱数生成器(std::random_device)は使えません。
printf の出力は、エディタの下に表示されます(デバッグ用)。
- 配列や vector の範囲外アクセスは実行時エラーになり、そこで制御が止まります。
進め方の目安
| P1 | 最初の呼び出しに、手の空いたかごを向かわせる(先着順) |
| P2 | 進行方向の呼び出しを拾い切ってから折り返す(SCAN / LOOK) |
| P3 | 呼び出しごとに全かごの到着時間を見積もり、いちばん早いかごに割り当てる |
| P4 | 朝・昼・夕で戦略を切り替える。待機する階を工夫する |
比べるときは、同じシード・同じシナリオ・同じ経過時間で。「評価・履歴」から、4 シナリオをまとめて一瞬で計測できます。
操作
| Ctrl+Enter | ビルドして実行(エディタ内) |
| Space / 1 / 2 / 3 | 一時停止 / 速度 1x・4x・16x |
| R / N / S / C | リセット / シード変更 / シナリオ切替 / 結果を履歴に記録 |
キー操作は、ビル断面をクリックしてから使えます(エディタ入力中は効きません)。