メタヒューリスティクス 東京海洋大 久保 幹雄 http://www.e.kaiyodai.ac.jp/~kubo/

Slides:



Advertisements
Similar presentations
組合せ最適化輪講 2.3 連結性 川原 純. 2.3 連結性 内容 – グラフ上の節点をすべてたどるアルゴリズム 計算機上でのグラフの表現 – 強連結成分を求めるアルゴリズム トポロジカル順序を求める方法も – k- 連結、 k- 辺連結について – 2- 連結グラフの耳分解について.
Advertisements

多目的GAに対する パレート最適個体の分布制御 九州大学大学院工学府知能機械システム専攻徳井 宏司.
情報基盤アルゴリズムとして のメタヒューリスティクスの 研究 茨木俊秀、巳波弘佳、藤原洋志、 千葉英史、関口良行(関西学院大 学)、 藤重悟(京都大学)、 柳浦睦憲(名古屋大学)、 野々部宏司(法政大学)、 梅谷俊治(電気通信大学)
世帯マイクロデータの適合度評価における 重みの決定手法
到着時刻と燃料消費量を同時に最適化する船速・航路計画
最適化アルゴリズムの動向 ーメタヒューリスティックスを中心としてー (基礎編)
2009/12/4 グラフ (2) 第10講: 平成21年12月4日 (金) 4限 E252教室 コンピュータアルゴリズム.
ネットワーク理論講義補助資料 Text. 組合せ最適化とアルゴリズム 4.5 節 主・双対法 pp
データ構造と アルゴリズム 第十二回 知能情報学部 知能情報学科 新田直也.
近似アルゴリズム 第10章 終了時刻最小化スケジューリング
数理最適化の応用例と 実験的解析 東京海洋大学 久保 幹雄.
第11回 整列 ~ シェルソート,クイックソート ~
遺伝的アルゴリズム  新川 大貴.
局所探索に基づく 原子炉燃料装荷パターンの最適化
近似解法からメタ戦略へ ー巡回セールスマン問題を例としてー 東京商船大学 久保 幹雄
分子生物情報学 動的計画法に基づく配列比較法 (ペアワイズアライメント法)
Approximation of k-Set Cover by Semi-Local Optimization
遺伝アルゴリズムによる NQueen解法 ~遺伝補修飾を用いた解探索の性能評価~
データ構造とアルゴリズム 分割統治 ~ マージソート~.
マイクロシミュレーションにおける 可変属性セル問題と解法
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
制約条件の確率的選択に基づく 資源追加削減法の改良 三木 光範(同志社大工) 廣安 知之(同志社大工) ○小林 繁(同志社大院)
算法数理工学 第12回 定兼 邦彦.
第11講: 平成18年12月 8日 (金) 4限 E352教室 グラフ (1).
アルゴリズム入門.
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
早わかりアントコロニー最適化 (ACO: Ant Colony Optimization)
割当て問題 • 割当問題の記法・定式化 • 拡張 • 特殊ケース(マッチング) • 3種類のものを割当てる問題.
MPIを用いた並列処理 ~GAによるTSPの解法~
アルゴリズムとデータ構造 2011年7月4日
遺伝的アルゴリズムへの 統計力学的アプローチ 大阪大学 大学院理学研究科 鈴木譲 CISJ2005 於早稲田大学理工学部
第25章 単一始点最短路 3節 Bellman-Fordのアルゴリズム
ネットワーク上での社会的効用と個人的効用の対立問題に対するアルゴリズム的研究
決定木とランダムフォレスト 和田 俊和.
ネットワーク理論 Text. Part 3 pp 最短路問題 pp 最大流問題 pp.85-94
巡回セールスマン問題への招待 東京商船大学 久保 幹雄.
シミュレーション学講義 第**回 スケジューリング問題とJSSP.
Introduction to Soft Computing (第11回目)
進化的計算手法の並列計算機への実装 三木 光範
早わかりアントコロニー最適化 (Ant Colony Optimization)
25. Randomized Algorithms
運搬スケジューリング問題と その周辺 東京商船大学 流通情報工学 久保 幹雄.
遺伝的交叉を用いた 並列シミュレーテッドアニーリング 同志社大学工学部/大学院 廣安知之,三木光範,○小掠真貴
連続領域におけるファジィ制約充足問題の 反復改善アルゴリズムによる解法 Solving by heuristic repair Algorithm of the Fuzzy Constraint Satisfaction Problems with Continuous Domains 北海道大学.
プログラミング 4 探索と計算量.
適応的近傍を持つ シミュレーテッドアニーリングの性能
再帰的手続き.
知識科学研究科 知識システム構築論講座 林研究室 佛明 智
ベイジアンネットワーク概説 Loopy Belief Propagation 茨城大学工学部 佐々木稔
ナップサック問題 クマさん人形をめぐる熱いドラマの結末.
問題作成、解説担当:中島 副担当:坪坂、松本
配送計画最適化システム WebMETROのご紹介
Data Clustering: A Review
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
遺伝的交叉を用いた 並列シミュレーテッドアニーリングによる タンパク質立体構造予測
ロジスティクスにおける 最適化の応用 東京商船大学   流通システム 久保 幹雄.
サプライ・チェイン最適化について 研究者・実務家が知っておくべきこと
遺伝アルゴリズムによる NQueen解法 ~問題特性に着目した突然変異方法の改善~
Max Cut and the Smallest Eigenvalue 論文紹介
情報工学概論 (アルゴリズムとデータ構造)
表紙 分散遺伝的アルゴリズムのための 新しい交叉法.
アルゴリズムとデータ構造 2013年7月8日
2009/11/27 グラフ (1) 第9講: 平成21年11月27日 (金) 4限 E252教室 コンピュータアルゴリズム.
情報工学科 05A2301 樽美 澄香 (Tarumi Sumika)
コストのついたグラフの探索 分枝限定法 A*アルゴリズム.
参考:大きい要素の処理.
各種荷重を受ける 中空押出形成材の構造最適化
グラフの帯域幅連続多重彩色 を求めるアルゴリズム (Bandwidth Consective Multicolorings of Graphs) 西関研究室 西川和秀.
アルゴリズムとデータ構造 2012年7月9日
遺伝的交叉を用いた 並列シミュレーテッドアニーリングの検討 小掠 真貴 廣安 知之 三木 光範 角 美智子 岡本 祐幸 同志社大学大学院
Presentation transcript:

メタヒューリスティクス 東京海洋大 久保 幹雄 http://www.e.kaiyodai.ac.jp/~kubo/

組合せ最適化問題(概念図) 目的関数(最大化) f(x),x∈F 大域的最適解 実行可能解の集合 F

組合せ最適化問題 F = 実行可能解の集合(有限) f: F → R (Z) (目的関数) 最大化 or 最小化 f(x) 条件 x ∈ F (大域的)最適解(の集合) F* ={ x∈F: f(x)≧f(y), ∀y∈F }

メタヒューリスティクスとは 別名 定義(その1) メタ戦略,メタ解法,モダンヒューリスティクス ヒューリスティクスを有機的に結合 近似解法(理論的な保証をもつ) ヒューリスティクス(保証をもたない)

メタヒューリスティクスとは 定義(その2) 定義(その3) 流行物(なんらかのアナロジーをもつ) Simulated Annealing法 (焼きなまし現象) Tabu Search (脳の思考) Genetic Algorithm (遺伝) 定義(その3) パラメータを変えることによって様々な近似解法になる ‘any time’ アルゴリズム (停止条件をユーザーが定め,時間をかければかける程良い解を探索する.

近傍と局所最適解(概念図) 局所最適解 近傍 N(x) 実行可能解x

N: F → 2 F 近傍の定義 局所最適解の集合 { x∈F: f(x)≧f(y), ∀y ∈ N(x) }

簡単な例 一機械総納期遅れスケジューリング問題 ジョブの集合 {1,2,3,4} ジョブ i 1 2 3 4 処理時間 pi 1 2 3 4 納期 di 5 9 6 4 実行可能解の集合 {1,2,3,4}から構成される4!個の順列

目的関数 一機械総納期遅れスケジューリング問題 目的関数 納期遅れ時間の合計(最小化) =6 実行可能解(順列) 1234 の目的関数 J4の納期 J3の納期 J1の納期 J2の納期 J1 J2 J3 J4 6

近傍 一機械総納期遅れスケジューリング問題 近傍 隣接するジョブを交換 1 2 4 3 実行可能解 1 2 3 4 の近傍 1 3 2 4 2 1 3 4

一機械総納期遅れスケジューリング問題近傍グラフ 1234 点は解に対応 2134 6 6 目的関数値 1243 7 1324 7 7 6 5 6 5 8 7 4 10 4 5 6 10 8 3 7 8 5

Local Search (局所探索法,改善法)

山頂を目指す闇夜の登山者 x 近傍 N(x)

闇夜の登山者(ここが山頂?) 局所最適解

Local Search Local Search x := 適当な初期実行可能解 while 改良(x) ≠ {} do 改良(x)= {y∈ N(x):f(y)>f(x) } Local Search x := 適当な初期実行可能解 while 改良(x) ≠ {} do x := 改良(x)の中の適当な要素

Local Searchの探索経路 近傍グラフの枝 {(x,y): f(x)>f(y)}

Local Searchの探索経路 目的関数(最小化)

Multiple Start Local Search (多出発局所探索法)

Multiple Start Local Search (多出発局所探索法) while 終了判定基準 ≠ yes do x := 適当な初期実行可能解 while 改良(x) ≠ {} do x := 改良(x)の中の適当な要素 集中化・多様化を組み込む 良いメタ解法のための定石

集中化と多様化 集中化(intensification) 多様化(diversification) 良い解に近いところには良い解が存在するという性質(proximate optimality property)を信じて,良い解の回りを集中的に探索すること. 多様化(diversification) 悪い解のまわりで探索が停滞することを避けるために,今までに探索していない解を強制的に探索させること.

集中化 intensification この辺は良い解が多いから もう少し探してみるか

多様化 diversification この辺はさんざん探したので, そろそろ違う場所を探しに行くか

GRASP (Greedy Randomized Adaptive Search Procedure) 集中化 多様化 φ

Iterated Local Search (反復局所探索法) 集中化 拡張された近傍 多様化

Iterated Local Search (反復局所探索法) x := 適当な初期実行可能解 while 終了判定基準 ≠ yes do while 改良(x) ≠ {} do x := 改良(x)の中の適当な要素 x:= 拡張された近傍 N'(x)の中の適当な要素

Simulated Annealing 法 (模擬焼きなまし法) 温度Tが高い 温度 T=0 徐々に冷却

Simulated Annealing法 低温期 高温期 徐々に冷却

Simulated Annealing法 温度 T1≧T2≧ … ≧T∞ =0 x1 := 適当な初期実行可能解 for k=1 to ∞ do y := N(x)のランダムな要素 Δ = min. { f(y)-f(xk),0} 確率 exp {Δ/Tk}で xk+1 :=y (受理) それ以外なら xk+1 :=xk (棄却) 温度 T1≧T2≧ … ≧T∞ =0

温度による受理確率の変化 受理確率 1 高温 低温 Δ=f(y)-f(x) 目的関数値の変化量

冷却法 対数冷却法 (logarithmic cooling) Tk = T1/log2 (1+k) 幾何学的冷却法 (geometric cooling) 一定温度で 近傍の大きさ×定数(16が推奨値)回繰り返す その後で T := T × 定数(0.95が推奨値)倍する.

Simulated Annealing法の 弱点 探索した解の情報をもたないので,同じ解を何度も探索してしまう. それゆえ盲目の探索法(blind search)と呼ばれる. ランダム性のみに頼っているので,小高い丘から脱出できない場合が多い. 収束が遅い.(特に最終段階で空回りする.)

Genetic Algorithm (遺伝的アルゴリズム) 遺伝(ダーウインの進化論)にアナロジーをもつ. 複数の実行可能解(集団:population)を保持する点が特徴. 新たな集団を生成するために,交叉(crossover)および突然変異(mutation)と呼ばれる操作を用いる.

Genetic Algorithm P(0) :=初期解の集合 for t=0 to T do Y:=生成( P(t) ) 生成(X) =集団 X から交叉または突然変異によって生成された新しい集団. 選択(X) =集団 X から優秀な子孫のみを残すこと(自然淘汰)によって選ばれた集団. Genetic Algorithm P(0) :=初期解の集合 for t=0 to T do Y:=生成( P(t) ) P(t+1) := 選択( Y )

交叉と突然変異 交叉(crossover) 親世代 子孫 突然変異 (mutation)

Genetic Algorithmの弱点 集中化が取入れられていない. 未成熟な収束(premature convergence) Local Searchを組み込む 未成熟な収束(premature convergence) 探索を多様化させる工夫の導入が必要. 交叉・突然変異は実行可能解を生成しにくい. パス接続法,トンネル法

パス接続法 複数の解から新たな実行可能解を生成する操作

トンネル法

Tabu Search (禁断探索法) 人間の記憶過程にアナロジーを持つ. 別名 最急上昇・最緩下降法 (steepest ascent mildest descent method) 適応型記憶計画(adaptive memory programming) 同じ場所を巡回しないように,記憶を頼りに,常に最も高い方向(下りの場合は最も勾配の緩やかな方向)を目指す.

Tabu Search(概念図) |TL|=2

Tabu Search 1 に戻らないように 一番高い地点へ移動しよう!

Tabu Search 2 |TL|=2

Tabu Search 3 |TL|=2 FIFO

Tabu Search 4

Tabu Search 5

Tabu Search 6

Tabu Search 7

Tabu Search 8

Tabu Search 9

Tabu Search 10

Tabu Search x := 適当な初期実行可能解 while 終了判定基準≠ yes do x := Best(x) TL (Tabu List): 禁断リスト 同じ解に戻らないように記憶された解の集合. 古い情報は新しいもので上書きされるので,短期メモリ(short term memory)とも呼ばれる. Best(x)= arg max.{f(y): y∈ N(x)-TL} x := 適当な初期実行可能解 while 終了判定基準≠ yes do x := Best(x) xをTLに記憶し,最も古い要素を忘れる.

属性 attribute 乗り物 植物

属性 attribute TLに保存する「もの」. 解自身を保存するのではなく,解の変化を表す何らかの目印を属性とする.   Tabu Searchの曖昧さの一因 提案 問題の構造を決めるなるべく小さい集合をとる

Tabu Searchの探索経路 1 初期解 1234 6 1243 6 7 1234 1243 7 7 6 5 6 5 8 7 4 10 3と4を交換する全ての 動きを封じる 4 5 10 6 10 8 3 7 8 5

Tabu Searchの探索経路 2 6 7 7 8 7 10 10 6 10 8 8 6

Tabu Searchの探索経路 3 6 7 8 10 6 8 6

Tabu Searchの探索経路 4 6 6 7 |TL|=3なので 枝が復活 8 4 10 6 8 3 5

Tabu Searchの探索経路 5 6 6 7 8 4 6 8 3 5

長期メモリ FIFO 短期メモリ TL ×3 多様化

禁断リストクリア(再出発)

Snapshot of Guided Local Search (2)

Snapshot of Guided Local Search (3)

Guided Local Search (GLS) Penalty (≒long term memory) p: U → R Modified Cost Function g(x)=Σu∈x c(u) + λΣu∈x p(u) GLS (x) 1 p(u) := 0 (∀ u ∈U) 2 while STOP ≠ TRUE do 3 x := LS (x, g) 4 u* := arg max u∈x c(u)/(p(u)+1) 5 p(u*) :=p(u*)+1

適用例 二次割当 グラフ分割 巡回セールスマン 最大クリーク グラフ彩色 ジョブショップスジューリング 運搬経路 N-Queen

二次割当問題 3回 5km 2km 2回 1回 1km 移動量行列 (Fij) (週に何回遊びに行くか) 距離行列 (Dij)

二次割当問題 2回 5km 2km 1回 1km 3回 2×5+2×1+1×3=15km 順列π

二次割当問題 V={1,2,…,n}, n×n 行列(Fij),(Dij)が与えられたとき,V上の順列πで Σi,j Fij Dπ(i)π(j)を最小にするものを求める問題. 応用 工場,レイアウト設計,キーボードの 配列,自己テスト可能な回路,回路配線 問題集(QAPLIB)あり.

二次割当問題の近傍 (swap近傍) 3回 1回 2回 2km 5km 1km 2×5+2×1+1×3=15km 3回 1回 2回 2km

二次割当問題の属性 人と家のペア 交換した人のペア

なぜペア属性が悪いか 禁止リストの 長さによらず 巡回が発生する!

人と家のペアにする理由 数理計画による自然な定式化 変数 Xij = 人iが家jに割り当てられたとき 1 それ以外 0 それ以外 0 min. ΣΣ Fij Dkl Xik Xjl s.t. Σ Xij = 1 for all i Σ Xij = 1 for all j Xij : 0 or 1

グラフ分割問題 半分に分けたい! 仲良し!

グラフ分割問題 目的関数値=2

グラフ分割問題 無向グラフ G=(V,E)が与えられたとき,|L|=|R|を満たすVの分割(L,R)で,LとRの間の枝の本数を最小にするものを求める問題. 応用 VLSI 設計, プログラム分割 JohnsonらがSimulated Annealing法の実験のために採用した第1の問題.

グラフ分割問題に対する近傍 (swap近傍)

交叉の例 グラフ分割問題に対する単性生殖交叉 A1 B1 A2 B2 A1 B1 A2 B2

通常の解の表現の弱点 実行可能解のみ を探索する

擬似実行可能解 (グラフ分割問題) 各グループ内の人数が 多少は違ってもよい!

擬似実行可能解上の近傍 (グラフ分割問題)

ペナルティ関数法 実行可能 目的関数

ペナルティ関数法(失敗例) 実行可能 目的関数

擬似実行可能解探索法 擬似実行可能解の集合 実行可能解の集合 F

戦略的振動 strategic oscillation

巡回セールスマン問題 Aberdeen Edinburgh Belfast Liverpool Dublin Cardiff London

巡回セールスマン問題 Aberdeen Edinburgh Belfast Liverpool Dublin Cardiff London

巡回セールスマン問題 グラフ G=(V,E), E上の重み関数 d が与えられたとき重みの合計が最小のHamilton閉路を求める問題. 応用 基盤配線,配送計画,スケジューリング,基盤穿孔,X線構造解析実験,タンパク質構造解析,DNA 並べ替え,VLSI設計, etc. 問題集(TSPLIB)あり.

近傍の例 (2-opt) a c d b |ac|<|ab|を満たすcに限定する!

Local Search (2-opt) Aberdeen Edinburgh Belfast Liverpool Dublin Cardiff London

Local Search (2-opt) Aberdeen Edinburgh Belfast Liverpool Dublin Cardiff London

近傍の例 (3-opt)

近傍の例 (挿入-opt)

交叉の例 巡回セールスマン問題に対する挿入-optの利用 親世代 子孫

擬似実行可能解上での近傍 (巡回セールスマン問題)

Lin-Kernighan opt (=3-opt + Depth-first Tabu Search using 2-opt neighborhood)

LK Search (Depth-first Tabu Search using 2-opt neighborhood)

LK Search (Depth-first Tabu Search using 2-opt neighborhood)

2-opt,3-opt,k-opt (Worst Case Results) Running Time : ∃I PLS-complete ∃I A k-opt(I) OPT(I) A 2-opt(I) A 3-opt(I) A 2,3,k-opt(I) OPT(I) ∀I

最大クリーク問題 なるべく大人数でピクニックに行きたい! 仲良し!

最大クリーク問題

最大クリーク問題 (最大安定集合問題) 応用 1993年度DIMACSチャレンジ問題の一つ 無向グラフ G=(V,E)が与えられたとき,最大位数の安定集合 S (Vの部分集合で間に枝のないもの)を求める問題. 応用 プリント基板テスト,パターンマッチング,符号理論,考古学および生物学のデータ解析,グラフ彩色問題の近似アルゴリズムおよび下界,多面体論(Kellerの予想),故障診断,etc. 1993年度DIMACSチャレンジ問題の一つ

最大安定集合問題 仲が悪い!

擬似実行可能解 (最大クリーク問題) 仲が悪い!

擬似実行可能解上の近傍 (最大クリーク問題) Drop Add

グラフ彩色問題 ・・・ クラス分けしたい! 仲が悪い!

グラフ彩色問題

グラフ彩色問題 無向グラフG=(V,E)が与えられたとき,Vの安定集合への分割で分割数最小のものを求める問題. 応用 時間割作成,スケジューリング,周波数割当,レジスタ配分,プリント基板テスト,パターンマッチグ. 1993年度DIMACSチャレンジ問題の一つ Johnsonらの実験的解析の第2の問題

4色問題 色数が少ない問題は 最適化問題としては 簡単!

グラフ彩色問題の近傍 1 悪い枝!

グラフ彩色問題の近傍 2 (Kempe Chain近傍)

ジョブショップスケジューリンング問題 仕事 作業 機械 5分 3分 8分 7分 2分 6分 4分

離接グラフ表現 有向枝 離接枝 開始 終了

解=離接枝に向きをつける 5 5 3 8 7 2 6 3 9 5

クリティカルパス(最長路) 5 5 3 8 7 2 6 3 9 5

(制限付き)離接枝反転近傍 5 6 8 3 2 9 7 5 6 8 3 2 9 7 5 6 8 3 2 9 7 を反転させる クリティカルパス上の離接枝

ジョブショップスケジューリンング問題 離接グラフ上で最長路の長さが最小になるように離接枝に向きをつける問題. 数あるスケジューリング問題の中でも最も悪名が高い. 実際問題に近い(らしい) 問題集あり(OR-Libから得られる)

運搬経路問題 5t ルート 3t 6t 6t 5t 5t デポ 4t 3t 5t 2t 20t 10t 運搬車の容量 顧客(需要点)

運搬経路問題の近傍 (1,1)-opt 青いルートには 属性 当分戻らない! デポ デポ (p,q)-opt: 二つのルートからp,q人ずつの顧客を交換

Neighborhood for VRP with Time Window Constraints Or-opt neighborhood Cross-opt neighborhood

Evaluation of a Neighbor … … Path P =(p1,p2,…,pk) Path Q =(q1,q2,…,qh) By keeping 1. Total Time, TT(P) 2. Earliest Departure Time of pk, Departure(P) 3. Latest Arrival Time of p1, Latest_Arrival(P), the neighborhood can be evaluated in O(1) time (if an appropriate search sequence is used). Furthermore, TT(P+Q), Departure(P+Q) , Latest_Arrival(P+Q) can be computed in O(1) time.

N-クイーン問題

pi[i] Position of the i-th queen

select randomly from [1..m] int Random_Position(int i) // find a random position randomly (it may fail) {int t, k, index; int mode=0; for(t=1;t<=theta;t++){ // try θ times …O(1) expected time index = (int)(rand() * m) + 1; k =feasible[index]; if(b[i+k-1] == 0 && c[n-i+k] == 0){ pi[i] = k; b[i+k-1]++; c[n-i+k]++; feasible[index]=feasible[m--]; mode=1; break;       } } return mode;} feasible[1..n] 1 2 3 4 5 m index select randomly from [1..m] If it’s safe, set queen of i-th row to column k 1 2 5 4 m

A simple construction algorithm using Random_Position void Construct() for(i=1;i<=n;i++){ mode =0; mode = Random_Position(i); if(mode==0) // if Random_Position fails Greedy(i); }

int Safety_Position(int i) {int k, j, count=0; for(k=1;k<=m;k++){ j = feasible[k]; if(b[i+j-1] == 0 && c[n-i+j] == 0){ temp[++count] = j; position[count] = k; }} return count; }

Greedy algorithm … O(n) in the worst case but it usually called in the last few iterations of the construction phase void Greedy(int i) {int temp_number, k, index, index2; temp_number = Feasible_Position(i); if (temp_number==0){ index = (int)(rand() *m) +1; k = feasible[index]; } else {        index2 = (int)(rand() *temp_number)+1; k = temp[index2]; index = position[index2]; } feasible[index]=feasible[m--]; pi[i]=k; b[i+k-1]++; c[n-i+k]++;

Subroutine for tabu seach: find a bad (dangerous queen) …search from the last row to the first row int Find_Dangerous_Queen() {int i, j, dangerous_queen=0; for(i=n;i>0;i--){ j=pi[i]; if( (b[i+j-1]+c[n-i+j]) >2){ dangerous_queen=i; break; } return dangerous_queen;}

Find the best queen for a dangerous queen to be swapped int Find_Swap_Queen(int istar) {int i, j, k, k2, swap_queen=0, max=-9999, tmp; for(j=1;j<=n;j++){ if(tabu[j]) continue; // if j is not tabu k = pi[j]; k2 = pi[istar]; tmp= b[k2+istar-1]+c[n-istar+k2]+b[k+j-1]+c[n-j+k] -b[k2+j-1]-c[n-j+k2]-b[k+istar-1]-c[n-istar+k]; if(tmp>=max){ //find a maximum improvement max = tmp; swap_queen = j; } return swap_queen;

void Tabu_Search() {int istar, jstar; while(1){ istar=Find_Dangerous_Queen(); if(!istar) break; // if istar=0,all the queens are safe; exit jstar=Find_Swap_Queen(istar); if(jstar==0){ // if no candidate to be swapped, tabu list is cleared for(i=1;i<=n;i++) tabu[i]=0; continue; } Update(istar, jstar); for(i=1;i<=n;i++) if(tabu[i]) tabu[i]--; tabu[istar] = tabu[jstar] = TL; //set istar and jstar to be tabu for TL iterations

参考図書 1  組合せ最適化のおへそである 巡回セールスマン問題を 対話形式で解説した本

参考図書 2 組合せ最適化問題をテーマに したお笑い短編集 プログラミングや メタヒューリスティクスの入門 N-Queenの記録 5000万クイーン の開発