非線形計画
問題の定式化
として、各問題を定式化。
凸関数と凸領域
凸関数
を満たす関数。
凸領域
となる領域。
大域最適解と局所最適解
以下を参照。
大域的最適解とは - OR事典 Weblio辞書
大域的収束性 - 数理計画用語集
局所的収束性 - 数理計画用語集
ここで「目的関数が凸関数で実行可能領域が凸領域なら、局所最適解と大域最適解は一致する」と言える。
証明:
背理法、一致しないと仮定して局所最適解と大域最適解があるとする。もちろん。ここで凸集合であることから が成り立つ。
一方目的関数fは凸関数なのだから
が成り立つ。すなわちは大域最適解よりも小さい値になる、これはおかしい■
凸関数とヘッセ行列の関係
制約なし問題で、目的関数か凸関数ならば「最適解ではは半正定値行列である。」ことが成り立つ。これは二次関数での"傾き0の点が局所最適解の候補になりうる"ことに対応。
証明:
背理法で示す。「最適解ではは半正定値行列である。」が成り立たないと仮定する。
ここで、目的関数fを任意の点でテイラー展開すると、
と記述できる。今、任意の点は最適解と適当な実数とベクトルを用いてとかける。今点を最適解にてテイラー展開すると、上の式に代入して
とかける。「最適解ではは半正定値行列である。」が成り立たないと仮定しているのだから、
となるようなベクトルが存在するはずである。ここで上のテイラー展開の結果でαの値を十分小さくするとの項を無視できる。
するとなのだから、
であるがこれは最適解がであることに矛盾。■
アルミホのルールとウルフのルール
文献J. Nocedal and S. J. Wright, Numerical optimization. Springer Series in Operations
Research. Springer-Verlag, 1999.
に説明があります。省略。
カルーシュ・キューン・タッカー条件(KKT条件)*3
上記のページに詳しく記述されている(ただし出典はこの記事の参考文献におなじらしい)。
問題の定式化
制約なし問題では、が最適であるための必要条件のひとつだが、制約ありの場合はではなくても実行可能領域の境界上などで最適解がみつかる場合が多いからという情報だけでは最適解は見つからない。
そこで、最適解である点がいくつもの制約を満たすために制約を満たすような方向へ”引っ張られて釣り合った結果”の点であると考えたら、
となるような非負の実数が存在すると言える(証明は参考文献に書いてないし実際学部の範囲ではなさそうなので考え方だけ理解)。をつけるのは勾配は関数が最も増加する方向の方向ベクトルなのだから、最適解において各関数(制約)がもっとも大きく引っ張る方向と個人的に解釈、釣り合うのだからその和は零ベクトルで表される。
そして、有効制約でない制約(最適解であるを選んだ時にとならない制約)はこの文脈で言えば最適解の点を制約がなんとか満たすように"引っ張っていない(まだいくらか動ける余裕がある)"のだから
にて最適解を移動させるための役割を持たないはずだと考えると「有効制約でないものに対応する係数uは0である」と考えられる。参考文献にはもっとしっかりベクトルの一次従属などを用いて説明があった。
そしてもしも制約が存在しないとすると、この"引っぱりあい"を示す式は
と書くことができる。これはまさにラグランジュ未定乗数法の式そのもので実際この最適化の文脈でもuをラグランジュ係数と呼ぶらしい。
最適解であるための必要・十分条件(参考文献[0]p123)
KKT条件を満たすすべての点が最適解であるとは限らないのは適当に制約と目的関数を作ってためしてみると分かる。なのでさらに目的関数と制約が凸関数であるという制約を加えることで局所最適解が大域最適解と一致するようにするとKKT条件を満たす点が最適解であると言えるようになる。さらに以下の式Lを考える。
このLの勾配は
であり、まさにKKT条件の”引っ張り合い”の式であって
がLのヘッセ行列。そして有効制約の勾配ベクトルと直行するベクトルはが成り立つことが知られている。この式は以前の制約なしの凸計画問題の「ヘッセ行列が半正定値行列である」ことと対応しているとみると、見つけた点が最適解であるための十分条件は凸計画問題の「ヘッセ行列が正定値行列である」ことに対応して「」と見当がつく。
追記:KKT条件を満たす点が最適解と保証されるのは
- 目的関数が凸関数
- 等式の制約を与える(***=0)制約はすべて一次式
- 不等式制約を与える(***≦0)制約はすべて凸関数
の場合です。
組み合わせ最適化
問題の定式化
として、各問題を定式化。
ナップザック問題
※記号の意味は後述
英文の単語の最適配置問題
英語の文を印刷するときに、単語の途中で改行させずになおかつ単語間のスペース幅の総和をなるべく少なくしたい。
今、印刷する文章の一行の幅をとして、単語はの幅をもっている。このとき、ある行にあるスペースの幅の総和は
と書ける。そしてスペースがあるほどコストがかかるとして、
最後の条件は文章の最後の行はスペースがたくさんあっても無視するのならば必要な条件となる。動的計画法を適用するためには漸化式を記述して、なにを「メモ化」するか決める必要あり、後述。
双対
問題
について、制約条件をまとめて一つの行列として表し目的関数もベクトルの内積に書き換えたとして、
と定義する。この問題の”双対”にあたる問題は
と書ける。*6
そして、弱双対定理によると.等号が成り立つのは二つの問題に最適解があって、ともに最適解の場合のみ。制約条件を満たすベクトルはすべてこの不等号を満たす。なぜなら、任意の制約条件を満たすベクトルに対してが成り立つから。
そして、このような二つの問題を考えるとき、その二つの最適解が存在する、もしくは目的関数が無限に大きく(小さく)なり一方は最適解を持たない、共に解を持たない場合に限られる。弱双対定理から、最適解の下限(上限)を得ることができる。
貪欲法*8
最適解だと思うものを優先して(先のことを考慮せずに)選ぶ手法。ナップザック問題ならば例えば「価値の大きいものを優先して先に選ぶ」など。
いくつかのアルゴリズムは貪欲法を基本戦略としているものの、厳密解が求まることが証明されている。
ダイクストラ法
プリム法
クラスカル法*9
分枝限定法
「解いても現在得られると分かっている最適解よりも”よい”最適解をえることができないと保証された部分問題が検出されたとき、その部分問題は解かない」ことで計算時間を短縮する。
例
- はじめに、アイテムを基準に沿って並べ替え。
アイテムを単位大きさあたりの価値が最大になるように、すなわち
となるようにする。
- 探索木を作る。
に基づいた二分木を作成する。木の根のはじめの分岐はもっとも単位重さあたりの価値があるアイテム1()としてならばナップザックにアイテムを入れたことを表す。
- 部分問題を解くべきかの基準を計算する。
「現在得られると分かっている最適解よりも”よい”最適解をえることができないと保証された部分問題」を判定するための値を計算する。ナップザック問題の例だと「この部分問題が与えうる最適解の上限」と「この部分問題が与えうる最適解の下限」のふたつが部分問題をさらに解く前に、つまり探索木のそれぞれのノードに達したときに計算される必要がある。
「この部分問題が与えうる最適解の下限」:とりあえず何でもいいから鞄に入ればそれが解になりうるのだからここでは【単位大きさあたりの価値に沿って並んだアイテムを(単位大きさあたりの価値が大きい)順にいれていってナップザックをはみ出ない最大量の価値】をその値にする。その時、最後に入れたアイテムをとする。
「この部分問題が与えうる最適解の上限」:【単位大きさあたりの価値に沿って並んだアイテムを(単位大きさあたりの価値が大きい)順にいれていってナップザックをはみ出ない最大量の価値】+ の価値 とする。もともとアイテムは単位あたりの価値が大きい順に並んでいるのだから、どうやってもナップザックにはいる量の範囲内でこの値は超えることができない。
- 解く必要のない部分問題を決定する
ノードに幾たびに上記のとを計算する。ここで明らかに
ならば、その部分問題を解いたとして最適解の候補が解として得られることが分かっているのだからその部分問題を解く意味がない。
結局以下のようにまとめられる。
- はじめに、なにか基準(講義では単位あたりの価値が大の昇順)を定義して、それに基づいてアイテムを並び替える。
- 基準を正確に決めないと「だからそのノードの子孫を切り捨ててもいい」と言えない..!
- その並びに基づいてまだいれるかいれないかを決めていない()アイテムを入れていく。
- ナップザックにこれ以上アイテムが入らないとなったとき...以下の値をノードに保存
- lower bound := その時の目的関数の値
- upper bound := ナップザックをはみ出てもいいので順番に並んだアイテムの次のアイテムを入れた場合の目的関数の値
- ノードを移動して2.3.を実効する
- そのとき、求められたならばそのノードの子孫は計算せずに切り捨てる
- 以上を繰り返し、もっともよいが解となる
木の探索の順番
- 最良優先探索
- 最も良い解が得られそうな部分問題のあるノードへと優先的に進む。
- 適切な基準で部分問題を選べば計算時間は少なくすむ。
- 深さ優先探索
- 部分問題の根までの深さがより長い部分問題のあるノードへと優先的に進む。
- メモリ消費が少なく実装しやすいが、深さの限界が保証されていない場合や計算がたくさん必要な場合あり。
動的計画法
「繰り返し出現する部分問題の解を記憶することで、部分問題は一回だけしか計算しない」ことで計算時間を短縮する。
対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法で..(中略)..下記2条件を満たすアルゴリズム
- 分割統治法:部分問題を解き、その結果を利用して、問題全体を解く
- メモ化:部分問題の計算結果を再利用する
である。
*10
部分問題を解く、という記述から単純に再帰的にプログラムを書くと計算時間はものすごく大きくなる(NP完全の部分問題もやはりNP完全)。だから、「メモ化」を利用してなんども同じ問題を計算することを回避する。
ナップザック問題の場合の動的計画法概略
- アイテムをなにか基準(講義では単位あたりの価値が大の昇順)を定義して、それに基づいてアイテムを並び替える。(さっきと違って、別に並び替えなくてもよい)。
- アイテムを縦軸(総アイテム数n)、ナップザックのサイズを横軸(ナップザックのサイズはb)としてn*bの表をつくる。
- 以降は関連資料のスライドシェア参照。
ナップザック問題への動的計画法
いま、()を入れることを考えるとして、
となる。計算時間はメモ化したものはで参照できる、ナップザックのサイズの回数だけアイテムが入るかどうかを試す、アイテムの数だけアイテムが入るかを試すことを考えてと予想できる。
緩和問題
の条件について、これをとした場合は目的関数、制約条件はともに連続な関数になるのだから線形計画問題として解くことができる。そうすると、Leonid Khachiyanによって線形計画問題を最悪の場合でも多項式時間で解くアルゴリズム*11が提案されているのだから、この問題は多項式時間でとける保証がある。ただしこのアルゴリズムは実用に向かない。
問題の条件を緩和したのだから、実行可能解は”元の問題の実行可能解の領域を含んだ状態で”もとの領域より大きい。だからこの緩和した問題の最適解はもとの問題の最適解よりも「解を求める計算時間が少なく」「もとの最適解よりも”よい”値を最適解にもつ」ことがわかりこれはの計算に用いることができる。
ナップザック問題の緩和問題
元の問題を
としたとき、これに対応する緩和問題(の一例)は
となる。この場合、を計算したときの「はみ出た部分」の評価をせずにを定めることができるからその分だけ削除できる部分問題が増加しうる。
関連資料および参考文献
参考文献
[0] 福島雅夫:『数理計画入門』, 朝倉書店, 1996.
[1] 酒匂貴市:最適化 平成20年1 月 3 日Project AFS
*3:この節は過去記事からの転載
*6:http://dsl4.eee.u-ryukyu.ac.jp/DOCS/ipm/node3.html http://dsl4.eee.u-ryukyu.ac.jp/DOCS/ipm/node3.html http://dsl4.eee.u-ryukyu.ac.jp/DOCS/ipm/node3.html http://dsl4.eee.u-ryukyu.ac.jp/DOCS/ipm/node3.html
*11:http://www.math.s.chiba-u.ac.jp/~yasuda/toku05/linearprogm02a.pdfなど、もしくはLeonid Khachiyanの論文参照