前回
最適化:非線形計画問題のメモ - 雑なメモ
など。ほんとにメモ程度なので、厳密だったりしないし記号の定義などもかなり略、だけど講義の内容は大体ふれてるはず。参考文献、引用文献元は記事末尾参照。
組み合わせ最適化問題の例
一般的定義
とする。
巡回セールスマン問題
巡回セールスマン問題(じゅんかいセールスマンもんだい、英: traveling salesman problem、TSP)は、都市の集合と各2都市間の移動コストが与えられたとき、全ての都市をちょうど一度ずつ巡り出発地に戻る巡回路の総移動コストが最小のものを求める組合せ最適化問題
*1
有名NP完全(困難)問題。とりあえず、問題を「一般的定義」に沿うように定式化する必要がある。以下edge = 枝、vertex = 頂点であり、それに対応する添字はE,e,V,vなどと書く。セールスマンの巡回する町の家々は重み付きグラフで表せる。dは二つのvertexを入力として、そのvertex間の枝の重みを返す関数。目的関数は通る経路の重みの総和の最小化だからΣで表せそう。
で目的関数を表せる。「すべての頂点を一度ずつ通る」を置換で表している。
最大充足可能性問題
充足可能性問題(じゅうそくかのうせいもんだい、satisfiability problem, SAT)は、一つの命題論理式が与えられたとき、それに含まれる変数の値を偽 (False) あるいは真 (True) にうまく定めることによって全体の値を'真'にできるか、という問題
*2
NP完全問題、そしてこの問題に還元できる問題もNP完全。これも問題を数式で定式化する必要がある。
目的関数:最大を最小に変換するために、目的関数にマイナス1をかけるのを気をつける。各節を,その節に対応する重みをとしてこれをΣで足したものかける(-1)を目的関数にする。
制約条件:各論理変数は1,0しか値をとらないこと。のような記述が制約にあるはず。
充足可能性問題は、重みはすべて1で上記の目的関数の値 = (-1)*(節の数) と書けばいい。
分枝限定法と動的計画法
全ての解候補を体系的に列挙するもので、最適化された量の上限と下限の概算を使って、最適でない候補は「ひとまとめに」捨てられる。
分枝限定法 - Wikipedia
問題の定義
ナップザック問題を例にして
分枝限定
- はじめに、なにか基準(講義では単位あたりの価値が大の昇順)を定義して、それに基づいてアイテムを並び替える。
- 基準を正確に決めないと「だからそのノードの子孫を切り捨ててもいい」と言えない..!
- その並びに基づいてまだいれるかいれないかを決めていない()アイテムを入れていく。
- ナップザックにこれ以上アイテムが入らないとなったとき...以下の値をノードに保存
- lower bound := その時の目的関数の値
- upper bound := ナップザックをはみ出てもいいので順番に並んだアイテムの次のアイテムを入れた場合の目的関数の値
- ノードを移動して2.3.を実効する
- そのとき、求められたならばそのノードの子孫は計算せずに切り捨てる
- 以上を繰り返し、もっともよいが解となる
動的計画
対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法で..(中略)..下記2条件を満たすアルゴリズム
- 分割統治法:部分問題を解き、その結果を利用して、問題全体を解く
- メモ化:部分問題の計算結果を再利用する
である。
*4
部分問題を解く、という記述から単純に再帰的にプログラムを書くと計算時間はものすごく大きくなる(NP完全の部分問題もやはりNP完全)。だから、「メモ化」を利用する。
- アイテムをなにか基準(講義では単位あたりの価値が大の昇順)を定義して、それに基づいてアイテムを並び替える。(さっきと違って、別に並び替えなくてもよい)。
- アイテムを縦軸(総アイテム数n)、ナップザックのサイズを横軸(ナップザックのサイズはb)としてn*bの表をつくる。
- 以降は関連資料のスライドシェア参照。
IP、LP、双対問題の最適解の大小関係
講義の最後であり、資料が図を多用してるので省略。だけど過去問にもあるし要復習。
参考文献及び引用文献
- 福島雅夫,『新版 数理計画入門』,朝倉書店,2011年