2023/10/14〜2023/10/22に開催されたAtCoder Heuristic Contest 025に参加しました。
ヒューリスティックのレートは入青直前という状況でありながら、ここ数回のAHCでは残念な結果しか出ずで足踏みが続いている状況です。とりあえず、今回こそは入青を決めようという気持ちで挑みました。
参加します。
— devgenjin77 (@devgenjin77) 2023年10月14日
AHCでは最近良い結果が出てないですが、なんとか今回でHeuristic入青を決められるように頑張ります
AtCoder Heuristic Contest 025 - AtCoder https://t.co/qSRbNa6AGJ
今回の結果
最終196位で終了。ここ最近のAHCでは、比較的良好な結果でした。
パフォーマンスは、なんとか青色を達成。念願の入青を達成することができました。
青パフォ取って、Heuristicは入青しました!😂
— devgenjin77 (@devgenjin77) 2023年10月23日
devgenjin77さんのAtCoder Heuristic Contest 025での成績:196位
パフォーマンス:1738相当
レーティング:1576→1618 (+42) :)
Highestを更新し、2 級になりました!#AtCoder #AtCoderHeuristicContest025 https://t.co/nXpNlU2bg9
振り返り
個人的にはかなり頑張ったつもりでしたが、終わってみると色々改善の余地はあるかなあという内容でした。
A問題
とりあえず、今回の方針の概要です。
#AHC025 お疲れ様でした。
— devgenjin77 (@devgenjin77) 2023年10月23日
最終結果196位でした。
基本方針としては、未配置の最も重い商品を、最も軽い袋に入れるを繰り返し、クエリが余ったら細かい交換をして改善を試みるをしました。
GIFはSeed=4で811865点。
それなりに上手く出せたつもりでしたが、上には上がいるもんだと思いました。 pic.twitter.com/IiVd40oQqW
まずは、各袋の重さの分散を最小化する方法のアイデア出しからです。
アイテムの重さが分かっていればランダムの初期解から焼きなましが効くんだろうが、今回は大小関係ぐらいしか分からんということで、これは難しいだろうと。
で、色々考えた所、とりあえず重たいアイテムから順に軽い袋に入れる貪欲を試してみることに。これがテストデータを元に検証してみると、それなりの結果が出たので、大体この方針で行こうと決めました。
未使用のアイテムのうち、重いアイテムを取る方法としては、未使用のアイテムを2グループに分けて1回比較し、軽い方を排除する操作を繰り返し、残った1つを最も重いアイテムとする方法を採用。
この方法だと、厳密には最も重いものが取れない可能性もあるのですが、クエリ回数を抑えつつ大体重たいものを引っ張ってくるにはいい方法かと考えました。なお、軽い袋を取ってくる方法も同じような考え方です。
どうしても十分なクエリ回数がないケースでは、ある程度ランダムに配置するしか無いのですが、その場合は前半の方で、できるだけ複数個まとめて配置し、後半にかけてちゃんと計測していくなどの工夫を実施。
最後の方は、この辺のバランス調整を色々やって、小手先の工夫では限界だと感じたところで終了としました。
ちなみに、最も軽い袋に対して、別の袋からアイテムを一個移動し、移動後の大小関係が変わらない場合は必ずスコアが改善されるという考え方から、クエリ回数が余るケースでは、この操作をできるだけ実行したのですが、気持ち程度の改善にしかなってなかったようです。
最終提出コード
https://atcoder.jp/contests/ahc025/submissions/46859842
感想
コンテスト後のTLを見てみると、実際の重さを推測する方法があるということで驚きでした。改めていろんな解法があるものだと感心しきりです。
比較方法については、全然改善の余地があったという感じ。特に袋のソートを完全にしていれば、スコア改善の余地はまだまだあったと思ってます。
これまでの実績
とりあえずヒューリスティック入青です。
総括
今回は、そこそこ良い成績が取れた方でしたが、ここから上を目指すには、まだまだ知識が足りないなというのが率直な感想です。
今後の目標としては、入黄を目指していく感じになるというところ。道のりは長くなりそうですが、引き続き精進していきます。
ということで、また次回も頑張ります。