高専プロコン2026 参加記

高専プロコン2026の本戦に行ってきました。 自分は2年前に続いて競技部門で参加していました。

画像

今回のルールについて

高専プロコンの競技部門は、開催地・香川にちなんだ**「ヘキサうどん」**をテーマとした対戦型の陣取り・探索競技です。

基本ルールと概要

六角形(ヘキサゴン)のセルで構成されたグリッド状のマップが舞台となります。
プレイヤーは巡回車と補給車の2種類のエージェントを操作し、
制限ターンまたは時間内に、効率よくスポットを巡り、より多くの「うどん」を獲得してスコアを取ろうっていう問題でした。

こんなやつです

画像

主な開発タイムライン

基本的な改善タイムラインはこんな感じでした。なんですかこれは

  • 10/1:C++基本形 — 貪欲法で初期経路を作り、山登り・焼きなましで改善。
  • 10/3:翌日への先回り — 回収後の余時間で翌日の店舗へ移動。
  • 10/3:補給担当の全日評価 — 補給車1台を固定し、試合全体の予測で担当を選択。
  • 10/4:ビーム探索を併用 — 既存探索と並走し、良い完成解を選択。
  • 10/5:複数車の局所改善 — 訪問の再挿入、2車交換、同系列の別店舗への置換を追加。
  • 10/7:Rustの並列探索 — 複数系統を同時に走らせ、最良回答を選択。渋滞予測も導入。
  • 10/8:翌日の在庫分布を評価し、複数の焼きなましと山登りで探索。
  • 10/8:燃料・補給を修正し、補給車1台必須へ。
  • 10/9:最終日までの全日ビーム+当日の焼きなまし。
  • 10/9:車別ビーム→全車結合→全残日評価。派生版では玉数優先で生成し、不足種類を後から修復。
  • 10/9:種類担当と玉数担当を分離し、共有在庫を考慮して経路を結合。
  • 10/10:経路・担当・補給の変更操作を切り替えながら改善。
  • 10/10:細かな経路変更と、複数車をまとめて作り直す探索を実験。既定無効。
  • 10/10:メンバーAの焼きなましをRustへ移植し、役割・補給の再計画とロバスト先読みを追加。
  • 10/10:メンバーBの解法をRustへ移植し、貪欲探索をビーム探索へ変更。
  • 10/11:全日程を差分更新する焼きなましへ発展。未来のビーム探索、合流・共同補給修復、並列探索を追加。

解法について

予選資料前

問題タイプがゴリゴリTSP問題だったので、工夫する焼きなましをしていく方針になるかなという感じでした。 直接対戦かと思いきやこちらの動きが相手のspotには影響がなく、道路渋滞が間接的に響く感じだったので、工夫の天井がありそうに感じました。

10/1 夏休み明け~ (!?)

他の作業が忙しすぎて、本格的な開発はこのタイミングになってしまった...

とりま 貪欲+焼きなまし(SA)

大会指定の評価順に合わせる評価関数で、SAをした。
→ が、もちろん全く伸びがなかったので改善します...

貪欲→ビームに変えて、予測も入れてみる

渋滞予測+次のラウンドを安定して回収するための配置をある程度先読みしないと行けないだろうなという考えのもと、貪欲をビームサーチに変更して、軽めの予測を入れた。

渋滞予測は過去の非公式大会場の過去データを使わせていただき、これのデータをもとにヒューリスティック関数を作りました(Adminの方ありがとうございます...)

最初は機械学習モデルを作ってみたのですが、精度面はヒューリスティックの方が10%高かったので、こっちを採用しました。

Codex補正ターイム!

ここらへんで「全くわかりません」状態だったので、改善作業をCodexに賭けました。モデルは

  • gpt-6.1-sol max
  • gpt-6-astra max

をFast modeで乱用しました。x200を押し込め!!!!! 結論から言うととんでもない改善みたいなものはなかったです...

やったこととしては、

  • 在庫分布を使った探索
  • 評価関数の 種類数累積>玉数 を 玉数>種類数累積 にしたものを初期解にした探索
  • それぞれの巡回車の複数の局所改善探索
  • etc...

くらいで、細かな改善はあったものの、当時の上位には届かなかった...

メンバーAが強い先読み関数を持ってきてくれた...

自分のアルゴリズムでは、渋滞予測とビームを使った先読み関数だったのですが、メンバーAは燃料割合を軸にしたSAで、これが結構強い...(てか俺が弱い)

比較すると、

観点 Aの方針1 Aの方針2 自分
今日の候補生成 燃料割合別SA 各日SA ビーム+SA
未来日探索 日ごとのSA 全日共同SA ビーム+翌日詳細SA
未来日の計画変更 再計画で実施 SAで直接変更 ロールアウト中の再計画
探索の単位 燃料使用方針 全日程の経路 今日の複数候補
評価 全期間G/D/U+今日の種類数 全期間G/D/U+残燃料 全期間G/D/U
主な強み 燃料配分を比較できる 日をまたぐ計画を直接最適化 多様な今日の候補を比較できる

1回戦はこれを採用しました

10/10 大会当日1回戦

www.youtube.comhttps://www.youtube.com/live/pMkEq2rSjzQwww.youtube.com

対戦場での戦績はそれなりにあったので、1回戦は乗り越えたいところ...

画像

結果はこんな感じでした。 通過!

画像

改善ポイント

全体の試合を見てるところで、いくつか改善できると思ったところ

1. 道路が少ないことによる燃料効率の予測

マップ傾向を見てると、

  • 2幅の道路がほとんど無い
  • 池に囲まれ一本道の先にspotがある
  • 山地の比率がデカい

など、非公式対戦場より配置が降ってきてました。(え、おみくじ?)

過去の対戦統計をとると、燃料切れによるstep消費が目立つので、自分はここを主軸に改善しました。

具体的には、

  • 巡回車の意図的な待機
  • 補給車が効率よく巡回車経路を巡る改善

を入れました。

2. 道路渋滞予測

  • 2幅の道路がほとんど無い

これに対しては、今のヒューリスティック関数をうまく改善する形にしました。

過去のものだと、先読みの部分に本格SAを使わずにビームだけで走らせておりました。これは当日+翌日ラウンドの改善を重点的にしようという意図です。
→ 多分これが悪さしてるのでは? ってのでスレッドを分けて並列で回すようにしました。

効果

目出す改善は出せなかった...

練習場でもそこまで上がらず(てか他のチームがめっちゃ強くなってる)、ここまで来ると流石に投了宣言したくなる...

メンバーBのアルゴリズムを採用

貫徹してくれたメンバーBのアルゴリズムが、更に強そうな先読みを作ってくれた...

観点 メンバーA 自分 メンバーB
初期解 Greedy中心 全車ビーム幅128 複数の貪欲法
当日の改善 高速SA ビーム+SA SA
複数地点の一括変更 オプション 対応 対応
補給計画 SAで合流計画を変更 合流・補給順序などを探索 巡回経路に対して合流計画を構築
先読み 全日程ロールアウト 最終日までビームで試走 翌日を複数シナリオで探索
未来日のSA あり 詳細探索時に翌日SA あり
渋滞予測 オプションで悪化想定 現在の道路を固定 複数の渋滞シナリオ
全日程の共同SA 別ソルバーで対応 標準ではなし 標準ではなし
将来評価で重視する点 種類数・燃料配分 全期間のG/D/U 翌日の得点・渋滞耐性・補給安全性

まさかのビームより貪欲法が強いのか...? 先読み精度高くないか?
強かったのは事実なので準決勝で採用しました

10/11 本戦2日目 準決勝

PC性能をフルに使わせる

Macbookの性能がそれなりにあったので、アプリを落とさない程度に計算スレッドを立てるように修正して、今までより何倍もの計算をするようにしました。マシンパワーを押し込め!!

www.youtube.comhttps://www.youtube.com/live/djTcIhqp4O0www.youtube.com

祈 15+

まあ予想できたフィールド配置。

画像

ログと当日順位を見てる感じ、それなりに上手く行ってるでは? ってので結構希望を感じてたのですが...

画像

あれ!?

あれなんか全然取れてない... こっちのログを見てると、Python側でAttributeErrorの文字が...

後々調べてみると、Pythonバージョンによる問題だったらしい。今まで出てなかったエラー吐いてくるのやめませんかほんとにまじで()

最終結果

謎の当日エラーにより、悲しくも7位という結果になりました。あのエラーがなかったらワンちゃんもっと伸びてるって考えると悔しいなあ。(なんだよあのエラー)

画像

振り返り

色々と反省はあります

良かったこと

それぞれのメンバーの方針→統合

チームで一つ解法を考えるよりかは、それぞれで強そうな解法を作って、そこから統合→派生→統合→派生... の繰り返しで、うまく改善ループを回せました

当日の追い込み

チームの誰かが最後まで粘れる状態を作って、最後の最後まで改善できたので、負けたにしろうまくできたと思います。

改善

本格スタートしたタイミング

早く始めましょう()

練習場の自作

解法を作るにあたって、自前で作らずに非公式対戦場を頼ってました。 恐らくベンチマークを図るって面では自作環境の方がループが早くできるので、作っておけばよかった...

言語の統一

それぞれで解法を考えるってなったときに、

  • C++
  • Rust
  • Python

それぞれで使う言語が増えていったため、統合作業に時間がかかった印象。 恐らく、当日のエラーもそれが影響してたかなと思いました。 まだまだ競技におけるAI Codingは未熟...

まとめ

全然伸びしろはあったのですが、短期間でここまでいけたことと、久しぶりのチーム競技をできたので楽しかったです! てかチームメンバーが強すぎて感謝を捧げていた...

また自分の高専からは、課題と自由それぞれ後輩チームが出ており、惜しくも賞は取れなかったのですが、初めての開発・デモ・プレゼンといういい経験をさせてあげられたかなと思っています。

自分は、来年が高専プロコン参加権の最後になるので、決勝戦を目標にちゃんと鍛え直そうと思います! 取り敢えず、半年お疲れ様でした。

おまけ

高松には何回か来たことがあり、今回はうどんじゃなくて骨付き鳥を食べた。(写真撮り忘れたぁ...)

骨付鳥 笑|香川県高松市にて香川名物の骨付鳥と旬の野菜を使った創作料理を提供する居酒屋です。地元の食材を中心に食材を活かした料理をご用意しております。骨付鳥はテイクアウトも可能です。https://honetsukidori-wara.com/honetsukidori-wara.com

© 2026 Kizuki