TERRYのブログ

最近は競技プログラミングにお熱。

Sponsored Link

yukicoder score contest 2 writer記

yukicoderにてスコア問題(ヒューリスティック問題)のコンテストを開催しました。楽しんで頂けたのであれば幸いです。

writer経験はスコア問題でない通常の問題も含めて皆無だったのでとても緊張していましたが、なんとかなった?ので一安心です。

ビジュアライザ (seed=0)

問題

Tester: 物理好き(@butsurizuki)さん

yukicoder.me

TSP(巡回セールスマン問題)+最小シュタイナー木問題、のような問題でした。「2つの問題を組み合わせた新しい問題」系をAHCでよく見かけていたため、同じような方針で作問してみました。

writer解は「経路の順番と宇宙ステーションの座標をまとめて焼きなます」というものでした。慣れている人にとってはちょっと典型寄りの発想かな……という気もしましたが、AHCで最後にTSPが出てから半年以上経っていることもあり出題してみました。いかがでしたでしょうか?

writer解以外の想定解としては、「宇宙ステーションの座標を適当に決め打ってワーシャルフロイドした上でNearest Neighborや2-opt」「惑星をクラスタリングしていい感じのところに宇宙ステーションを配置する*1」などがありました。皆さんはどんな解法で解いたのか、コンテスト終了後のTLが楽しみです。

問題を作ってみて初めて分かったのですが、「最適解が出てしまわないか?」とか「上位陣が横一線で差が付かない問題にならないか?」とかが結構怖いですね。いつもマラソンの作問をされている方は凄いなと感じます。

余談ですが、Steiner TSPというくくりで一つのジャンルとして成立しているのですね。ざっと調べた限り、よく研究されている分野とは問題設定が違いそう*2なのでそのまま出題しています。

writer解はこんな感じの近傍 + 2-opt + α で焼きました。

ビジュアライザ

スコア問題を出すなら是非ともビジュアライザを付けたい!と思っていたので付けました。問題そのものの準備よりビジュアライザ作成の方が大変でしたが、ひとまずちゃんと動くものを提供できてよかったです。

盛り上がるといいなあという想いもあり、Web版にはシェア機能も付けてみました。若干ネタバレになる可能性もあったのですが、上位陣の解法はビジュアライザからは分からないだろうということ、レーティングが付かないコンテストだしそこまで厳密にやる必要もなかろうということから付けることに決めました。

技術的な話もちょっとしておくと、今回のビジュアライザはC# + Blazorで作成しています。使い慣れた言語でWebアプリケーションが作成できるのはよいですね。Webassembly最高!あとはAOTコンパイルがもうちょっと速くなれば……!

ホスティングにはAzure Static Web Appsを使用しました。CI/CDなんも分からんのですが、GitHub経由でなんかいい感じにやってくれるのでめちゃくちゃ楽でした。無料なのもありがたいですね。

Web版ビジュアライザ

steiner-space-travel.terry-u16.net

ビジュアライザのリポジトリ

github.com

雑なやつ

問題名のWIP表記

外し忘れていて慌てて修正しました。ごめん……。

ジャッジ負荷

正直全く読めませんでした。焼きなまし系で実行時間制限ギリギリを攻めやすいこともあり……。ジャッジ詰まりが怖かったのでテストケースも30個で妥協しています。ちなみにラストの提出ラッシュの際はyukiさんが先回りしてサーバを増強してくださっていました。本当にありがとうございます……!

ジャッジ負荷軽減・万が一詰まったときの代替手段を狙ってローカル版ビジュアライザにテストケース並列実行機能を付けたのですが、効果があったのかどうかは怪しいです。*3

言語

ビジュアライザにC#、writer解にRust、解説にPython、ジャッジにC++を使いました。多すぎ!

宇宙

ジェームズ・ウェッブ宇宙望遠鏡とかで今熱いですね。ストーリーの「天体観測技術の進歩により」はこれです。KSP 2はよ。

ロボてりーは?

「新たに開発された無人探査船」に乗っているという裏設定があります。ロボなので無人です。

ロボてりーだけなら別に地球に帰ってこなくても良いのですが、訪問した惑星のサンプルが欲しいので帰ってきてもらうことにしました。

叙々苑

ほんものてりーに勝てた人が一人もいなかったので、今回は該当者なしということで……。

最後に

お忙しい中Testerを引き受けてくださった物理好き(@butsurizuki)さん、yukicoderという素晴らしいプラットフォームを提供してくださったyuki2006(@yuki2006_kd)さん、そしてコンテストに参加してくださった皆様、本当にありがとうございました!

もし次回がありましたらどうぞよろしくお願いします。

*1:正直あまり考えていないのですが、例えばk-means法やWard法などでクラスタリングしたのち、それぞれのクラスタで最小シュタイナー木的な部分問題を考えて解き、最後に宇宙ステーションの位置を微調整しながら全体のTSPを解くような流れでしょうか。

*2:1001×1001個の候補点から8個を選んでTSP、というものではなさそうでした。

*3:新たにランタイムをインストールする系はハードル高いかも?