プログラム・プロムナード:円周上の点による最大面積多角形
6
0
0
全文
(2) j. O. j (a) i. O. j i. (b). k. i O (c). k -2. k. ijk. 求める多角形 ijk の面積(a)は,Oij, Ojk, Oki の面積の和となるが,Ojk の面積(c)は j, k のなす角が 180 度以上あるた め負となり,符号なしで考えると OijOki の面積(b)から(c)を引いたものが(a)となる.. 介してあるだけで,このように 180 度を越える場合 には面積が負になることがあることには触れていな い.このことはのちのち重要な意味を持ってくるの だが. 作成目標である最大面積を求める関数は double calc(void). とすることにしよう. なお,本稿では「n 番目」とある場合,先頭を 0 番目と数えることとする.また,以下のプログラム では,最大値,最小値,絶対値を求める MAX, MIN, ABS なるマクロを使っているがこれらはしか るべく定義されているものとする.. 1. &. 関数 place(mi,ni)は,mi 番目の採用点として ni 以降を候補とした時の最大面積を返す関数である.. まず,最も単純にすべての組合せを生成しては面 積計算を行うプログラムを示す.. 内部では,点 ni を見送るか採用するかで 2 通りの再 帰呼出に分岐し,そのうちの大きい方を返すことに している.各点の採用状況は大域配列 nodes[]に記 録していき,再帰末端の面積計算で利用する. このプログラムは明らかに指数オーダを必要とし ている.. 2 前章のプログラムは大域配列を使用しており引数 だけでは値が定まらず,このままでは改良が難しい. そのため,指数オーダには違いがないのだが別の書 き方のプログラムを導入する. mi 番目の採用点 ni までの採用状況が定まっていて その次の採用点を選ぶ状況を考える.あと (mmi1) 個の採用点を選べばよい.次の採用点 nj. IPSJ Magazine Vol.43 No.6 June 2002. −2−. 665.
(3) node0. node0. node0. 0. 0. 0. ni. ni. ni. nj. nj. nj -3. 点 ni から終端点 node0 までの最大面積を求める.ni とその次の採用点 nj の部分(色の濃い三角形)と,nj から先の部分 (色の薄い扇形)に分け,後者は再帰呼出によって最大面積を求める.それらのうちで和が最大面積を与える nj を採用する.. を,ni のすぐ次(ni1)から始めて順次あとの点を候 補とする. nj から先は再帰的に最大面積が求まるとし て,ni と nj の一区間の面積と,再帰的に求まった nj から先の面積の和が ni からの面積となり,これを最 大化すればよいことになる(. -3).. この問題では,最初の採用点から始めて一周する 形で計算を進めるので,区間の終端点はすなわち最 初の採用点となり,これは計算を通じて固定できる. そこでこれを node0 なる大域変数に保持することに する. 関数 place は,mi 番目の採用点として ni を選ん だ時の最大面積を返す関数である.最初の採用点 node0 は最も外側のループで制御する.. このプログラムでは,最大面積の初期値として,0 ではなく-PI を与えている.これは求めているのが 部分面積であるから前述のとおり負になることがあ り得るためで,ここを 0 としてしまうと間違った答 になってしまう.. 3 前章のプログラムの実行効率が悪い原因は,同じ 関数を何度も評価していることにある.実際,引数 である mi, ni はそれぞれ m, n で抑えられるのである から,異なる呼出は高々 node0 ごとに nm 種類しか ない.この関数の値は,引数で完全に決定されるの で,関数の呼出結果を表に記憶することを考える. 2 次元配列 double memo[NMAX][NMAX]を用意し, 初期値としては「未計算」を表す特別な値を入れて. 666. 43. 6. 2002. 6. −3−.
(4) おく. 計算関数 place が呼ばれると,まず引数をキーと して memo 配列の該当する場所をチェックし,すで にその引数の組について計算済みであればその値を 直ちに返す.「未計算」の値が見つかった場合には前 項の処理を正直に行って値を計算し,memo 配列に格 納する. この方式によれば,place 関数の呼出は引数の組 に対して高々 n 回だけになり,全体の計算量は n3m で抑えられることになる(引数の組が nm だけあり, 1 回の呼出によって下請け関数が n 回呼び出される. さらに,初の採用点 node0 の選び方が n 通りある). こうした手法を. tabulation と呼び,古典. 的な高速化手法の 1 つである.. 4 単純再帰プログラムでは,. (1) のように再帰的な定義を行った.ここで,前項と同 様に関数呼出し place(mi, ni)を配列要素 memomini に対応させれば,これは関数呼出の関係ではなく, 配列要素間の関係を示す漸化式とみることができる.. このように,再帰的な関数の結果を順序よく表に. memomini の値そのものは前項と同じ値となるが,. 収めていくことによって計算を効率化する手法を. ここではさらにその具体的な計算順序が与えられた. dynamic programming と呼ぶ.. ことになる.漸化式. 動的計画法が適用できる問題の特徴は,与えられ た問題を小さいサイズの問題に分解した時に,その (2). 親問題の解が子問題のいずれかから得られる点であ る.. にしたがって,mi の最大値 m1 から始めて 0 に向. この問題のような組合せ最適化の問題では,動的. かって計算していけばよい.この場合にも,プログ. 計画法が適用できるかどうかを判断するのが重要で. ラム全体の計算量は. n3m. で済む.. この問題の場合,さらに空間的な計算量を減らす ことが可能である.式(2)から,memo の第一の添字. ある.その意味では,プログラム 2 を思いついた段 階で動的計画法の要件を満たしているということが できる.. に注意すると,1 つ先の行だけを使って計算している. この問題について,動的計画法の適用に失敗する. ことが分かり,ある行の計算が終了すると先の行は. 考え方をあげよう.面積最大 m 角形を作る際に,面. 不要になる.さらに,1 行の中で ni の要素を求める. 積最大 m1 角形を出発点とし,それにいずれか 1 つ. には ni1 から先だけを使っている.以上をまとめる. の新しい頂点を加えることで面積最大 m 角形としよ. と,mi を m1 の行から始めて,行内では ni を最も. うとするのである.この考え方がうまくいかないの. 小さい値から始めていけば,memo 配列は 1 次元で済. は,正方形と正三角形が重なった点が与えられた場. むことになる.. 合,正三角形に新しい 1 点を加えることによっては. 以上を反映させたプログラムを次に示す.. 正方形は作れないことを考えると分かる.親問題の 解(正方形)には,子問題の解(正三角形)は含まれ. IPSJ Magazine Vol.43 No.6 June 2002. −4−. 667.
(5) (a). (b). (c). -4 ni も含めた残りの点の総数 nni は 3,採用すべき点の数 mmi は 2 の場合.. ていないのである.. て大きい(甘い)上界であって,採用する必要はない. (2),(3)はデータによってどちらがより小さい(き. 5. びしい)かが決まるので,両方を計算してその小さい 方を採用するのが妥当だろう.. この問題については,前章の動的計画法が最適な. 探索の順序が重要になる.結果の良い枝を先に探索. 思う.. しておくと,早期によい暫定解を手に入れることが. しかし,ここではさらに別の手法によって,動的. できるので,それ以降の枝を有効に刈りとることが. 計画法を用いずに単純再帰を高速化することを考え. 可能になる.プログラム 2 では,次の採用点 nj を現. よう.こうした探索の高速化は,状態空間(関数に与. 在点 ni の次から順に探索していたが,これを「より. えられる引数の組)が大きすぎて索表や動的計画法が. 見込みのある」ものを先にするように並べ替えるので. 適用できない場合などに使われる.. ある.この問題では,正多角扇形が面積最大である. branch-and-bound method を適. 用する.これは状態空間を全探索する場合に,「明ら かに見込みのない枝」を探索候補から除外していくこ とで探索の高速化をはかるものである.枝を刈るこ とによって,その先に展開される膨大な (意味のない) 計算を省けるので,状況によってはきわめて有効な 方法である. 「明らかに見込みがない枝」とは,その枝の先でい かに良い結果が出たとしてもそれまでの最高記録(暫 定解)を更新し得ないということで,ある種の上界を 計算することになる.また,この判断は十分高速に (すなわち,探索によることなく)行う必要がある. この上界をどう(きびしく)定めるかがポイントで, この問題の場合,mi 番目の採用点を ni とした時の, その先の最大面積の上界として,たとえば (1)ni から終点までの円弧による扇形(. -4(a)). (2)ni から終点までのすべての点から作られる (nni)角扇形(. -4(b)). (3)ni から終点までの正(mmi)角扇形(. -4(c)). などが考えられる.明らかに(1)は(2),(3)に比べ. 43. pruning を導入すると,今度は. 解であり,出題者もおそらくそれを想定していると. まず,. 668. このような. 6. 2002. 6. −5−. ことに着目して,残り角度の平均値に近い nj から探 索するのがよいだろう..
(6) これらの手法の効果を,コンテストの問題に付加 されているサンプルデータについて計測してみる. n30, m15 の問題に対して,単純再帰のプログラム における place の呼出回数は 614429671 であった が,枝刈りを導入することで 60916 に激減し,さら に探索順序の変更によって 15119 にまで減少して いる. しかし残念ながら,この上界では n40 というコ ンテストの最大サイズでは計算が終了せず,より精 密な上界の評価が必要である.. 動的計画法を頂点とする,組合せ的な探索問題の 最適解を求めるためのアプローチを紹介してきた. これとは別に,最適性を犠牲にしても短時間でそれ なりの解を求めるアルゴリズムが各種存在する.状 態空間が巨大すぎる場合や,解の最適性にそれほど の意味がない場合などにはそうした方法が適用可能 である. プログラミングコンテストの観点から見れば,問 題のサイズによってどのようなアプローチをとるべ きかがほぼ決まってくるので,そこを見抜くのが 1 つの鍵となるであろう(現実の問題ではかならずしも それほど単純ではあり得ないが...). (平成 14 年 5 月 10 日受付). IPSJ Magazine Vol.43 No.6 June 2002. −6−. 669.
(7)
関連したドキュメント
しかしながら,式 (8) の Courant 条件による時間増分
④改善するならどんな点か,について自由記述とし
め測定点の座標を決めてある展開図の応用が可能であ
前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (
地盤の破壊の進行性を無視することによる解析結果の誤差は、すべり面の総回転角度が大きいほ
最愛の隣人・中国と、相互理解を深める友愛のこころ
➢
積極的一般予防は,この観点で不法な犯行に対する反作用の説明原則をな