職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

待ち行列 in 現実世界

出勤途中にほぼ毎日立ち寄るコンビニがあります。関西でも有数の乗り換え駅の改札内に出店してあり、非常に多くの人が利用しています。人気の理由は、立地条件はもちろんのこと、混雑時には3つのレジに6人の店員が並ぶことにより他店とは比較にならない程のスピーディーな買い物を実現している点です。

この店舗、普段はレジ待ちの行列は各レジごとに作られる(即ち、待ち行列は3本できる)のですが、先日、1列になっていることがありました。しかし、列は1分後には崩壊してしまい、普段の3列状態へと遷移しました。
この様子を目の当たりにしたことがきっかけとなり、待ち行列は単数が良いのか、それとも窓口(レジ)の数だけ作るのが良いのか、少しばかり考えてみることにしました。

■「1列の待ち行列」はなぜ崩壊したのか?
この時のことを思い返すと、ある一人の客が、1列の待ち行列には並ばずに直接レジへと向かったことから始まりました。「なんと空気の読めない奴だ」とも思いますが、普段からこの店に訪れていて、各レジに並ぶのが当然!という意識を持っている人かもしれません。
その様子を見た行列の人たちは「このまま割り込まれ続けたら大変だ」とでも考えたのでしょうか、どんどん各レジの前に並ぶために移動していきました。まあ、僕もその移動組の中の一人なんですが(笑)

■理想的な行列とは?
理想的な行列が最終的に目指すのは「並ぶ人たちに満足してもらう」ことであり、そのための方法として「待ち時間を理不尽に長いものとは感じさせない」ことが重要であります。
それでは、そのように感じさせないためには、どうしたら良いのでしょうか? いくつか挙げてみましょう。
・列の割り込みを防止する
 ⇒割り込みによる遅延は非常に納得の行かないものです。
・待ち時間がだいたい平均に近づくようにする
 ⇒皆が同じように待っている環境では、待たされる理由に不満は抱きにくいものです。
・享受するサービスが同じようなものになるようにする
 例えば、窓口ごとに取り扱い商品に違いがある、特定の窓口ではICOCA/SUICA決済ができない、抜群の容姿を備えた係員が1人だけ対応している、などは望ましくない

■銀行ATM的アプローチ
我々職業プログラマ達は日中に外出することはほとんど無いのでレアな経験となりますが、平日昼間の銀行ATMというのは驚くほどに混雑しているものです。そして、その多くでは1列の待ち行列が形成されています。どのようにして「理想的な行列」を目指しているのでしょうか?
待ち行列は1列 ⇒自ずと待ち時間の分散は小さくなる(式で示そうと思ったけどやめた。。)
・広い店舗面積を活かし、割り込み防止のための柵を設置している
・希に例外はあるものの、ATMが備えている機能はほぼ統一されている

■コンビニ店舗的アプローチ
コンビニ店舗では、行列は窓口数だけ形成されることが多いです。
冒頭に紹介したコンビニ店舗ではどのようにして「理想的な行列」を目指しているのでしょうか?
待ち行列は窓口の数だけ存在
 ⇒銀行ATMのように広大な敷地を確保できることは希なものです。
・1つの窓口に係員を2人配備し、サービス提供に必要な時間を極限まで短くする
 ⇒目の前の客が素早く捌かれていれば、多少の待ち時間のバラツキは気にならないものです
・レジ横には珍しい製品を配置し、並ぶ客の気持ちを和らげる

■ソフトウェア技術的に考える
待ち行列と言うとソフトウェアの話だと捉えることが非常に多いですが、今回は敢て現実世界からアプローチしました。
システム構築の際には、何の検討もせずに銀行ATMスタイル、待ち行列1本モデルを採用することが非常に多いものです。しかし、現実世界には複数列が適している場合があるのですから、ソフトウェアにおいても同様だと考えられます。
身近な事例を考えると、セッション維持機能を持ったHTTPロードバランサを使ったWebシステムが挙げられますね。ロードバランサの存在を透過的なものとして捉えると、各HTTPサーバはそれぞれが待ち行列を持つことになります。

盲目的に「待ち行列は1本」とするのではなく、きちんと検討した上でモデルを決定したいものです。