| 情報学部 | 菅沼ホーム | SE目次 | 索引 |
f(P0) = min f(Pi) f(P0),f(Pi): 問題 P0 及び Pi の最適値
目的関数: f(x) 制約条件: x ∈ Si, Si ⊂ Xi, Xi ⊂ X, S = S ∩ (∪ Xi), Si = S ∩ Xi
目的関数: g(x) 制約条件: x ∈ S’i, Si ⊂ S’i ⊂ Xi






P0 → P2 → P8 → P7 → P1
,なお,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例に関しては,「プログラミング言語の落とし穴」第 9 章の「逐次改善法( TSP )」をご覧ください.)
,なお,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例に関しては,「プログラミング言語の落とし穴」第 9 章の「分割法( TSP )」をご覧ください.)




S の追加 stack の状態: 先頭: S, 要素数: 1 先頭 S を削除し,A, B, C を追加 stack の状態: 先頭: C, 要素数: 3 先頭 C を削除し,F, G を追加 stack の状態: 先頭: G, 要素数: 4 先頭 G を削除 stack の状態: 先頭: F, 要素数: 3 先頭 F を削除 stack の状態: 先頭: B, 要素数: 2 先頭 B を削除 stack の状態: 先頭: A, 要素数: 1 先頭 A を削除し,D, E を追加 stack の状態: 先頭: E, 要素数: 2 先頭 E を削除 stack の状態: 先頭: D, 要素数: 1 先頭 D を削除 stack の状態: 空です
S の追加 queue の状態: 先頭及び最後尾: S S, 要素数: 1 先頭 S を削除し,A, B, C を追加 queue の状態: 先頭及び最後尾: A C, 要素数: 3 先頭 A を削除し,D, E を追加 queue の状態: 先頭及び最後尾: B E, 要素数: 4 先頭 B を削除 queue の状態: 先頭及び最後尾: C E, 要素数: 3 先頭 C を削除し,F, G を追加 queue の状態: 先頭及び最後尾: D G, 要素数: 4 先頭 D を削除 queue の状態: 先頭及び最後尾: E G, 要素数: 3 先頭 E を削除 queue の状態: 先頭及び最後尾: F G, 要素数: 2 先頭 F を削除 queue の状態: 先頭及び最後尾: G G, 要素数: 1 先頭 G を削除 queue の状態: 空です


)は,横型探索によって上記の問題を解いた例です.同じ状態か否かをチェックするため STL の map クラスを使用しています( Java の場合は,TreeMap クラス).以下に示すのが,このプログラムを実行した結果です.「展開とチェック」の後ろの数字の内,最初の数字が展開したノードの数(キューに入れられたノードの数),後ろの数字がそれらの内,解か否かをチェックしたノードの数です.例2に対しては,かなり多くのノードを展開していることが分かると思います.なお,以下のプログラムにおいても同様ですが,このプログラムは最適解を得るためのものではありません.解が得られた時点でプログラムを終了しています.ただし,この問題の場合は,横型探索によって最適解が得られますので,得られた結果は最適解になっています.
例1
展開とチェック: 62 35, 最短距離: 6
1 2 3
8 0 4
7 6 5
1 2 3
0 8 4
7 6 5
0 2 3
1 8 4
7 6 5
2 0 3
1 8 4
7 6 5
2 8 3
1 0 4
7 6 5
2 8 3
1 6 4
7 0 5
例2
展開とチェック: 34299 22912, 最短距離: 19
1 2 3
8 0 4
7 6 5
1 2 3
8 4 0
7 6 5
1 2 0
8 4 3
7 6 5
1 0 2
8 4 3
7 6 5
1 4 2
8 0 3
7 6 5
1 4 2
8 6 3
7 0 5
1 4 2
8 6 3
7 5 0
1 4 2
8 6 0
7 5 3
1 4 2
8 0 6
7 5 3
1 4 2
0 8 6
7 5 3
0 4 2
1 8 6
7 5 3
4 0 2
1 8 6
7 5 3
4 2 0
1 8 6
7 5 3
4 2 6
1 8 0
7 5 3
4 2 6
1 0 8
7 5 3
4 2 6
0 1 8
7 5 3
0 2 6
4 1 8
7 5 3
2 0 6
4 1 8
7 5 3
2 1 6
4 0 8
7 5 3
)は,縦型探索によって上記の問題を解いた例です.以下に示すのが,このプログラムを実行した結果です.縦型探索の場合は,深さ制限を入れないと,非常に時間がかかると共に最適解が得られる可能性が小さくなります.
例1
展開とチェック: 61 60, 最短距離: 6
1 2 3
8 0 4
7 6 5
--- 省略 ---
2 8 3
1 6 4
7 0 5
例2
展開とチェック: 11150 11139, 最短距離: 19
1 2 3
8 0 4
7 6 5
--- 省略 ---
2 1 6
4 0 8
7 5 3
)は,この方法によって上記の問題を解いた例です.以下に示すのが,このプログラムを実行した結果です.なお,評価値が小さいものをキューの先頭に置くため,STL の priority_queue クラスを使用しています( Java の場合は,PriorityQueue クラス ).
例1
展開とチェック: 12 6, 最短距離: 6
1 2 3
8 0 4
7 6 5
--- 省略 ---
2 8 3
1 6 4
7 0 5
例2
展開とチェック: 201 111, 最短距離: 19
1 2 3
8 0 4
7 6 5
--- 省略 ---
2 1 6
4 0 8
7 5 3
| 情報学部 | 菅沼ホーム | SE目次 | 索引 |