命令数を使いすぎない
やりたいこと
Section titled “やりたいこと”bot の計算量(命令数)をおさえます。
先に確かめる
Section titled “先に確かめる”計算量が本当に問題なのかは、測ってから考えます。
- 対戦画面の下の、命令数のメーター(バジェットの 60% で黄色)
- 分析画面の「命令数の消費」のグラフ
下の測定では、いちばん重い書き方でも、上限(150,000)の 2% ほどでした(命令数の上限)。 上限に近づくのは、ほとんどの場合、重い道具を毎回呼んでいるときです。
悪い書き方と、良い書き方
Section titled “悪い書き方と、良い書き方”毎回、道を探し直す
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 秒ではほとんど変わらないからです。
軽くするコツ
Section titled “軽くするコツ”- 覚えておく。 前の
updateの結果を、変数に残す - 必要なときだけ調べる。 まず
line_of_sight、見えないときだけ経路探索 - ループの中で、重い道具を呼ばない
試してみよう
Section titled “試してみよう”- 自分の bot のメーターを見て、どの書き方が、いちばん命令数を使っているかを探してみましょう
print(...)で、途中の値を出してみましょう(組み込みの道具)
うまくいかないとき
Section titled “うまくいかないとき”- メーターが赤になった。 その回は、前回と同じ動きになります。4 回目で行動停止です → 赤いメッセージが出たとき
- 覚えたはずが、毎回まっさらになる。
globalの宣言を忘れていませんか