はじめに
12/19に開催された第31回全国高等専門学校プログラミングコンテストの非公式競技部門に参加してきました。
ルール
- 基本的には去年と同じルール
- 囲んだ領域マスは消えない(囲みが消えても領域マスは保持される)
- 領域は4近傍で囲まれている必要がある
方針
- 各エージェント毎に多様性を持たせてビームサーチしてから、焼きなましで経路の組み合わせを検索
- 評価関数は得点、領域、エージェント間の距離、経路のコンフリクト度合いなどに対して適当に係数をかけたりする
- ハイパーパラメータはoptunaで最適化
実装
Rustで実装しました。GUIにはdruidを使って、APIやJSON周りはserde-jsonやreqwestを利用しています。
リポジトリはこちらです。
できなかった事
- 並列化
- 情報の自動取得や自動送信
- 特定の盤面に対する対応
- 相手の領域を予測した除去
- 相手の行動を考慮に入れた評価関数の設計
反省
- 本番のコードに対するバグが多すぎた(当日になって解決するケースが多かった)
- 準備期間が不足していた
- ルールの誤読が複数あって、片方は当日朝、もう片方は本番で気づいた (エージェント配置でタイルが変わらない事、囲みが4近傍になっている事)
- アルゴリズムがランダム配置のマップ前提の物になっていて、人工ケースで動かす時に問題が多かった
おわりに
ちゃんとルール理解していたり本番にバグがなければもう少しいい成績が取れていたと思うのでかなしい
骨組みを前もって作っておいたとはいえ、アルゴや通信部分等を3日で完成させられたのは良かったと思う
このような環境を用意して頂いた運営のみなさんに、感謝・・・