A - Railway Company Editorial by adapchi

AHC043参加記 ビームサーチの幅調整方法について

(追記)解説のうしろのほうにもう少し楽な方法を書きました。

解法は解説放送と大体同じで、経過ターン数をキーにしたビームサーチです。実行時間を調整するためにビームサーチをchokudaiサーチに書き換えるという方法もありますが、ビームサーチでもビーム幅を動的に変更して実行時間を調整できるので書いておきます。

ビーム幅の設定ですが、近傍を計算する関数の実行時間を実際に計測して、そこからビーム幅を算出しました。近傍を計算する関数の実行時間が引数によって大きく変化しないので推定できる感じです。

残り時間を残りターンに等分配して、各ターンに分配された時間を一単位あたりの実行時間で割ることで、各ターンに何単位実行できるかが計算できます。一単位というのは近傍計算のことで、各ターンに何単位実行できるかというのはつまりビーム幅です。

詳細な計算方法 具体的に $k$ ターン目のビーム幅 $w_k$ を計算する式を書くと次のようになります。 $$ w_k=\left\lfloor \frac{t_{\text{LEFT},k}}{T_{\text{LEFT},k} \; \hat{t}_{\text{NEIGHBOR}}} \right\rfloor $$ 各文字の意味は以下の通りです。
  • $t_{\text{LEFT},k}$
    • $k$ ターン目を処理する時点における残り時間。最初のターンは2.8秒、そこからターンが進むごとに減少する値です。実測して計算します。
  • $T_{\text{LEFT},k}$
    • $k$ ターン目を処理する時点における残りターン数。つまり $T-(k-1)$。
  • $\hat{t}_{\text{NEIGHBOR}}$
    • 近傍を計算する関数の実行時間の推定値。実際に計測した値の平均値を推定値としました。
ただし、最初の数ターンは実行時間の推定ができないので、ビーム幅は適当に設定します。
追記

各ターンに残り時間を等分配して、各ターンでは分配された時間を使い尽くすまでループを回せば、時間を推定する必要がなくなります。解説を書いてから気がつきました。

posted:
last update: