全脳科学帳

これを好む者はこれを楽しむ者に如かず

渡り廊下問題(2) 極限値

同じ階数の2つのビルの間を行き来する手段として、1階に加えて渡り廊下を1つ設ける場合にどの階が最も効率がよいかという問題の続き。ビルの階数に対する渡り廊下の最適位置の割合の極限値が気になるので、前回Perlスクリプトに計算させた「全ての移動の組み合わせに対する移動階数の合計」の一般解を与える式を求めてみることにした。こうなってくると、当初の「いつも使っている5階の渡り廊下は最適なのか」という問題を離れて、純粋に数学的興味である。

2つのビルの階数をnとし、渡り廊下をx階に設けるとき、片方のビルのa階から他方のb階に渡るときの最短経路は以下のように場合分けできる。

  1. a \gt xかつb \gt xのとき(出発階も到着階も渡り廊下より上)
    必ず渡り廊下を渡り、移動階数は(a - x) + (b - x)
  2. a \gt xかつb \le xのとき(出発階が渡り廊下より上で、到着階は渡り廊下と同じか下)
    必ず渡り廊下を渡り、移動階数はa - b
  3. a \le xかつb \gt xのとき(出発階が渡り廊下と同じか下で、到着階は渡り廊下より上)
    必ず渡り廊下を渡り、移動階数はb - a
  4. a \le xかつb \le xのとき(出発階も到着階も渡り廊下と同じか下)
    1階と渡り廊下のどちらを経由するのが近いかによりさらに場合分け
    1. (a - 1) + (b - 1) \le (x - a) + (x - b)つまりa + b \le x + 1のとき1階経由になり、移動階数は(a - 1) + (b - 1)
    2. a + b \gt x + 1のとき渡り廊下経由になり、移動階数は(x - a) + (x - b)

2.と3.の総和が同じになることを利用し、1, 2&3, 4-1, 4-2に分けてそれぞれ総和を求める。久しぶりにまとまった数式計算をしたのでめげそうになった。途中で「自然数の二乗の総和(\sum_{i=1}^k{i^2})」を求める必要があるのだが、そんな公式(\frac{1}{6}k(k+1)(2k+1))はすっかり忘れていた。ともかく全ての総和を足して整理すると、(1〜n階)→(1〜n階)のn^2通りの移動に対する移動階数の総和は

  • f(x) = -\frac{1}{3}x^3 + 2nx^2 + (-2n(n+1)+\frac{1}{3})x + n^2(n+1) (1 \le x \le n)

となる。前回作ったPerlスクリプトで、移動階数を地道に足していく代わりにこの式の値を使うようにしたら全く同じ結果になったので、正しそうである。計算量のオーダがO(n^3)からO(n)(xを1からnまで変化させるだけ)になり、劇的に速くなった。

さて、階数が十分大きいときに渡り廊下の最適位置がどのあたりにおさまるかを見るには、f(x)が1〜nの範囲のどこで極小値をとるかを調べればいいはず。f(x)微分すると

  • f'(x) = -x^2 + 4nx -2n(n+1) + \frac{1}{3}

これが0になる点を求めてみる。二次方程式の解の公式(これも久しぶりに使った)に当てはめ、1〜nの範囲に入りそうな解x_0を求めると

  • x_0 = 2n - \sqrt{2n(n - 1) + \frac{1}{3}}

で、求めたかった「ビルの階数に対する渡り廊下の最適位置の割合の極限値」は

  • \lim_{n\to\infty}\frac{x_0}{n} = \lim_{n\to\infty}\frac{2n - \sqrt{2n(n - 1) + \frac{1}{3}}}{n} = 2 - \sqrt{2} = 0.585786...

「階数が十分大きいときの最適位置は階数の0.586倍付近になりそう」と書いたが、めでたく正確な極限値がわかった。「e(自然対数の底)を使った式になるのだろうか」というのは全くはずれ。nxの三次式なので、eまで出てくることはないのだった。