TopCoder Open 2011 Round 2 by chokudai

20
TCO11MMR2 慶慶慶慶慶慶慶慶慶 慶慶慶慶慶慶慶慶慶 慶慶 慶慶

description

TopCoder Open 2011 Round 2 by chokudai

Transcript of TopCoder Open 2011 Round 2 by chokudai

Page 1: TopCoder Open 2011 Round 2 by chokudai

TCO11MMR2

慶應義塾大学大学院 政策メディア研究科1年 高橋 直大

Page 2: TopCoder Open 2011 Round 2 by chokudai

多角形分割問題 点の集合を、  

 正多角形に十分近い多角形に分割する

Page 3: TopCoder Open 2011 Round 2 by chokudai

多角形分割問題 与えられる点の個数 n は、 50 ~ 5000

点はランダムで与えられ、 x,y 座標は 0 ~ 700 にランダム 分割後に得られるスコアは、 k 角形が Ak 個あるとして、

Σk*k*Ak で表わされる 単純に言えば、k角形に属している点はk点入る

多角形は正多角形に近い形でなければならない。 要求される条件は以下の通り

生成される多角形は、凸多角形でなくてはならない。 ( 最短の辺の長さ / 最長の辺の長さ ) が、 (100-SideDiff)% 以上

SideDiff は、 1 ~ 20 でランダムに与えられる変数である。 中心点からの距離の ( 最短長 / 最長長 ) が、 (100-radiiDiff)% 以上

radiiDiff は, 1 ~ 20 でランダムに与えられる変数である。

Page 4: TopCoder Open 2011 Round 2 by chokudai

制約条件の確認 中心点は算術平均

単純に足して割るだけ SideDiff と radiiDiff

sideDiff 黒い線の最大誤差

radiiDiff 青い線の最大誤差

凸性の条件 内角が 180 度未満

Page 5: TopCoder Open 2011 Round 2 by chokudai

戦略 可能な限り大きい多角形から貪欲で作る

小さいのを作った後、小さいのを崩して大きいのを作るのは、無駄な部分が多く、効率が悪い。

厳密にやるなら、乱択アルゴリズム等で出来るが、実行時間の制約上難しい 今回は、多角形を列挙するための十分な時間がないので割愛

小さい多角形のみ焼きなまし 小さい多角形は生成が簡単

貪欲でなく、焼きなまし法を用いて最適化を行う 列挙は制約上無理なので、最大独立集合はここでも相性は悪い

Page 6: TopCoder Open 2011 Round 2 by chokudai

多角形の生成方法 ある2点を選び、何角形を作るか決める 2点から中心点を決定し、点が存在するべき場所を

算出する。 点が存在するべき場所から、もっとも近い点を選ぶ。 その点の集合が、多角形の条件を満たしていればO

実行時間に余裕がある small case では、もうちょっときちんと探索を行う。

Page 7: TopCoder Open 2011 Round 2 by chokudai

多角形の生成方法 2点を選ぶ

工夫するポイント 長い辺を優先的

に選ぶ 長い辺の方が生

成確率が上がる

Page 8: TopCoder Open 2011 Round 2 by chokudai

多角形の生成方法 中心点の設定

工夫するポイント Small case で、

中心点をずらしてあげる

Page 9: TopCoder Open 2011 Round 2 by chokudai

多角形の生成方法 点の場所予測

工夫するポイント Small case では、

円を少しずつずらしてあげる

Page 10: TopCoder Open 2011 Round 2 by chokudai

多角形の生成方法 一番近い点を

取っていく

工夫するポイント 適当なグリッド

に区切って、探索範囲を狭める!

sideDiff の制約を満たせなくなったら即break

Page 11: TopCoder Open 2011 Round 2 by chokudai

厳密な探索をしない理由 radiiDiff の制約の問題

予測中心点が動いてしまう 枝刈り誤爆が発生しやすい

計算時間の問題 動的計画法を用いても、速度的に話にならない 最良1ケースのみで探索→失敗時戻る 程度が限界?

実際は、前述の説明よりほんの少しきちんと探索 非常に緩やかな枝刈りを用いて、生成確率を向上

Page 12: TopCoder Open 2011 Round 2 by chokudai

多角形の生成基準 出来るだけ頂点数の多い多角形を作りたい! 頂点数を増やせば増やすほど、生成確率は落ちる。

各頂点が、何角形まで作成可能かを予測する関数を作る

Page 13: TopCoder Open 2011 Round 2 by chokudai

予測関数の作成 各々の辺に対して、「最大何角形まで作れるか」の

予測を行う!

使う指標は以下の2つ 基準とする円が、正方形の中に納まっているか? 多角形の生成可能確率が十分に高いか?

Page 14: TopCoder Open 2011 Round 2 by chokudai

予測関数その1:枠内に収まるか? 左図角 θ を決める

と、円が決定される。

枠に収まる範囲は、容易に決定できる。

数式は割愛するが、Asin 等を使えばOK

若干余裕を持たせてあげるべき

Page 15: TopCoder Open 2011 Round 2 by chokudai

予測関数その2:生成確率は十分高い? sideDiff の制約

を青の円で表示 radiiDiff の制約

を赤の円で表示 上記より、斜線

部が条件を満たす箇所

これを長方形近似する

Page 16: TopCoder Open 2011 Round 2 by chokudai

予測関数その2:生成確率は十分高い? 長方形の面積を

求めよう! 赤辺は、

半径 *radiiDiff/100

青辺は、 辺長 *sideDiff/

100 よって、この積

が面積の近似値

Page 17: TopCoder Open 2011 Round 2 by chokudai

予測関数その2:生成確率は十分高い? 一辺の長さを d 、生成目標頂点数を t とする。 前述斜線部の面積の近似値 S は、  ただし sD=sideDiff rd=radiiDiff 適当な1点が、面積 S 内に入っている確率 p1 は、

頂点数 n として、面積 S 内に点が1つ以上ある確率p2 は、

Page 18: TopCoder Open 2011 Round 2 by chokudai

予測関数その2:生成確率は十分高い? これが全ての頂点に対して見つかる確率 p3 は、

この P3 が、確率 p 以上になる t の境界が求まれば、生成確率 p 以上の多角形のみ探索することが出来る。 これは、辺の長さ d のみに依存する。 t の上限は、妥当な p を設定した時、高々 50 程度

よって、二分探索等で適当に範囲を求めれば十分。

Page 19: TopCoder Open 2011 Round 2 by chokudai

参考画像:大きなケース 頂点数:

4654 SideDiff :

20 RadiiDiff :

18

Page 20: TopCoder Open 2011 Round 2 by chokudai

参考画像:大きなケース Score: 65554 Score/頂

点 :14.0855 32角形 1個  31角形 2個 30角形 1個  29角形 3個 28角形 3個  27角形 1個 26角形 8個  25角形 5個 24角形 7個  23角形 5個 22角形 7個  21角形 8個 20角形 5個  19角形 5個 18角形 8個  17角形 14個 16角形 4個  15角形 10個 14角形 8個  13角形 17個 12角形 18個  11角形 15個 10角形 18個  9角形 18個 8角形 30個  7角形 36個 6角形 29個  5角形 43個 4角形 109個 3角形 54個