SlideShare a Scribd company logo
1 of 73
2015 Topcoder Open
Marathon Match
Round1 ~SmallPolygons~
@threepipes_s 解法
問題概要
 2次元平面上にいくつかの整数座標頂点と整数 N が与えられる.
 多角形の最大数を N として,面積の合計をできる限り小さくせよ.
 与えられた頂点をすべて使うこと
 頂点は必ず1つの多角形に属すこと
 辺同士は交差しないこと
N=2
最終出力(1)
N = 17, 頂点995 N = 12, 頂点140
同じ色のものは1つの多角形
最終出力(2)
N = 14, 頂点21 N = 2, 頂点1398
同じ色のものは1つの多角形
最終出力(3)
N = 3, 頂点92 N = 15, 頂点27
同じ色のものは1つの多角形
今回の取り組み
 多角形上での頂点の入れ替えによる面積縮小
 頂点集合をNより大きく分割して多角形を作った後,多角形がN個にな
るまで統合
 生成した多角形がN個未満なら,N個になるまで分割
 もしくは分割できなくなるまで
 ほかの多角形とも頂点をやりとりし,面積縮小
 上記を何パターンか行い,面積がもっとも小さかったものを採用
クラスタリング
 とりあえず点集合をN個に分けてみる
 K-means法 でクラスタリング
 参考-“ http://tech.nitoyon.com/ja/blog/2013/11/07/k-means/”
毎回うまくいくわけではないが,
(特に頂点数が分割数に対して小さいとき)
何度か試してうまくいったものを採用
以降はクラスタごとに考える
(他のクラスタの辺と交差することはない)
多角形を作ってみる
 凸包 (蟻本を参考に)作成
 凸包で使っていない頂点を左から順に巻き込んでいく感じ(?)
多角形を作ってみる
 凸包 (蟻本を参考に)作成
 凸包で使っていない頂点を左から順に巻き込んでいく感じ(?)
1. 凸包作成
多角形を作ってみる
 凸包 (蟻本を参考に)作成
 凸包で使っていない頂点を左から順に巻き込んでいく感じ(?)
1. 凸包作成
2. 凸包上側を作る辺でまだ使ってい
ない辺をx座標の小さい方から取り込
む
多角形を作ってみる
 凸包 (蟻本を参考に)作成
 凸包で使っていない頂点を左から順に巻き込んでいく感じ(?)
1. 凸包作成
2. 凸包上側を作る辺でまだ使ってい
ない辺をx座標の小さい方から取り込
む
多角形を作ってみる
 凸包 (蟻本を参考に)作成
 凸包で使っていない頂点を左から順に巻き込んでいく感じ(?)
1. 凸包作成
2. 凸包上側を作る辺でまだ使ってい
ない辺をx座標の小さい方から取り込
む
多角形を作ってみる
 凸包 (蟻本を参考に)作成
 凸包で使っていない頂点を左から順に巻き込んでいく感じ(?)
1. 凸包作成
2. 凸包上側を作る辺でまだ使ってい
ない辺をx座標の小さい方から取り込
む
多角形を作ってみる
 凸包 (蟻本を参考に)作成
 凸包で使っていない頂点を左から順に巻き込んでいく感じ(?)
1. 凸包作成
2. 凸包上側を作る辺でまだ使ってい
ない辺をx座標の小さい方から取り込
む
3. 完成!
今回の取り組み
 多角形上での頂点の入れ替えによる面積縮小
 頂点集合をNより大きく分割して多角形を作った後,多角形がN個にな
るまで統合
 生成した多角形がN個未満なら,N個になるまで分割
 もしくは分割できなくなるまで
 ほかの多角形とも頂点をやりとりし,面積縮小
 上記を何パターンか行い,面積がもっとも小さかったものを採用
方針:面積を小さくする
 よく見ると,入れ替えたら面積が小さくなりそうな場所がある
 入れ替えてみよう
注目!
方針:面積を小さくする
 よく見ると,入れ替えたら面積が小さくなりそうな場所がある
 入れ替えてみよう
注目!
方針:面積を小さくする
 よく見ると,入れ替えたら面積が小さくなりそうな場所がある
 入れ替えてみよう
注目!
B
A
Aの面積(現在へこませてる)
より,
Bの面積(新たにへこませる)
が大きい場合,
交換によって面積を小さくできる
方針:面積を小さくする
 外側 (膨らませてる方?) も同様に交換できる
方針:面積を小さくする
 外側 (膨らませてる方?) も同様に交換できる
方針:面積を小さくする
 外側 (膨らませてる方?) も同様に交換できる
方針:面積を小さくする
 外側 (膨らませてる方?) も同様に交換できる
B
A
先ほどとは逆に,
Aの面積(現在膨らませてる)
より,
Bの面積(新たに膨らませる)
が小さい場合,
交換によって面積を小さくできる
ここまでの方針適用
 割とうまくいってる
 (注意:今までの説明とは上下反転してます)
ここまでの方針適用
 うまくいってる…?
N = 13, 頂点1084
ここまでの方針適用
 うわあああ
N = 2, 頂点1398
今回の取り組み
 多角形上での頂点の入れ替えによる面積縮小
 頂点集合をNより大きく分割して多角形を作った後,多角形がN個にな
るまで統合
 生成した多角形がN個未満なら,N個になるまで分割
 もしくは分割できなくなるまで
 ほかの多角形とも頂点をやりとりし,面積縮小
 上記を何パターンか行い,面積がもっとも小さかったものを採用
問題点
 Nが小さくて頂点が大きいとき,ほとんど縮小が行われない
 クラスタ内の頂点が多すぎる
 辺と点の交換は,処理時間の関係でランダムに選ばれるが,頂点が多いと交換可能
なペアへのヒット率が悪い.
 縦に長くなっていて,交換を妨げている.
問題点
 Nが小さくて頂点が大きいとき,ほとんど縮小が行われない
 クラスタ内の頂点が多すぎる
 辺と点の交換は,処理時間の関係でランダムに選ばれるが,頂点が多いと交換可能
なペアへのヒット率が悪い.
 縦に長くなっていて,交換を妨げている.
初期分配が悪い
方針:Nを気にせず分割してみる
 クラスタあたりの頂点が減り,面積の縮小は十分に行われる
 これをN個の多角形(下の図ではN=2)に統合できるかが問題
 案①:最初からクラスタの結合箇所を決めておく
 案②:面積を縮小した後に結合箇所を探す
方針:Nを気にせず分割してみる
 クラスタあたりの頂点が減り,面積の縮小は十分に行われる
 これをN個の多角形(下の図ではN=2)に統合できるかが問題
 案①:最初からクラスタの結合箇所を決めておく
 案②:面積を縮小した後に結合箇所を探す 採用!
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性も等しくしたい
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性も等しくしたい
重心を基準に角度でソート
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性も等しくしたい
重心
重心を基準に角度でソート
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性も等しくしたい
重心
重心を基準に角度でソート
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性も等しくしたい
重心
重心を基準に角度でソート
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性も等しくしたい
重心
重心を基準に角度でソート
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性も等しくしたい
重心
重心を基準に角度でソート
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性も等しくしたい
重心
重心を基準に角度でソート
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性もできるだけ等しく
したい
重心
重心を基準に角度でソート
方針:初期多角形の変更
 これまでの方針だと,かなり非対称な図形が出来上がる可能性が高い
 クラスタの結合を行うため,360度どの方向の結合可能性もできるだけ等しく
したい
重心を基準に角度でソート
重心
凸包作るよりはるかに楽だった…
方針:クラスタの結合
 隣接しているクラスタなら結合できそうだけど,隣接の定義は?
 クラスタ間の距離:重心同士の距離で定義
 あるクラスタからもっとも近いクラスタは隣接しているとして,
その距離の1.4倍以内なら(だいたい)隣接クラスタである,という試行結果
方針:クラスタの結合
 隣接しているクラスタなら結合できそうだけど,隣接の定義は?
 クラスタ間の距離:重心同士の距離で定義
 あるクラスタからもっとも近いクラスタは隣接しているとして,
その距離の1.4倍以内なら(だいたい)隣接クラスタである,という試行結果
1
方針:クラスタの結合
 隣接しているクラスタなら結合できそうだけど,隣接の定義は?
 クラスタ間の距離:重心同士の距離で定義
 あるクラスタからもっとも近いクラスタは隣接しているとして,
その距離の1.4倍以内なら(だいたい)隣接クラスタである,という試行結果
1
隣接
方針:クラスタの結合
 隣接しているクラスタなら結合できそうだけど,隣接の定義は?
 クラスタ間の距離:重心同士の距離で定義
 あるクラスタからもっとも近いクラスタは隣接しているとして,
その距離の1.4倍以内なら(だいたい)隣接クラスタである,という試行結果
1
隣接
1.4
隣接
方針:クラスタの結合
 隣接しているクラスタなら結合できそうだけど,隣接の定義は?
 クラスタ間の距離:重心同士の距離で定義
 あるクラスタからもっとも近いクラスタは隣接しているとして,
その距離の1.4倍以内なら(だいたい)隣接クラスタである,という試行結果
1
隣接
1.4
隣接
1.6
方針:クラスタの結合
 隣接しているクラスタなら結合できそうだけど,隣接の定義は?
 クラスタ間の距離:重心同士の距離で定義
 あるクラスタからもっとも近いクラスタは隣接しているとして,
その距離の1.4倍以内なら(だいたい)隣接クラスタである,という試行結果
1
隣接
1.4
隣接
1.6
隣接でない!
と判断
方針:クラスタの結合
 隣接クラスタ同士で辺のペアを調べ,結合できるか確認
 結合に必要な面積がもっとも小さい辺のペアを,クラスタの結合コストとする
 1度採用された辺は,ほかのクラスタとの結合には使わない
方針:クラスタの結合
 隣接クラスタ同士で辺のペアを調べ,結合できるか確認
 結合に必要な面積がもっとも小さい辺のペアを,クラスタの結合コストとする
 1度採用された辺は,ほかのクラスタとの結合には使わない
1. 結合できる辺を探す
方針:クラスタの結合
 隣接クラスタ同士で辺のペアを調べ,結合できるか確認
 結合に必要な面積がもっとも小さい辺のペアを,クラスタの結合コストとする
 1度採用された辺は,ほかのクラスタとの結合には使わない
1. 結合できる辺を探す
方針:クラスタの結合
 隣接クラスタ同士で辺のペアを調べ,結合できるか確認
 結合に必要な面積がもっとも小さい辺のペアを,クラスタの結合コストとする
 1度採用された辺は,ほかのクラスタとの結合には使わない
1. 結合できる辺を探す
2. もっとも面積が小さくなる辺
のペアを採用
方針:クラスタの結合
 結合コストが求まった
 目的はクラスタをN個に結合すること
方針:クラスタの結合
 結合コストが求まった
 目的はクラスタをN個に結合すること
最小全域木の構築
(N個にまとめるので,正確には全域ではないが)
方針:クラスタの結合
 クラスタを21個から2個にまとめる
方針:クラスタの結合
 クラスタを21個から2個にまとめる
今回の取り組み
 多角形上での頂点の入れ替えによる面積縮小
 頂点集合をNより大きく分割して多角形を作った後,多角形がN個にな
るまで統合
 生成した多角形がN個未満なら,N個になるまで分割
 もしくは分割できなくなるまで
 ほかの多角形とも頂点をやりとりし,面積縮小
 上記を何パターンか行い,面積がもっとも小さかったものを採用
方針:クラスタの分割
 頂点をクラスタに割り振る際,どうしてもクラスタの数がNより小さくなって
しまうことがある
 特に,頂点数に対してNが大きいときに起こりうる
方針:クラスタの分割
 頂点をクラスタに割り振る際,どうしてもクラスタの数がNより小さくなって
しまうことがある
 特に,頂点数に対してNが大きいときに起こりうる
 クラスタを分割しよう
方針:クラスタの分割
 結合と同じように,辺のペアを見て分割できるか調べる
 クラスタ内で完結するので,結合よりは簡単
方針:クラスタの分割
 結合と同じように,辺のペアを見て分割できるか調べる
 クラスタ内で完結するので,結合よりは簡単
 最も取り除く面積が大きくなる分割を採用する
方針:クラスタの分割
 結合と同じように,辺のペアを見て分割できるか調べる
 クラスタ内で完結するので,結合よりは簡単
 最も取り除く面積が大きくなる分割を採用する
方針:クラスタの分割
 結合と同じように,辺のペアを見て分割できるか調べる
 クラスタ内で完結するので,結合よりは簡単
 最も取り除く面積が大きくなる分割を採用する
方針:クラスタの分割
 結合と同じように,辺のペアを見て分割できるか調べる
 クラスタ内で完結するので,結合よりは簡単
 最も取り除く面積が大きくなる分割を採用する
方針:クラスタの分割
 結合と同じように,辺のペアを見て分割できるか調べる
 クラスタ内で完結するので,結合よりは簡単
 最も取り除く面積が大きくなる分割を採用する
注意
方針:クラスタの分割
 結合と同じように,辺のペアを見て分割できるか調べる
 クラスタ内で完結するので,結合よりは簡単
 最も取り除く面積が大きくなる分割を採用する
注意
切り取りライン(?)が外側を通る場合,
面積が減ることも増えることもある
ので要確認
方針:クラスタの分割
 結合と同じように,辺のペアを見て分割できるか調べる
 クラスタ内で完結するので,結合よりは簡単
 最も取り除く面積が大きくなる分割を採用する
注意
切り取りライン(?)が外側を通る場合,
面積が減ることも増えることもある
ので要確認
今回の取り組み
 多角形上での頂点の入れ替えによる面積縮小
 頂点集合をNより大きく分割して多角形を作った後,多角形がN個にな
るまで統合
 生成した多角形がN個未満なら,N個になるまで分割
 もしくは分割できなくなるまで
 ほかの多角形とも頂点をやりとりし,面積縮小
 上記を何パターンか行い,面積がもっとも小さかったものを採用
方針:他のクラスタとの連携
 クラスタ内で先ほど行っていた頂点のやりとりを,他のクラスタとも
行う
方針:他のクラスタとの連携
 クラスタ内で先ほど行っていた頂点のやりとりを,他のクラスタとも
行う
 他のクラスタ内の辺との交差も考慮しなくてはならないので,頂点数
が少ない場合にのみ適用可能
 今回は頂点数500以下の場合にのみ適用
方針:他のクラスタとの連携
 クラスタ内で先ほど行っていた頂点のやりとりを,他のクラスタとも
行う
 他のクラスタ内の辺との交差も考慮しなくてはならないので,頂点数
が少ない場合にのみ適用可能
 今回は頂点数500以下の場合にのみ適用
 近いクラスタだけ確認したら頂点多くてもいける?(未確認)
方針:他のクラスタとの連携
 クラスタ内で先ほど行っていた頂点のやりとりを,他のクラスタとも
行う
 他のクラスタ内の辺との交差も考慮しなくてはならないので,頂点数
が少ない場合にのみ適用可能
 今回は頂点数500以下の場合にのみ適用
 近いクラスタだけ確認したら頂点多くてもいける?(未確認)
ここまでの方針で70後半~80くらい(5/2時点)
方針:その他
 手法
 仕上がったものを,分割して結合する,を何度か適用
 焼き鈍し法もどき
 その他の実装
 ビジュアライザの作成 (ステップ実行など)
 Testerの組み込み (Javaで助かった!)
方針:その他
 手法
 仕上がったものを,分割して結合する,を何度か適用
 焼き鈍し法もどき
 その他の実装
 ビジュアライザの作成 (ステップ実行など)
 Testerの組み込み (Javaで助かった!)
以上です!
マラソンマッチR1
おつかれさまでした!

More Related Content

Viewers also liked

Prezentacja zakopane
Prezentacja zakopanePrezentacja zakopane
Prezentacja zakopane
Ola Woźniak
 

Viewers also liked (14)

Prezentacja zakopane
Prezentacja zakopanePrezentacja zakopane
Prezentacja zakopane
 
Marketing Plan Carhoe
Marketing Plan CarhoeMarketing Plan Carhoe
Marketing Plan Carhoe
 
Top 14 hiring interview tips
Top 14 hiring interview tipsTop 14 hiring interview tips
Top 14 hiring interview tips
 
Overview presentation on wcp for clients
Overview presentation on wcp for clientsOverview presentation on wcp for clients
Overview presentation on wcp for clients
 
Infa sem 2
Infa sem 2Infa sem 2
Infa sem 2
 
JHI Mkt Plan
JHI Mkt PlanJHI Mkt Plan
JHI Mkt Plan
 
Top 10 hiring cover letter tips
Top 10 hiring cover letter tipsTop 10 hiring cover letter tips
Top 10 hiring cover letter tips
 
Bimed cable gland explosion proof and industrial
Bimed cable gland explosion proof and industrial Bimed cable gland explosion proof and industrial
Bimed cable gland explosion proof and industrial
 
Research paper
Research paperResearch paper
Research paper
 
Makalah Tugas kelompok Teori Organisasi Umum
Makalah Tugas kelompok Teori Organisasi UmumMakalah Tugas kelompok Teori Organisasi Umum
Makalah Tugas kelompok Teori Organisasi Umum
 
Bengkel kik untuk pis with animation based on mampu
Bengkel kik untuk pis with animation based on mampuBengkel kik untuk pis with animation based on mampu
Bengkel kik untuk pis with animation based on mampu
 
Glucose meter
Glucose meterGlucose meter
Glucose meter
 
Business Analyst Interview cheat sheets
Business Analyst Interview cheat sheetsBusiness Analyst Interview cheat sheets
Business Analyst Interview cheat sheets
 
Decoupled Neural Interfaces輪読資料
Decoupled Neural Interfaces輪読資料Decoupled Neural Interfaces輪読資料
Decoupled Neural Interfaces輪読資料
 

SmallPolygons 解法