頑張ってブログを更新中。

本日KaggleのSanta 2025というコンペが終了しました。なんだか7~8年ぶりくらいにKaggleコンペに参加した気がします。

 

今回参加したのはもみの木の形をしたオブジェクトを如何に小さな正方形に詰め込むかという問題。パッキング問題ともいうらしいです。

 

昔はアイディアを実装するのに半日近くはかかっていた気がします。実装につかれてしまって、あまり試行錯誤は出来ずに徒労感が募っていったので、Kaggleコンペは1度きりで続きませんでした。

でも今はChatGPTとかGeminiとかがあるので、これらをフル活用しました。まあ、それでもメダル圏内には届かなかったという感じです。

次回以降にコンペに参加するかどうかは分かりませんが、私なりの反省を書き綴りたいと思います。

 

反省点

1.評価指標を正しく理解する

評価指標を正しく理解するのは大事ですね。当たり前すぎるのですが、ちゃんとできていたかどうか怪しいので反省。

「まあ、こんな感じだろう」位の理解で進めていたので、途中スコアが伸び悩んでいた時期がありました。

 

2.上手いやり方を真似をする

最初は自己流で樹木を並べるようなアルゴリズムを考えていました。一つ一つ並べていくという方法を検討していました。

途中で他の人の手法を参考にしてみると、多くの人は予め整列された樹木を少しずつずらして位という方法を取っていて、1から並べるよりもよっぽどスコアが伸びていました。

最初は素朴に考えてみて感触をつかむのは大事なのかもしれませんが、ある程度上手くいかないことが分かってきたら、さっさとうまいやり方を真似するべきでした。

 

3.上手く行かない方法をさっさと諦める

最初から整列した樹木をずらしていく方法を取り入れた後に、樹木をずらすアルゴリズムとして焼きなまし法か山登り法かどちらかを採用しようとしていました。

山登り法を改造していった方が効率が良かったのですが、変に焼きなまし法に拘ってしまったきらいがあります。

 

4.アイディアをGeminiやChatGPTまかせにしてはいけない

途中でアイディアが尽きてしまって、「GeminiやChatGPTにおまかせ」するような状態になりました。GeminiやChatGPTはアイディアは出してくれますが、あまり上手く行かなかったのが正直なところです・・・。結局は自分で考案した「ある程度樹木が接近したら2つで1つのオブジェクトとみなす」という作戦がスコア改善のブレイクスルーになりました。

GeminiやChatGPTはアイディアを膨らませるのは得意ですが、0から1まで持っていくのは自分次第だなと思いました。

出力や途中経過で気になったことや気づいたことを些細な事でもいいので、GeminiやChatGPTにプロンプトを投げて、壁打ちをすればよかったなと思いました。

 

5.可視化や途中経過を出力するのは大事

やっぱりGeminiやChatGPTはアイディアを膨らませるのは得意で、「途中経過が分かるようにしたい」とか「パッキングの様子を色で分かるようにしたい」という要望を出したら可視化コードを提供してくれました。

途中経過や最終出力をちょっと工夫して出力することで、改善案を出しやすくなりました。

 

とまあ、こんな感じで数年ぶりのKaggleを楽しみました。また参加するかどうかは分からないけど、個人的には色々と勉強になって楽しかったです。私は分からないことが分かるのが好きなんだなと改めて思いました。メダルまで到達できなかったので、ちょっと悔しいので、また良さげなコンペを見つけたら参加してみます!

 

追記

1か月近くそれなりに頑張ったのに入賞できなかったので、だんだん悔しさがこみ上げてきました。そんでもってGeminiと反省会をしました。

 

Geminiとの反省会

①「重なりあり」を選ぶ観点

物理学的な直感上位勢(特に物理学や数学に強い層)は、このパズルを「図形の配置」ではなく「粒子の充填(パッキング)」という物理現象として捉えます。

  • 剛体モデルの限界を知っている: 「ぶつかったら止まる」という剛体ルールは、シミュレーションの世界では「ジャミング(目詰まり)」を起こしやすく、最適解に辿り着けないことが経験的に分かっています。
  • ソフトポテンシャルの活用: 粒子同士を少し重ねることで、粒子が互いの隙間をすり抜けて「よりエネルギーが低い(=密度が高い)場所」へ移動しやすくなることを知っています。これは、複雑に絡まった糸を少しずつ解きほぐすようなプロセスです。

② なぜ「焼きなまし(SA)」が本命だと確信できたのか

最適化問題において、手法の選択には一定のセオリーがあります。

  • 連続性と離散性の混合: 座標は連続的ですが、配置パターンは離散的です。このような「複雑でデコボコした地形」の最適値を探すには、山登り法ではすぐに袋小路に入ってしまうため、SAが第一選択肢になります。
  • 計算回数の力技: 11位の方が言及しているように、判定を極限まで高速化して数億回試行すれば、SAは統計的に必ず「そこそこの正解」に収束します。上位勢は「手法に迷う」のではなく、「いかにSAを高速に回す環境を作るか」に初動のリソースを全振りします。


③なぜ自分は思いつかなかったのか?

(3つの壁)あなたが悪いわけではなく、以下の3つの「壁」が発想をブロックしていた可能性が高いです。

  • 「ルールへの忠実さ」という壁:コンペのルールが「重なり禁止」である以上、プログラムも「重なり禁止」で書くのが自然です。しかし、上位勢にとってルールは「最終的な制約」であり、「探索のプロセス」ではルールを破った方が効率が良いことを知っています。
  • 「成功体験」という壁:最初に $n=200$ で綺麗な格子状に並べられたことが、逆に「この形を維持すべきだ」という固定観念(局所最適解)を生んでしまいました。これが「1本抜いて微調整」という守りの戦略に繋がったのです。
  • 「道具(ライブラリ)」という壁:Shapelyは便利な道具ですが、SAを高速に回すには不向きです。上位勢は「既存の道具で何ができるか」ではなく、「SAを数億回回すために、自分たちで判定エンジンをどう作るか」から考え始めます。

 

④ これからの「武器」になる考え方

次に似たようなコンペに出る際は、ぜひ以下の「上位勢の思考セット」を思い出してください。

  • 「ズル(重なり)」をしてでも動かしやすくする。
  • 「破壊と再生(再配置)」を組み込む。
  • 判定処理は1ミリ秒でも削る(試行回数が全て)。

 

入賞者の手法

他の人の手法はこちら

shu10038.weblog.to