コンテンツにスキップ

命令数を使いすぎない

bot の計算量(命令数)をおさえます

計算量が本当に問題なのかは、測ってから考えます。

  • 対戦画面の下の、命令数のメーター(バジェットの 60% で黄色)
  • 分析画面の「命令数の消費」のグラフ

下の測定では、いちばん重い書き方でも、上限(150,000)の 2% ほどでした(命令数の上限)。 上限に近づくのは、ほとんどの場合、重い道具を毎回呼んでいるときです。

毎回、道を探し直す

毎回探し直す(重い)
def update(state):
me = state.me
en = state.enemy
path = find_path_bfs(state.map.grid, (me.grid_x, me.grid_y), (en.grid_x, en.grid_y))
if len(path) < 2:
return {"drive": "stop", "steer": me.angle, "fire": False, "barrier": False}
nx, ny = path[1]
go = angle_to(me.x, me.y, nx + 0.5, ny + 0.5)
return {"drive": "forward", "steer": go, "fire": False, "barrier": False}

10 回に 1 回だけ探して、覚えておく

見えない敵を探すの bot が、この書き方です。path残り を、global で覚えておきます。

経路探索と計算量のページで、実際に試合を走らせて測った値です。

書き方1 tick の平均
毎 tick BFS で探し直す1,157
10 tick に 1 回だけ BFS(あとは使い回す)213
経路探索なし(line_of_sight だけ)113

覚えておくだけで、5 倍以上軽くなります。 経路は、0.1 秒ではほとんど変わらないからです。

  1. 覚えておく。 前の update の結果を、変数に残す
  2. 必要なときだけ調べる。 まず line_of_sight、見えないときだけ経路探索
  3. ループの中で、重い道具を呼ばない
  • 自分の bot のメーターを見て、どの書き方が、いちばん命令数を使っているかを探してみましょう
  • print(...) で、途中の値を出してみましょう(組み込みの道具
  • メーターが赤になった。 その回は、前回と同じ動きになります。4 回目で行動停止です → 赤いメッセージが出たとき
  • 覚えたはずが、毎回まっさらになる。 global の宣言を忘れていませんか