CODE4LIFE
CodinGameの10日間コンテスト。↓こんな感じで薬を作って得点を稼ぐゲームです。
https://www.codingame.com/replay/228356470
世界21位/国内5位でした。日本つよい。
ルール
↑のエリアではサンプル(薬の素)を取得できます。取得する際にはrank1~3を選べて、高ランクであるほど作るのが大変だけど高得点です。
←のエリアではサンプルを解析してレシピにします。不要なレシピはクラウドにアップロードするという形で捨てることが出来ます。なおアップロードしたレシピは敵・味方問わずいつでも再取得できます。
↓のエリアでは薬の材料を取得できます。材料は各種類5つづつ用意されてあり、それを敵味方で奪い合います。
→のエリアにレシピ+レシピに合った材料を投入すると得点になります。薬を作るとA~Eどれかの経験値を得られて、経験値分だけレシピより少ない材料で薬を作れるようになります。
アルゴリズム
ルールベースで処理しました。αβも考えたんですが、ルールベースの強さを超える自信がなかったし、評価関数がどーせヒューリスティックっぽくなるだろうなと思ってやめました。
↑の戦略
シミュレータのソースを見るとどんな種類のサンプルが取得できるかが載ってあったので、とりあえずそれはテーブルとして持っておきました。
ランク毎に平均得点(A)と手持ちの材料+下の材料で何割作れるか(B)を算出して、A*Bが最大になるランクを拾うようにしました。
←の戦略
とりあえず全部解析します。
解析後、手持ちに作れないものがあって、クラウドに得点が高くてかつ作れるものがあったら交換します。
1個でも作れるものがあったら↓に行って、作れなかったら全部アップロードして↑に戻ります。
↓の戦略
まず嫌がらせを優先します。A~Eそれぞれに対して[場にある数-敵の薬を作るのに必要な数]を算出してそれが3~0だったらそれを奪います。(今思えば3はやりすぎだったかも)
嫌がらせが終わったら、得点の高いものから順に材料を集めていきます。作り易い順でもやってみたんですが、何か弱くなったので採用しなかったです。(ここちょっと考察不足)
場にあるものを拾っても作れるものが無くなったら→に行きます。ただし、ここで相手が→に投入する直前で、欲しい材料が戻ってきそうだったら待機します。
→の戦略
何も考えずに薬を作成します。(ちょっとは考えたほうが良かったかも)
全部作成し終わって、手持ちのレシピに作れそうなものがあったら↓に行って、なければ↑に行きます。
反省
終盤何が強いのか分からなくなってしまいました。これは、AgadeさんがGhost in the Cellでやってたことなんですが、シミュレータを作ってローカルで数万回自己対戦して強くなったかどうか判断すべきでした。
そろそろパラメータの自動調整を実装したい。今回もrankの選び方とか嫌がらせの閾値調整とかに無駄に時間取られたので何とかしたいし、常に最強のパラメータを選んでるという安心感が欲しいです。
最後までゲームの肝がよく分かってなかった(考察不足)。後半思考を放棄していたのがダメダメでした。考えることを諦めては勝てるものも勝てません。