# AHC023 Acprova プログラミングコンテスト2023 2023/09/03 10:00 ~ 09/10 20:00 https://atcoder.jp/contests/ahc023/ ## 1日目 ### 所感 栽培する問題。移動制限がかなりあるので、植える箇所を考えていく。 時間進行があるけど、植える場所の問題だから焼けそう? S日までに植える、だから前は自由度がある。 D日に必ず収穫、だから後ろは自由度がない。 スコア=Dk-Sk+1なので、難しいやつほど得点高くはある。 ひとつのターンの 始めに植える、これは同時に植えていいっぽい。 終わりに収穫Dがあれば収穫する。これも同時にやっていいので、順番が必要な場合も上手く収穫してくれるよう。 問題の大きさが100ターンの20x20しかない。結構小さめ。 これはしっかり詰めないといけなそう。 ん?Kが0<K<HWT=40,000だ。どうやっても植えきれないやつはありそう。 ~~得点で+1があるので、D-Sが短い育てやすいものから考えてよさそう。~~ →植えと収穫のズレで+1は当然だった。どれだけマスを休ませないかが重要。 →Kの数がわからなかったのでclar投げてみた なるほどわからん。Lをもとに作れるだけ作物を作ってそれがKらしい。 分布見たほうが良さそう。 →いちおうS→Dが平均10ターン?、あるパラメータLが40,000x1.5=60,000が平均らしく、 L/(S→D) = 6,000個がKの平均っぽい。 →パラメータLは HWT ≦ L ≦ HWTx2 なので、全作物はどの道作れなさそう。 パラメータdが存在し0~3の4パターン。 seed mod 4 できまるようで、これによって水路の複雑度がかわる。 seed=0,1,2,3の順で単純になる ![](https://hackmd.io/_uploads/B1sA-D-Ch.png) d=0の時はかなり複雑なので、これだけ別実装もありそう。 入り口は左側固定。 植えるのはいつでもいいので、収穫タイミングに合わせてでいい。 これ、ターンの後ろから見ていった方が良さそう。 Dが決まっているので、最後の盤面から順に置いていくでいい。 →どの道最後はなくなるので、前から見ても一緒だった。 →入り口のマスを埋めることがある?実装面でちょっとややこい。 ソートもDでしたら良さそう。Sは制約にして、Sより前なら好きに置ける。 Dが遅いやつほど奥に置くでいい。 道っぽいやつを作るのが簡単だが、多分焼いたら勝手にそれっぽくできる。 到達判定は高速にやったほうが良さそう。 200盤面が必要か。(植えと収穫とでそれぞれ) 制限2sか。。。かなり苦しそう。 あれ?相対スコアじゃなさそう。 あるターンの到達可能マスが重要そう。 いつ植えても得点は一緒なので、S以前の開いている時に置くでいい。 置く場所の決定が候補が多すぎる。 →100Tしかないので、Dは被りまくる。 Dが一致しているグループ単位であるひと区画に集めておいちゃうのが良さそう。 植える場所のグルーピングも重要そう。 →大きな配置が決まったあとで、あぶれたやつを差し込むのはやればいい。★ となると、大きな配置はD-Sが長いやつがいい。 →通路を意識せずに配置の計画だけ決めちゃって、プレイアウトで貪欲で配置可能なように間引く? うーん、やはり道を作った方が安全そう。区画を決め独立して到達可能な道を決める。 →区画の統合も考えた方がいい。そうすると道の分を削れる。★ →区画ごとにSの期間は一番前に合わせたら良さそう。逆にロスも計算しやすい。★ 方針が決まった 1.盤面を区画・区画の統合したものに分ける。 2.Dの一致する作物をひとかたまりで区画に割当る。 3.割当られた作物は、Sの早いやつから奥から植える。 4.2.を焼いて、スコアを最大化する。 5.100ターンの到達可能盤面を出して、空きマスに割当られそうな残り作物を割当る。 →いや、ビームの方がいい?時間が無いことと、区画をまとめて同じDで占拠するのが強いので。 →うーん、やっぱり局所改善系の方がいいかも。区画まとめてswapしたらいい。 ■得点について 最高値は決まっていて、10^6(1,000,000)点。 score = 10^6x∑s/HWTで、∑sの理論値 = HWT なので。 ロスしたマス×ターン数分だけHWT(40,000)から下がっていく。 相対スコアじゃないので、そこらへんはわかりやすい。 愚直解(常に到達可能にして置けるだけ置く)で50%。 通路で半分くらい使うということか。。。 ### 実装 ■分布 S:最初から立ち上がっていて、終わりに少なくなる ![](https://hackmd.io/_uploads/B1gaRbjZR2.png) D:最初だけ少なくて、15ターン以降は似た感じになる。終わりまで継続。 ![](https://hackmd.io/_uploads/Sk3RAq-02.png) L(D-S):10はピークだが、最大50くらいまで細く長く存在。 ![](https://hackmd.io/_uploads/B1EzVsZAn.png) →やはりLの長過ぎるやつは間引いてあとで割当がいい。 Lが0,1は存在しない。2,3当たりは使い勝手がいいので間引いて良さそう。★ L>16からも数が減るので間引いて良さそう。 →Lが異常に大きいものは、2つのDグループにまたがって連続で割当ができそう。★ つまり後ろから見るになる。 →もとがHWTx1.0~2.0の範囲で∑Lが動くので、余裕がある。 ∑Lに合わせてcutするラインは調整したら良さそう。★ D毎に区間が一致するものの数とそのL ![](https://hackmd.io/_uploads/SJHs4n-C3.png) →だいたい5~6個くらいのセットでありそう。 通路を潰せたりするので5個のセットで区間をグルーピングしたらいい。★ →Lは少し短めによっていて7ターンくらい。多分近くにも同数のグループがありそう。 →やはりLは15程度までしかいかない。 ■visualizer できた。seedも固定した。(現状は仮で4マスずつグルーピング) ![](https://hackmd.io/_uploads/HkAF5MfR2.png) ■区間の導出 入り口からの距離が遠い方からグルーピングしていく。 うーん、どうやったらいいだろう。 やりたいのは、道に対して間口狭の京都のような家。(うなぎの寝床) ![](https://hackmd.io/_uploads/rk0MtezR2.png) 1.一番遠いマスまでの道をまずは作る。 2.その道から距離を出して、また遠いところからの道を作る。 3.道からの距離がどのマスも一定以内になればOK →十字路は作りたくない間口が広いますができる →T字路もよくないが、あとで通路を埋めやすいので一本最長路があって、そこから枝分かれは良い。 →間口を使うターンを覚えておいて、通路に伝搬させるといい。 なるべく間口を使わないターンが多いほど、あとで詰めやすいので加点する。★ **TODO** ~~入出力作成~~ ~~愚直解出力~~ ~~バッチ処理~~ ~~スコア計算(ベストを保存する機構)~~ ~~D、D-Sの分布の統計~~ ~~visualizerにて区間描画~~ 区画の導出 区画に作物を割当る 割当を焼く 到達可能盤面の導出 空きマス埋め 統合区画の導出 統合区画への割当を可能に(焼く) ## 2日目 ### 実装 10:30時点の順位表。理想の80%くらい。90%(45M)はいくと思っているのでまだまだ。 ![](https://hackmd.io/_uploads/H1Z472f03.png) ■区間の導出 1.一番遠いマスまでの道をまずは作る。 2.その道から距離を出して、また遠いところからの道を作る。 3.道からの距離がどのマスも一定以内になればOK 1.一番遠いマスまでの道をまずは作る。 だと微妙。結局途中どこに寄るかで最適は異なる。 ![](https://hackmd.io/_uploads/BknXU6GA3.png) →壁からなるべく離れつつ、各奥点に上手く寄るのが大事。 →各奥点をまずは出す。そこから壁から離れつつ奥点の最寄り点を出す。 →その最寄り点を最短で結ぶルートを作る。(距離は5?) できた。だいたい60~90マス使う。思ったより通路にマスがかかる ![](https://hackmd.io/_uploads/B1_QYNQC2.png) 5マスではなく7マスにする。50~80マスになる。こっちにしよう。 ![](https://hackmd.io/_uploads/HJRex8XRn.png) グルーピングする。 1.道から間口マスを決める 2.間口マスからグルーピングするマスを伸ばしていく 3.未決定マスをバランスを見て加えていく まずは一方こうに伸ばした。 ![](https://hackmd.io/_uploads/rk_5fvQRn.png) 未決定マスをsizeの小さいAreaに加えていく。できた。 ![](https://hackmd.io/_uploads/ryzQrPXCn.png) 思ったよりいいかも。よし、グルーピングした区間(=エリア)に割当る。 動いた! ![](https://hackmd.io/_uploads/H1XC8tXA2.png) ![](https://hackmd.io/_uploads/Bk41vtQ03.png) まだ作物をあわせて割当られていないので、大きなエリアはだめ。 道を5マス到達にして細かく区切った方が点数はいい。 ![](https://hackmd.io/_uploads/rkufDFQCh.png) 作物を2つセットまでした。道は5。lossの制限を付けた ![](https://hackmd.io/_uploads/BkmcAK7Rh.png) ![](https://hackmd.io/_uploads/SyErJqQ0h.png) 道7だとこう。 ![](https://hackmd.io/_uploads/SJd9x9QC2.png) ![](https://hackmd.io/_uploads/Hk8Pf57A2.png) 思っていたより点数が厳しい。 確かにこれだと40Mに壁がありそう。 割当を局所改善できるようにする。 エリア単位での効率を求めればいい。 →大きなエリアから順に改善していく。 あー、これエリア毎にDをいくつにするかだけで決まるな。Dの次ターンに毎回全部植えちゃえばいいので。★★ →Dのラインを伸ばしたり縮めたりする局所改善ができる。 →残ったD毎の作物の数が多いDを試したほうがいい。 →そもそもエリアでDをズラしても可能だが…。 いや、どちらかというとエリア配置を奥からやって、手前に空きを作って空きマス埋めにまわす。★ 同サイズのエリアは丸ごとswapが出来るので、タイミング揃えるのに良さそう。★ 通路の末端がエリアを複数持つまで変更した方がいい。★ 巨大エリアは伸ばすのも視野。 評価 エリア毎の獲得+通路の獲得でいい。 **TODO** ~~エリアの導出~~ ~~エリアに作物を割当る~~ 割当を焼く 到達可能盤面の導出 空きマス埋め 統合エリアの導出 統合エリアへの割当を可能に(焼く) 通路の最適化 1次元配列化 空きマス埋め高度化 ## 3日目 ### 実装 10:30時点の順位表。40Mが5人いて41Mがいないのでやはり壁。 ![](https://hackmd.io/_uploads/B1RArZN03.png) ■エリア毎に割当ていく まず、エリアの大きさ毎にソートしたい。した。 エリア毎にDを貪欲に決めていく。した。 ![](https://hackmd.io/_uploads/r1_sa5NC2.png) ![](https://hackmd.io/_uploads/SJ2Tac4C3.png) しっかり上がったが、やはり上が重い。 一番最初のターンがこれ。通路埋めを考えるか。 ![](https://hackmd.io/_uploads/H1NxxsNCh.png) 最初は数が十分ないので、長いやつを入れて平均得点を上げようとするのを阻止。 ![](https://hackmd.io/_uploads/HkevUoV02.png) Kが多いケースは当然得点もいい。 使わなかった作物の分布を調べた方がいい。★ ■使わなかった作物を調べる 結構Lの短いやつが多い。 通路に割当しやすくはある。 ■通路に割当る まず、通路をオブジェクト化して、入り口から木構造にする。=統合エリア管理になる。 とりあえず最寄りのエリアにDは揃えて、置けるかを雑にやる。やった。 ![](https://hackmd.io/_uploads/HkCCzRVCh.png) →40M!思ったより伸びた。 未使用Kを確認、Lが短いのがそれなりに使われるようになった。よしよし。 seed=9がエラーだ。→初回に置く時にSが来てからおくようにしてたから。最初から置くようにして解消。 100ケースやってAve=797627.5、確実にしてから投げたい。 ブラすのをやった、が、1000ケースやるとAve=796836.275 道にDを揃えなくてもよくした。1000ケースで、Ave=798026.1。うーん。 ![](https://hackmd.io/_uploads/rkdBV1S0h.png) 道もブラすか。4~7がよさそう。 ![](https://hackmd.io/_uploads/H1x-B1SR2.png) 姑息な手で微増させとる。 1000ケース、Ave=799981.1。惜しい!! seed1、S=1、D=98のバケモンおる。 いま弾かれちゃってるので、これはいれないといけない。 初回、S=8以降をいきなり割当るのは禁止にした。 100ケース、Ave=806144.25 1000ケース、Ave=803348.475。よっし。 やっぱり通路どんだけ使えるかだなぁ。 提出、40,296,275。9位。ヨシッ! 大体100ケースと同じくらいっぽい。 ![](https://hackmd.io/_uploads/BJ90bxSCn.png) 局所改善してしっかり通路を使えるようにしよう。 どうせ時間うまく使えてないし、通路も毎回埋めちゃえばいいんじゃないかな。 ちょいちょい埋めきれないエリアあるから、Dズラして埋めるやつしよう。 **TODO** ~~エリア毎にDで割当~~ ~~使わなかった作物の分布調査~~ ~~統合エリアの導出→通路の木化~~ ~~通路に割当~~ 割当の局所改善 到達可能盤面の導出 空きマス埋め 統合エリアへの割当を可能に(焼く) 通路の最適化 1次元配列化 空きマス埋め高度化 ![](https://hackmd.io/_uploads/H1niTHr02.png) これはガッツリ通路まで使ってそう。 ■局所改善可能にする 先に、埋めきれてないエリアのために、Dズラして埋めるやつする。 現状100ケース、Ave=806045.75 だめだ悪化する。後詰めはいいけど、エリアを決めていく時にやるのがよくないのかな? ブラしている影響もありそう。とりあえず封印。 ちょっと評価おとすとよくなった。Ave=806118.75 うーん、でもブレの範囲っぽい。やっぱり封印。 ■イメージ 今回のはハノイの塔みたく、奥側の配置が必ず手前より大きい必要がある。 ![](https://hackmd.io/_uploads/rJ-M1_SCh.png) →奥のエリアを先に決めて(Dを決定)、それより小さい手前を決める。 →奥のエリアのSは、手前になるにつれ余裕ができる。それに差し込むS>DなDの集団を決めれる。 →あー、上書きしていく形がいいかも。遠目のDで大きくエリアを確保して、★ 手前のSに余裕があってロスが大きい部分は別のDで上書くでもよし、 S>DのDで別の集団を入れるもよし、効率を求めてやるで。 →余計に後ろから決めていったらいい。★ →となるとビームっぽく見える? →焼けたほうが強いので焼く方式で、ダメなら切り替える 道の深さ順にやればいいかなと思ったが、量の方が大事。 パス毎に区切る。パスが抱える量の大きな所からやる。 道が統合する所は、下位が出揃ってから。 →めちゃLの長いやつはどうする? 密度で最適化する。序盤はLが長くなりようがない。 うーん、道の統合エリア毎やるのは、visualizer見てると微妙に思えてきた。 だいたい一つのDが50個程度しかない。そのうちLが近いのは30個くらい。 道毎にやるのは微妙。それよりは局所改善で道の通らない期間を揃えた方が良さそう。 ■道のセットに不備があったのと、ブラし方変えたら改善したのでちょっと投げる。 100ケース、Ave=809326.5 予想どおりの点数。壁間近。 ![](https://hackmd.io/_uploads/SyhfTWIA3.png) 改めて局所改善を。 各エリアのDを前後させる。 前:20ケース、Ave=808216.25 どう局所改善にする? 各エリア毎にDを決めて貪欲に当てはめていけば点数を出せる。 差分にできる? →Dで決まるので、変化したDのとこだけ点数を出し直せばいい。 ブレなしで20ケース、Ave=807142.5 うーん、できたけど悪化する。エリアだけの改善はできてるんだけど通路が悪くなる? Ave=803467.5 別のバグつぶした。通路の合流がおかしかった。 ブレなしで20ケース、Ave=808258.75 山登り入れると   Ave=804591.25 あ、変化が大きすぎたからっぽい。 変化の幅を1にしたら Ave=808803.75 とはいえほとんど改善しない。 これ、通路も一緒に評価できないかなぁ。した。 やはりあがる。20ケース、Ave=813262.5 あれ、seed4でエラー、途中で該当の作物がなくなるからだった。解消。 100ケース、Ave=810152.0 単純高速化じゃだめそう。 20ケース。Ave=813331.25 10倍まわして(20s)、Ave=813747.5 通路用にいい作物を残すため、入口近くのエリアは後で割当てるで良さそう。 また、残った作物でベストなのを見つければ良いので、最後に算出するとか。★ 一方、通路がうまりそうな奥のエリアは、初回の貪欲時から通路のDを評価に加えるべき。★ 変化の結果、影響を受けたエリアは貪欲し直しでもいいかも。 あれ?通路うめって、D完全一致のままかな? そこ柔軟にしておきたい。 **TODO** ~~割当の局所改善~~ 到達可能盤面の導出 空きマス埋め 統合エリアへの割当を可能に(焼く) 通路の最適化 1次元配列化 空きマス埋め高度化 ## 5日目 ### 実装 10:00時点の順位表。43.5Mか。。。17位に落ちた。 ![](https://hackmd.io/_uploads/HJFmbsLA2.png) 局所改善するにもベースがあまりにも弱そう。 通路のlimitを6→5にしたらあがった。通路考慮ができるようになったからかな。 20ケース、Ave=811195.0 2s回したら、Ave=815070.0、#100、Ave=812225.0 お、意味ありそうになってきた。 例えばseed=0の1ターン目、2マスをD=3,4あたりの短いので埋めたがために通路に置けない。 ![](https://hackmd.io/_uploads/SyKEKs8A2.png) 貪欲通路評価する。 あー、以前奥側から貪欲して上手く行かなかったのは、貪欲するとLが短期の方がスコア効率が良くなりがちだからか。 した。Ave=818352.5、いいじゃん。 100ケース、Ave=815728.25。 これを詰めていって41Mは見えるな。 3sまわして20ケース、Ave=822046.25。 30sまわして、Ave=822640.0これはあんまかわらん。 あれ、通路limit5→2でまだあがった。Ave=821616.25 やはり部屋は細かく割るのが大事そう。かなり小分けにされた。 ![](https://hackmd.io/_uploads/HJRHkR8A2.png) 部屋のソートを深さ=サイズの湯鮮度でさらにあがった。Ave=824297.5 通路limit2→3、Ave=824311.25 100ケース、Ave=820593.75 3sまわしで、Ave=826385.25、いいじゃん。 3sまわし、20ケースはAve=830273.75。 パラメータ調整、#20、Ave=825102.5 3sまわし、#20、Ave=830856.25 #20、Ave=825165.0 同サイズのエリアswapやる。 あれ、微減する。 0.3sだと、#20、Ave=824517.5 #100、Ave=820340.25 3sまわしだとちゃんとあがる。#20、Ave=831150.0、#100Ave=827164.0 そろそろ真面目に差分更新するかぁ。 ■差分更新 差分を取るには、エリア毎にどの作物(SDだけ保持)をいくつ植えるかを覚えておく。 →植えるタイミングは不要。直前のDの後なので。場所も奥から置くだけ。 貪欲に取るわけじゃないので、再貪欲したら結果は変わりそう。 →まぁいいでしょう。通路はややこしそうなので、通路は全実行でまずはやる。 今の実行時間がこれ。 ![](https://hackmd.io/_uploads/HJRbZXPCh.png) あ、だめだ差分にならない、新規にgreedyをすると戻しもやらないといけない。 戻しがややこしすぎる。greedyは諦めて単純に残りの作物から選ぶようにする。 となると、作物残数管理が必要。 一旦swapを切る #20、Ave=824462.5 10倍回してこれ。早くはなってないな。。。 ![](https://hackmd.io/_uploads/SJApgLw02.png) やはり道の処理を全部やり直すのが重い? →重い。道を切れると1/6になった。 道の評価をどう絞るか →対象エリアの間口からその親のみ変更すればいい →対象の期間内に絡む作物を削除し、期間内だけcheckする。 →これだとダメ。作物の量変わっている。 →やはり対象期間の全道をcheckだ。 実は今はループ中のスコアと最終スコアが一致していない。 ブレはあるが、平均して最終スコアの方がいいのでよし。 (やはりDだけ気をつければいいゲーム) →道の暫定評価が微妙。単純にDが増えると減点だけど、幅の長さで評価できないか? →微妙。今は新規にDを潰したら-0.3で統一してる。 →となりにフラグがあるならまだよくない? いろいろ道のDまわりを調整した。 #20、Ave=832032.5 #100、Ave=827601.5 #1000、Ave=825755.25 2sまわしで #20、Ave=834787.5 #100、Ave=830285.75 結構あがるなぁ。局所改善がイマイチな部分はあるけど、結構パラメータゲー? swapもどせるか? #20、Ave=831836.25 #100、Ave=827548.5 2sまわし #20、Ave=834740.0 →貪欲がよくなったのでswap微妙になった。封印。 あ、道におく対象のうち、得点向上が見込めないなら途中でbreakで4倍くらい早くなった。 1sまわし(本番相当) #20、Ave=835380.0 #100、Ave=831034.0 5sまわしで#20,Ave=835781.25 40sまわしで#20、Ave=835781.25 うーん、いまいち。高速化じゃない。 TODOの整理 ・高速化系はやらないでよさそう。 ・エリアのcheck順は深さじゃなく抱えている子供マスの数に ・Lの長いやつを期間またがって植えるの、貪欲時に組み込めそう ・道やエリアの作り方は見直した方がいい。 現状、#20、Ave=834577.5 ・道を近い順に引いたAve=834690.0 ・初期エリアは4までに制限、#100、Ave=831186.0、#20、Ave=835235.0 ・抱えている子供マスに応じて、悪化したので封印。 ![](https://hackmd.io/_uploads/Bkr45cDA2.png) 提出 ![](https://hackmd.io/_uploads/rJeIj9v02.png) 1sまわし #100、Ave=831947.25 なので、ちょっと上ブレっぽい。 ■手前のエリアのフリー化をやるか 手前は最後にいれるようにする。手前判定したところの道はおかない。 手前合計100マスくらいかな。最長路だけ対象にする。分岐先を巻き込まない。 →悪化した #10000、Ave=827620.105、全てOK。 **TODO** ~~貪欲時に通路評価~~ ~~同サイズのエリアswap~~ ~~差分更新(高速化)~~ ~~手前のエリアは後から決める(道を優先)~~ 到達可能盤面の導出 空きマス埋め 統合エリアへの割当を可能に(焼く) 1次元配列化 空きマス埋め高度化 ## 6日目 ### 実装 10:30時点の順位表。ついに44Mが。流石に9位のまま。 ![](https://hackmd.io/_uploads/rJIWFedC3.png) 貪欲時のDのタイミング、手前のやつら安定を子供マスの数で切る。 →#20、Ave=835412.5、微増したので採用 #100、Ave=831187.25、本当に微増。 ■期間またぎやる この右端のやつらを使いたい。seed=0(赤が未使用) ![](https://hackmd.io/_uploads/SJRzszuAh.png) やはりLが伸びると使用率が下がる。 これはseed=1、Kが多いとLが少し長め(16辺り)を使って割当効率を高めているのがよくわかる。 ![](https://hackmd.io/_uploads/S1bhjMuAh.png) →やはりLが長いやつを優先して使うのが大事。 まずは最後のセットのところから 意外と面倒かも。Dでソートして後ろから植える。 残管理が必要。エリアをマスを頭から順に何ターンで収穫されるかを管理して、取り除くシミュレートをする。 →長いL同士が交差すると不可になる。またぎ禁止のDを管理する。 適用したが下がった。 Ave=828401.25 下がり方が微妙で困る。 貪欲でcheck もとがこれ、Ave=830116.25 (結構すごいな) いれるとこれ、Ave=822245.0 バグってた。これ。Ave=829651.25 ル-プまわして、#20、Ave=834878.75 #100、Ave=830676.25 やはり悪化する。 あ、バッファもたせるといいかも。ただ、1作物を14ポイントとして評価してる。やりすぎに思えるがなぜ? →メインのターン数がこのあたりだから?まるまるひとつはまらないなら入れる、くらいになってそう。 #20、Ave=835440.0 #100、Ave=831225.5 100ケースまわすと微増、採用する。 今は最長の1作物しか見てないので、ベストを見る。 1sまわし#20 またぎ有り:Ave=836016.25 またぎ無し:Ave=836127.5 かなしい 1作物14ポイントのバッファ、そこまでつけるとそもそも使われてない。 ■道の改善 seed=12、こういうのがいけない ![](https://hackmd.io/_uploads/B1IOuc_Cn.png) きれいになった ![](https://hackmd.io/_uploads/rkuXZ6d02.png) #20、Ave=835503.75 #100、Ave=831355.25 #1000、Ave=829567.125 着実にあがっていいね。 うーん、ネタが空振った。まずい。 seed=6、873,125の高得点盤面。やはり道まできっちり埋まってる。 ![](https://hackmd.io/_uploads/rJ-6Xa_Rh.png) 道に短時間のを割り当てている。エリアは多少無理してもLの大きいのを持つのが大事そう。 ちょっとパラメータ調整 #20 Ave=835615.0 #100 Ave=831378.5 期間またぎ、バッファ2ポイントで微増した。 #100、Ave=831387.5 1s #20Ave=836486.25 #100Ave=832234.25 swapも復活で微増 #20Ave=836727.5 #100Ave=832726.75 ちょっとループ回数が減ってる。10,000回まわらないくらい。 基準のループ回数3,000回に落とす。 #20、Ave=834787.5 #100、Ave=830533.75 ちょっと高速化した。10,000回はだいたいまわる。 1s #20、Ave=837121.25 2sまわしでこれ。ちょっと高速化の意味出てきた #20、Ave=837760.0 基準のループ回数5,000回にもどす。 #20、Ave=835521.25、swap-OFF、Ave=835717.5 #100、Ave=831530.25 swapありだと、ループ回数が必要だがswap会ったほうが伸びるのでこれで。 1s、swap-OFF、#20、Ave=836586.25 1s #100、Ave=833047.75 #1000、Ave=829717.9 うーん、全然のびない。 やっぱり期間またぎが悪い? ![](https://hackmd.io/_uploads/Bk7L-ZFR3.png) ちょっと別seedでパラメータみるか。 seed=10000~ #100、Ave=828068.75 OFF、 Ave=828008.75 いちおう有りの方がよさそう Ave=828100.0 Ave=828121.5 ■到達可能盤面だす 後詰めだが多少上がるので 道の通り具合を全部出したらいい。した。 **TODO** ~~期間またぎの植え~~ ~~通路の最適化~~ 到達可能盤面の導出 空きマス埋め 空きマス埋め高度化 ## 7日目 今日から京都旅行なので触れない。 あああ!先に通路を間隔の狭い作物で埋めて、そのサイクルにハマる作物しか置かないのが強そう。 割当を貪欲にして、サイクルを局所改善する。 絶対これやん。期間またぎもバッチリはまる。 通路にサイクルはあるけど、割当はエリアからやる。 空きマス埋めはどの道有効だなぁ。いやでもやるなら攻めだな。 ■通路サイクル そもそもエリア内も通路と同じくツリー化したら便利。 Lの長いやつからバンバン割当てる。 通路のサイクルをどう設定するか? ん?そんな大層なことしなくても、Dの後からエリア奥に割当てるでいいんじゃないか? エリア内ツリー化によりLの長いやつを貪欲に当てはめられるのが良くて、通路はこれまで通りでいい。 前からやった時のまたぎはが決まるのがよくなさそう。Dだけで管理するんだから、貪欲も素直にそうする。 となると現実味出て来た。とりあえず移動は睡眠確保。 京都なう。 うーん、Dを後から割当てる、では微妙かも? 自由度が高過ぎる。 道側から強制的に空ける、は大事そうなんだよな。 道を先に貪欲に決めてみるか。 となると、閉じてる期間を子供に伝搬させるのがいる。 道を埋める期間はどうする? あるラインから先の道を対象に、短期間に高密度で割当てられるところを探る。 あとは道側を局所改善。 期間またぎでいまいち点数が伸びないの、他が期間またぎ前提のを奪ってる問題がある。 やはり後ろから割当てをまずやってみるのがよさそう。 ## 8日目ラスト 16位、意外と耐えてる。 6時に起きて、妻を置いてカフェに行く。 やりたいこと 後ろDから割当て 後詰め 通路側の植える期間を指定 後ろDからが魅力的過ぎる。期間またぎが空振っているので。 後詰めをまずはやる。折角時間取ったので着実に上げる。 まずは後詰め 意外とない。SをD+1に詰めてるからな。 とりあえずエリアの先頭に入れるのはできた。 うわ、期間またぎのバグある。 この解消に苦戦してじかんぎれかな。 #20, 835957.5、ちゃんとあがった。 #100、831888.5 うわ、ちゃんとあがる。 #100、833042.75 詰めておわる。 600シード、早回しで大丈夫。 提出、微増。今20位。 システス対策にはなったくらい。 あとは観光なので終わり。 うーん、順当に実装していったが金夜で無理に小さい改善を頑張ってしまったのが敗因。 そこで通路優先に気付けてたら戦えたかも。 最初に気付けていないのでだめだなぁ。 制約の多い方を後でねじ込むより、制約のキツい側を操作してゆるい側が合わせていくの、典型テクだった。 暫定27位で終了。 ## 反省 やはり通路を焼くので良さそう。 上位は雷が落ちたみたいに色んなルートで通路が空いてた。 システス1人抜かれて2人落ちたので、26位。 無理にでも朝やっといて良かった。