AtCoder Heuristic Contest 051にVibe codingで参加してみた
AtCoder Heuristic Contest 051にVibe codingで参加してみた
はじめに
先日開催されたAtCoder Heuristic Contest (AHC) 051に、Vibe codingのみで挑戦しました。本記事では、その参加記録を残しておきます。
Vibe codingとは
VibeCodingとは自分ではコードを書かず自然言語でAIにお願いするだけでコードを生成するアプローチです。
Vibeは日本語で「雰囲気」という意味合いらしいですが、私はどことなく平成みを感じます。
AHC051の概要
AHC051は、ゴミ処理施設のレイアウトを最適化する問題でした。具体的には、ゴミの搬入口から分別器、そして処理装置へと至るベルトコンベアの配置を決定し、その効率を最大化することが目的です。
問題の詳細はAHC051をご覧ください。
この問題の難しさは、以下の2つの制約を同時に満たす必要がある点にありました。
グラフ構造の制約
- 閉路の禁止: ベルトコンベアの経路がループしてはいけません(有向非巡回グラフである必要があります)。
- 到達可能性: 搬入口から全ての分別器や処理装置に到達可能でなければなりません。
- 接続義務: 分別器の出口は、必ず他の分別器か処理装置に接続する必要があります。
幾何学的な制約
- 交差の禁止: ベルトコンベア同士が交差してはいけません。
これらの制約が複雑に絡み合うため、そもそも「制約を満たす解」を生成すること自体が非常に困難な問題でした。
LLM(Vibe Coding)での挑戦と課題
手始めにこの問題文をLLMに与え、アプローチを検討しその後実装まで行うようにお願いしました。しかし、以下のような課題に直面しました。
- 複雑な依頼の簡略化: LLMが色々頑張った結果、途中で処理を諦め、問題を勝手に簡略化し始めてしまう。
- アプローチの検討の甘さ: アプローチの方向性は良いものの、実際に生成される解は全く問題の制約を満たしていない。
実際にCopilotに問題文だけ渡して生成させたプログラムの解は以下のような形になりました。
図: Copilotに問題文のみを与えて生成させた解。ベルトコンベアの交差や閉路が含まれており、問題の制約を満たしていない。
方針転換:アルゴリズムの明文化
LLMに複雑なタスクを丸投げするアプローチでは限界があると感じ、より人間がアルゴリズムを明文化し、LLMにはその一部を担わせる方針に転換しました。
初回のアプローチ
各ゴミごとに分別機の組み合わせとグラフ構造を探索し、ゴミ処理場内のスペースに配置して最適化するアプローチを試みました。
基本方針:
- 分別構成の探索: 各ゴミタイプに対して複数の分別機を組み合わせた効率的な分別構成を探索
- 処理装置の配置: ゴミ処理装置をランダムに配置
- 分別器とベルトコンベアの配置: 分別構成に基づいて分別器を配置し、制約を満たすようにベルトコンベアを接続
例として、分別機a(ゴミ1を70%の確率で分別)と分別機b(ゴミ1を80%の確率で分別)を組み合わせた分別構成を以下に示します。
この構成により、ゴミ1をノードDに運び込む確率は0.7³ + (1-0.7³)×0.8 = 0.8686となり、単独使用時よりも高い分別効率を達成できます。
処理場への配置:
この分別構成を実際の処理場に配置する際は以下の手順を踏みます:
- 処理装置の配置: ゴミ処理装置をランダムに複数パターン配置
- 分別器の配置: 分別構成に基づいて分別器を配置。搬入口から段階的にx座標増加・y座標分散方向に配置
- ベルトコンベアの配置: 分別器間および処理装置への接続を、交差制約を満たすように配置
実装上の制約:
- 各ゴミタイプで使用する分別機の種類を制限
- ノード数を制限して計算時間を短縮
- 遺伝的アルゴリズムや焼きなまし法による最適化
結果:
しかし、ここでもLLMが問題を簡略化してしまい、特に処理装置の平面配置アルゴリズムが明文化できていないために実装が破綻してしまいました。
修正したアプローチ
より厳密に記述できるアプローチとして以下のアプローチに修正しました。
-
候補辺の限定: ドロネー図を作成し、接続する可能性のある辺をその辺のみに限定。探索空間を大幅に削減し、辺の数を頂点数Nに対して高々3N程度に抑制。
-
初期解の構築: 限定された辺を使い、貪欲法で初期解を構築。搬入口から順に、エントロピー減少量が最大となるように分別器の種類と接続先を選択。
-
最適化: 構築した初期解を焼きなまし法で改善。近傍操作として「分別器の入れ替え」や「接続先の変更」を定義し、制約を壊さない範囲で探索。
結果:
いくつかのテストケースで初期解を大幅に上回るスコアを達成できましたが、処理装置の配置が偏っているケースでは、ベルトコンベアが袋小路を形成してしまう問題が残りました。結局、自分のアルゴリズム力不足が影響して実装しきれず、最終的な得点には繋がりませんでした。
まとめ
今回はVibe Codingで最終的な結果に繋がるプログラムの作成は、私の力量不足もあって達成できませんでした。
一方、AHCにはOpenAIやSakana AIなどのAI企業が開発したAI Agentも参加し、一般人よりも遥かに良いスコアを叩き出しています。この結果は、作り込まれたAI Agentが人間以上に戦えるポテンシャルを秘めていることを示しています。
しかし、今回の挑戦が上手くいかなかったことを踏まえると、現時点では以下の点が重要であることが分かりました:
- LLMの利用ノウハウの蓄積が必要
- Agentのアーキテクチャの作り込みが重要
- 人間(or AI)によるタスクの適切な分解が不可欠
今後も似たような挑戦を通じて知見を蓄えていけたらと思います!
Discussion