SlideShare a Scribd company logo
1 of 20
TCO11MMR2
慶應義塾大学大学院 政策メディア研究科1年 高橋 直大
多角形分割問題
 点の集合を、
正多角形に十分近
い多角形に分割す
る
多角形分割問題
 与えられる点の個数nは、50~5000
 点はランダムで与えられ、x,y座標は0~700にランダム
 分割後に得られるスコアは、k角形がAk個あるとして、
 Σk*k*Akで表わされる
 単純に言えば、k角形に属している点はk点入る
 多角形は正多角形に近い形でなければならない。
 要求される条件は以下の通り
 生成される多角形は、凸多角形でなくてはならない。
 (最短の辺の長さ/最長の辺の長さ)が、(100-SideDiff)%以上
 SideDiffは、1~20でランダムに与えられる変数である。
 中心点からの距離の(最短長/最長長)が、(100-radiiDiff)%以上
 radiiDiffは,1~20でランダムに与えられる変数である。
制約条件の確認
 中心点は算術平均
 単純に足して割るだけ
 SideDiffとradiiDiff
 sideDiff
 黒い線の最大誤差
 radiiDiff
 青い線の最大誤差
 凸性の条件
 内角が180度未満
戦略
 可能な限り大きい多角形から貪欲で作る
 小さいのを作った後、小さいのを崩して大きいのを作るのは、
無駄な部分が多く、効率が悪い。
 厳密にやるなら、乱択アルゴリズム等で出来るが、実行時間
の制約上難しい
 今回は、多角形を列挙するための十分な時間がないので割愛
 小さい多角形のみ焼きなまし
 小さい多角形は生成が簡単
 貪欲でなく、焼きなまし法を用いて最適化を行う
 列挙は制約上無理なので、最大独立集合はここでも相性は悪い
多角形の生成方法
 ある2点を選び、何角形を作るか決める
 2点から中心点を決定し、点が存在するべき場所を算出
する。
 点が存在するべき場所から、もっとも近い点を選ぶ。
 その点の集合が、多角形の条件を満たしていればOK
 実行時間に余裕があるsmall caseでは、もうちょっときち
んと探索を行う。
多角形の生成方法
 2点を選ぶ
 工夫するポイント
 長い辺を優先的
に選ぶ
 長い辺の方が生
成確率が上がる
多角形の生成方法
 中心点の設定
 工夫するポイント
 Small caseで、中心
点をずらしてあげる
多角形の生成方法
 点の場所予測
 工夫するポイント
 Small caseでは、円
を少しずつずらして
あげる
多角形の生成方法
 一番近い点を
取っていく
 工夫するポイント
 適当なグリッドに
区切って、探索範
囲を狭める!
 sideDiffの制約を
満たせなくなった
ら即break
厳密な探索をしない理由
 radiiDiffの制約の問題
 予測中心点が動いてしまう
 枝刈り誤爆が発生しやすい
 計算時間の問題
 動的計画法を用いても、速度的に話にならない
 最良1ケースのみで探索→失敗時戻る 程度が限界?
 実際は、前述の説明よりほんの少しきちんと探索
 非常に緩やかな枝刈りを用いて、生成確率を向上
多角形の生成基準
 出来るだけ頂点数の多い多角形を作りたい!
 頂点数を増やせば増やすほど、生成確率は落ちる。
 各頂点が、何角形まで作成可能かを予測する関数
を作る
予測関数の作成
 各々の辺に対して、「最大何角形まで作れるか」の予測
を行う!
 使う指標は以下の2つ
 基準とする円が、正方形の中に納まっているか?
 多角形の生成可能確率が十分に高いか?
予測関数その1:枠内に収まるか?
 左図角θを決めると、
円が決定される。
 枠に収まる範囲は、
容易に決定できる。
 数式は割愛するが、
Asin等を使えばOK
 若干余裕を持たせ
てあげるべき
予測関数その2:生成確率は十分高い?
 sideDiffの制約を
青の円で表示
 radiiDiffの制約を
赤の円で表示
 上記より、斜線部
が条件を満たす
箇所
 これを長方形近
似する
予測関数その2:生成確率は十分高い?
 長方形の面積を
求めよう!
 赤辺は、
 半径*radiiDiff/100
 青辺は、
 辺長*sideDiff/100
 よって、この積が
面積の近似値
予測関数その2:生成確率は十分高い?
 一辺の長さをd、生成目標頂点数をtとする。
 前述斜線部の面積の近似値Sは、
 𝑆 =
𝑑2∗𝑠𝐷 ∗𝑟𝐷
sin
𝜋
𝑡
∗10000
ただしsD=sideDiff rd=radiiDiff
 適当な1点が、面積S内に入っている確率p1は、
 𝑃1 =
𝑆
7002 =
𝑑2∗𝑠𝐷 ∗𝑟𝐷
sin
𝜋
𝑡
∗7 ∗108
 頂点数nとして、面積S内に点が1つ以上ある確率p2は、
 𝑃2 = 1 − 1 − 𝑃1
𝑛
= 1 − 1 −
𝑑2∗𝑠𝐷 ∗𝑟𝐷
sin
𝜋
𝑡
∗7 ∗108
𝑛
予測関数その2:生成確率は十分高い?
 これが全ての頂点に対して見つかる確率p3は、
 𝑃3 = 𝑃2
𝑡−2
= 1 − 1 −
𝑑2∗𝑠𝐷 ∗𝑟𝐷
sin
𝜋
𝑡
∗7 ∗108
𝑛 𝑡−2
 このP3が、確率p以上になるtの境界が求まれば、生成
確率p以上の多角形のみ探索することが出来る。
 これは、辺の長さdのみに依存する。
 tの上限は、妥当なpを設定した時、高々50程度
 よって、二分探索等で適当に範囲を求めれば十分。
参考画像:大きなケース
 頂点数:4654
 SideDiff : 20
 RadiiDiff : 18
参考画像:大きなケース
 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個

More Related Content

More from AtCoder Inc.

Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Inc.
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説AtCoder Inc.
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Inc.
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説AtCoder Inc.
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Inc.
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説AtCoder Inc.
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Inc.
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説AtCoder Inc.
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Inc.
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Inc.
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Inc.
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説AtCoder Inc.
 

More from AtCoder Inc. (20)

Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
arc047
arc047arc047
arc047
 
abc032
abc032abc032
abc032
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
abc031
abc031abc031
abc031
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説
 

TopCoder Open 2011 Round 2 by chokudai