SlideShare a Scribd company logo
#13:NP問題に対する
近似アルゴリズム
(山登り法、焼きなまし法)
東京大学
工学部 電気電子工学科 3年
比類(Twitter: @Hirui_naki)
おことわり
このスライドは,東京大学工学部電子情報工学科・
電気電子工学科の授業である,アルゴリズム
(https://iis-lab.org/algorithms2023)のレポート課題
として制作されたものを⼀般に公開したものになります.
本スライドの内容に関して,お気づきの点やさらに良く
するためのコメントがございましたら,ぜひ本スライド
の制作者にご共有ください.
今回学ぶ内容について
これまでの講義内容を踏まえて、ちょっと応用的な
内容を学びます.
少し難しいと感じるかも知れませんが、具体例や図を
交えながらなるべく丁寧に説明しますので、どうか
最後まで聞いていただけるとうれしいです.
目次
• NP問題とは
• NP問題の例:巡回セールスマン問題(TSP)
• 解法1:山登り法
• 山登り法の問題点
• 解法2:焼きなまし法
• 焼きなまし法の問題点
• 山登り法と焼きなまし法の比較
• まとめ
今回のトピック:NP問題
名前を聞いたことがある人もいるかもしれません.
1億円の懸賞金がかかっていることで有名な
「P≠NP予想」のNPです.
NP問題とは
「非決定性チューリング機械で多項式時間で解ける問題
のグループを NP と呼ぶ.」(東海大学のWebページよ
り引用1)
NP問題とは
「非決定性チューリング機械で多項式時間で解ける問題
のグループを NP と呼ぶ.」(東海大学のWebページよ
り引用1)
・・・?__
NP問題とは(わかりやすく)
この講義では、厳密な説明や証明は、⼀部を除いてやっ
てきませんでした.
なので、NP問題についても「堅苦しい言葉は抜きにして、
なんとなくの雰囲気を掴んでいただく」というスタンス
でいきます.
NP問題とは(わかりやすく)
NP問題とは、とても簡単にいえば、
「ある解が正しいかどうかを検証するのは簡単だが、
正しい解を求めようとすると、指数関数くらいの
膨大な時間がかかってしまう問題」のこと.
NP問題とは(具体的には)
NP問題の代表例としては、
・巡回セールスマン問題【今回取り上げる問題】
・ハミルトン閉路問題
・ナップサック問題
などが挙げられる.
(後述するが、厳密にはNP問題とは異なる)
補足:NP困難とNP完全について
先程挙げた例は、実はいずれもNP問題と厳密には異なる.
・巡回セールスマン問題
→NP困難(NP問題以上に難しい. NP問題とは限らない)
・ハミルトン閉路問題、ナップサック問題
→NP完全
(NP困難かつNP問題である)
余談:NPってなんの略?
NPは、Non-deterministic Polynomial(非決定性多項
式)の略称.
先ほどの定義にあった「非決定性チューリング機械で多
項式時間で解ける問題のグループ」というカタクルシイ
日本語は、この日本語訳から来ている。
NP問題の例:巡回セールスマン問題(TSP)
複数の都市をセールスマンが巡回して元の都市に戻る
とき、最短経路はどのようになるか、という問題.
ただし、同じ都市を2回以上訪れてはならない、という
制約がある.
NP問題の例:巡回セールスマン問題(TSP)
英訳するとTraveling Salesman Problemであること
から、頭文字を取ってTSPと呼ばれることが多い.
この講義でも、以降はTSPと呼称します.
日常に潜むTSP
TSPは、「与えられたものをどのようにしてうまく繋ぐ
か」というその考え方の普遍性から、日常生活の様々な
ところに存在している.
例えば、「Spotifyにおける音楽リストの作成」は、
Grant Holtesによれば実はTSPとして解かれている2.
TSPの例
右のように都市(赤点)が
存在するとき、どの都市も
⼀回ずつ訪れるような経路の
うちで最短経路を求める.
なお、[i]はi番目の都市で
あることを表す.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
NP問題とは(再掲)
NP問題とは、とても簡単にいえば、
「(1)ある解が正しいかどうかを検証するのは簡単だが、
(2)正しい解を求めようとすると、指数関数くらいの
膨大な時間がかかってしまう問題」のこと.
先の例について、(1)、(2)を確認する.
TSPの性質(1):解の検証は簡単
例えば、解(route)として
「0 -> 4 -> 2 -> 3 -> 9 ->
10 -> 5 -> 9 -> 8 -> 1 ->
0 -> 4 -> 0」が正しいか
どうかを検証することを
考える.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPの性質(1):解の検証は簡単
解の条件は
最初に訪れる都市を除き、
すべての都市が1つずつ
含まれていること
である.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPの性質(1):解の検証は簡単
よって、
(i)要素数が(都市の数N)+1、
すなわち12であること
(ii)最初と最後が同じ都市で
あること
(iii)すべての都市が1つずつ
含まれていること
を順に確認していけばよい.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPの性質(1):解の検証は簡単
それぞれの計算量は、
(i) pythonならlen()で即時に
取得できる. 𝑂(1).
(ii) routeの最初と最後の
要素を見ればよい. 𝑂(1).
(iii) routeを線形に見ていけば
よい. 𝑂(𝑁).
と、いずれも多項式で表せる.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPの性質(1):解の検証は簡単
なお、先ほどの
「0 -> 4 -> 2 -> 3 -> 9 ->
10 -> 5 -> 9 -> 8 -> 1 ->
0 -> 4 -> 0」は、
(i)で13となってしまうため、
正しい解ではないと分かる.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPの性質(2):厳密解の求解は非常に面倒
⼀方、厳密に正しい解
(⼀番短い経路)を
求めようとする場合、
可能なすべての経路について
考えなければならない.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPの性質(2):厳密解の求解は非常に面倒
可能なすべての経路は、[0]を
始点として固定して考えると、
10(2番目に訪れられる都市の数)
×9(3番目に訪れられる都市の数)
×8(4番目に訪れられる都市の数)
×…
=10!通りある.
これは計算量でもある.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPの性質(2):厳密解の求解は非常に面倒
⼀般化して考えると、
N個の都市におけるTSPの
正しい解を求める場合、
計算量は𝑂 𝑁 − 1 ! = 𝑂 𝑁! .
第1回の講義でもやった通り、
階乗は最悪のオーダー😱で
ある.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
それでは、どうするか
先にも見た通り、厳密に正しい解を求めるのは、
不可能ではないが、非常に時間がかかる.
それでは、どうするか
先にも見た通り、厳密に正しい解を求めるのは、
不可能ではないが、非常に時間がかかる.
→それならば、厳密に正しい解でなくてもいいから、
より早い時間で解を求めたい!
それでは、どうするか
先にも見た通り、厳密に正しい解を求めるのは、
不可能ではないが、非常に時間がかかる.
→それならば、厳密に正しい解でなくてもいいから、
より早い時間で解を求めたい!
→近似アルゴリズムの発明・活躍
近似アルゴリズム
厳密に正しい解(厳密解)が求まるわけではないが、
厳密解に近いもの(近似解)を求めてくれる
アルゴリズム.
当然ながら、近似解は正しい解(問題の条件を満たす
解)である.
今回紹介する近似アルゴリズム
山登り(Hill climbing)法
焼きなまし(Simulated annealing)法
解法1:山登り法
現在の解の「近傍」のうち、スコアが現在の解よりも良
いものに遷移することを繰り返して、最適解に近づいて
いくアルゴリズム.
第9回のDPのときにやった最適性原理(「次の状態での
最適解」=「今に至るまでの最適解」+「この時点での
最適な選択」)に通じるものがある.
解法1:山登り法
#1 初期解を適当に決める.
#2 現在の解の近傍を考える.
#3 その近傍に遷移することでスコアが良くなるなら遷移
する.
#4 解の改良ができなくなるまで#2、#3を繰り返す.
みなさんが2Aで受講したソフトウェアⅡの講義資料を
参考にしました 3.
実装はとても簡単です
なぜ山登り法というのか?
TSPのような組み合わせ最適化問題は、
⼀般化して以下のような図に落とし込める.
横軸が解、縦軸が評価関数(高いほどよい).
なぜ山登り法というのか?
ある解の地点𝑥0から最適解の探索を始めることを考える.
なぜ山登り法というのか?
図のように𝑥0の近傍𝑥1, 𝑥2を考えると、勾配が急な方向
(山を登る方向)に解を進めた方が、評価関数は大きく
なると分かる.
なぜ山登り法というのか?
図のように𝑥0の近傍𝑥1, 𝑥2を考えると、勾配が急な方向
(山を登る方向)に解を進めた方が、評価関数は大きく
なると分かる.
大きい!
なぜ山登り法というのか?
よって、解を𝑥1に遷移させる.
なぜ山登り法というのか?
再び図のように𝑥1の近傍𝑥3, 𝑥4を考えると、同じく勾配が
急な方向(山を登る方向)に解を進めた方が、評価関数
は大きくなると分かる.
なぜ山登り法というのか?
再び図のように𝑥1の近傍𝑥3, 𝑥4を考えると、同じく勾配が
急な方向(山を登る方向)に解を進めた方が、評価関数
は大きくなると分かる.
大きい!
なぜ山登り法というのか?
よって、解を𝑥3に遷移させる.
なぜ山登り法というのか?
このように、最適解の探索があたかも山登りをしている
ように見えるため、山登り法と呼ばれる.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#1 初期解はランダムに決める.
ここでは、単純に
「0 -> 1 -> 2 ->
3 -> 4 -> 5 -> 6 -> 7 ->
8 -> 9 -> 10 -> 0」を考える.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#1 初期解はランダムに決める.
ここでは、単純に
「0 -> 1 -> 2 ->
3 -> 4 -> 5 -> 6 -> 7 ->
8 -> 9 -> 10 -> 0」を考える.
TSPを山登り法で解く
#1 初期解はランダムに決める.
このときの経路長𝑑0は、
59.27(小数点第3位で四捨五入.
以降も同様)である.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#2 近傍を考える.
ここで、近傍は「経路のうち
2つの都市を入れ替えたもの」
とする.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#2 近傍を考える.
また、経路の組み合わせは
円順列であるため、始点[0]は
固定する(入れ替えない).
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#2 近傍を考える.
今回は入れ替えられる都市が
11-1=10個あるため、
近傍の数は 10𝐶2 通りある.
それらを、今より良い解が出る
まで順に見ていく.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#2 近傍を考える.
まず、[1]と[2]の順番を入れ
替える.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#2 近傍を考える.
まず、[1]と[2]の順番を入れ
替える.
(わかりやすいように
図中に青色で示した)
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#3 その近傍に遷移することで
スコアが良くなるなら遷移する.
このときの経路長𝑑1,2は、
66.41
である.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#3 その近傍に遷移することで
スコアが良くなるなら遷移する.
66.41 = 𝑑1,2 > 𝑑0 = 59.27より、
初期解の方が経路長が短い.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#3 その近傍に遷移することで
スコアが良くなるなら遷移する.
よって、この経路には遷移し
ない.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
同様にして、「経路のうち
2つの都市を入れ替えたもの」
をそれぞれ考えていく.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
なお、簡単のため、次で紹介
するのは「 [1]と[3]の順番を
入れ替えた近傍」ではなく、
「はじめて経路長が短くなる
近傍」とする.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#2 近傍を考える.
[2]と[4]の順番を入れ替えた
場合を考える.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#2 近傍を考える.
[2]と[4]の順番を入れ替えた
場合を考える.
(わかりやすいように
図中に青色で示した)
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#3 その近傍に遷移することで
スコアが良くなるなら遷移する.
このときの経路長𝑑2,4は、
57.31
である.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#3 その近傍に遷移することで
スコアが良くなるなら遷移する.
57.31 = 𝑑1,2 < 𝑑0 = 59.27より、
近傍の方が経路長が短い.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#3 その近傍に遷移することで
スコアが良くなるなら遷移する.
よって、この経路に遷移する. [0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
以降も、現在の経路の近傍を
考え、近傍のほうが経路長が
短くなるなら遷移することを
繰り返す.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
なお、この時点で 10𝐶2 通りの近傍を
考えるのは遷移先の経路(今回なら
初期解の[2]と[4]の順番を入れ替えた
もの)であり、遷移元の経路(今回
なら初期解)ではないことに注意する.
↑これではなく
↑これ
TSPを山登り法で解く
遷移元の経路について、残りの近傍
(組み合わせを順に見ていっている
のであれば、[3]と[6]や[4]と[9]を
入れ替えたもの)を考える必要は
ない.
↑これではなく
↑これ
TSPを山登り法で解く
#4 解の改良ができなくなるまで
#2、#3を繰り返す.
十分に遷移が行われたあと、
経路は右のようになる.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#4 解の改良ができなくなるまで
#2、#3を繰り返す.
このときの経路長𝑑は、
45.21
である.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#4 解の改良ができなくなるまで
#2、#3を繰り返す.
この経路については、
どのように近傍をとっても
経路長𝑑 = 45.21より小さく
ならない.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#4 解の改良ができなくなるまで
#2、#3を繰り返す.
よって、この経路が近似解と
なる.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを山登り法で解く
#4 解の改良ができなくなるまで
#2、#3を繰り返す.
よって、この経路が近似解と
なる.
注意:最適解とは限らない!
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
山登り法の実装(座標のリスト)
cities = [
[1, 2], [2, 4], # [0]、[1]
[1, -2], [-1, -3], # [2]、[3]
[-2, -1], [5, 1], # [4]、[5]
[6, 2], [2, 10], # [6]、[7]
[6, 8], [-4, 5], # [8]、[9]
[-2, 10]] # [10]
山登り法の実装(諸関数の定義)
# 2都市間の距離を返す関数
def distance_bw_cities(city1, city2):
return ((city2[0] - city1[0]) ** 2 + (city2[1] - city1[1]) **
2) ** 0.5
山登り法の実装(諸関数の定義)
# 経路長を返す関数
# routeは経路(0番目からN-1番目まで)、Nは都市の数
def distance_of_cities(cities, route, N):
distance = 0 # 距離
for i in range(N):
if i < N-1:
distance += distance_bw_cities(cities[route[i]],
cities[route[i+1]]) # distanceに都市間の距離を加算
山登り法の実装(諸関数の定義)
else: # もしN-1番目に回る都市を考えるならば
distance += distance_bw_cities(cities[route[i]],
cities[route[0]])# N-1番目と0番目の都市間の距離を加算
return distance
# routeには一番最後にroute[0]へ戻ってくるという情報がない
ため、距離計算の時に自分で補ってやる必要がある
山登り法の実装(初期解の生成)
import random # randomモジュールを使うため
import math # math.expを使うため
# 山登り法の本体部分
def tsp_hill_climbing(cities, N):
# 初期解をランダムに作成
route = []
visited = [False for _ in range(N)] # routeにappendしたかど
うかを管理するフラグ
山登り法の実装(初期解の生成)
for i in range(N): # ひとつずつ追加していく
while True:
r = random.randrange(0, N)# [0, N)の範囲で整数乱数を取得
if visited[r] == False: # もしまだ追加していないなら
visited[r] = True
break
route.append(r) # 追加
山登り法の実装(近似解の探索)
while True: # 改良ができる限りにおいて近傍を調べる
dis_origin = distance_of_cities(cities, route, N) # 現在の解の経路長
dis_new = dis_origin # 近傍の経路長(初期値は現在の解
の経路長)
山登り法の実装(近似解の探索)
# 𝑁−1𝐶2 通りある近傍を順に見ていく
for i in range(1, N-1): # route[0]は固定してroute[1]以降を考える
for j in range(i+1, N): # route[i+1]からroute[N-1]までを考える
# スワップ(近傍を取る)
route[i], route[j] = route[j], route[i]
# 近傍の経路長を計算
dis_new = distance_of_cities(cities, route, N)
山登り法の実装(近似解の探索)
# 現在の解と比較
if dis_new < dis_origin: # もし近傍の経路長の方が短いなら
break # もう元の解に用はないためループを抜ける
else: # もし現在の解の経路長の方が短いなら
route[i], route[j] = route[j], route[i] # 再度スワップしてもとに戻す
if dis_new < dis_origin: # もしforループをbreakで抜けていたなら
break # 同じくこのループも抜ける
山登り法の実装(近似解の探索)
if dis_origin <= dis_new: # どの近傍よりも現在の解の経路長のほうが短かったら
(今以上に良い解が一つも見つかっていなかったら)
break # これ以上探索の余地はないためwhileループを抜ける
# 近似解と経路長を表示
print(route)
print(distance_of_cities(cities, route, N))
山登り法の実行例
tsp_hill_climbing(cities, 11)
-----実行結果-----
[5, 2, 3, 4, 0, 1, 9, 10, 7, 8, 6]
43.30512147442405
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
山登り法の実行例
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
tsp_hill_climbing(cities, 11)
-----実行結果-----
[5, 2, 3, 4, 0, 1, 9, 10, 7, 8, 6]
43.30512147442405
確かに経路長は短くなっている.
山登り法の計算量
山登り法の計算量は、一般には定義できない.
山登り法は、正確には
アルゴリズム(厳密解を得る方法)ではなく
ヒューリスティクス(近似解を得る方法)である
ため.
山登り法の計算量
近似解をどの程度の精度で求めるかによって、計算量は
変わる.
また、近傍の定義のしかたによっても、計算量は変わる.
逆に、個別の問題に対して、近似解を求める精度や近傍
の定義を与えてやれば、計算量を定義できる.
今回の実装例における山登り法の計算量
都市の数を𝑁、近似解が見つかるまで経路が遷移する回数
(whileループが回る回数)を𝐾とする.
1つの経路について、近傍は 𝑁−1𝐶2 通り.
最悪の場合、最後の組み合わせ( [N-2]と[N-1]を入れ替
えたもの)になって初めて、近傍の経路長が現在の解の
経路長よりも短くなる.
今回の実装例における山登り法の計算量
よって、1回のwhileループについて、最大
𝑂
𝑁−1 𝑁−2
2
= 𝑂(𝑁2
)回の処理が発生することになる.
したがって、全体の計算量は𝑂 𝐾 × 𝑁2
= 𝑂(𝐾𝑁2
)となる.
山登り法の問題点
局所解に陥ってしまう可能性がある.
局所解とは、最適解ではない近似解のこと.
山登り法の問題点
ランダムに生成した初期解𝑥0から最適解の探索を始めた
とする.
山登り法の問題点
先ほども見たとおり、解が進むのは山を登る方向.
山登り法の問題点
よって、図のような近似解𝑥𝑛に収束する.
山登り法の問題点
しかしこれは、最適解𝑥𝑜𝑝𝑡ではない.
( 𝑒(𝑥𝑛) は𝑒(𝑥𝑜𝑝𝑡)よりも小さい.)
山登り法の問題点
よって、近似解𝑥𝑛は最適解ではなく局所解である.
それでは、どうするか
単純に山を登るだけでは、必ずしも最適解にはならない.
それでは、どうするか
単純に山を登るだけでは、必ずしも最適解にはならない.
→山を下った先の隣の山に最適解がある可能性を
無視しているため.
それでは、どうするか
単純に山を登るだけでは、必ずしも最適解にはならない.
→山を下った先の隣の山に最適解がある可能性を
無視しているため.
→山を下ることを許容すればよい.
解法2:焼きなまし法
現在の状態の「近傍」を調べ、
・スコアが良くなるときは必ず
・スコアが悪くなるときでも確率的に
その近傍に遷移する.
基本的には山登り法と⼀緒.
遷移のときのルールが若干異なるだけ.
解法2:焼きなまし法
#1 初期解を適当に決める.
#2 現在の解の近傍を考える.
#3 その近傍に遷移することでスコアが良くなるなら必ず、
悪くなるときでも確率的に遷移する.
#4 時間が十分に経つまで#2、#3を繰り返す.
山登り法と異なるのは#3(、#4)だけ!
「確率的に」をどうするか?
スコアが悪くなるときに遷移するときの「確率」はどう
定めればよいのか?
これは、名前にもある「焼きなまし」と深い関連がある.
焼きなましとは
甲斐 智によれば、焼きなましとは
「金属を加熱し状態を変化させたあと、炉に入れたまま
時間をかけてゆっくり放射冷却させていく処理」である 4.
この「最初は高温で、最後は低温」というところが
ポイントである。
「確率的に」をどうするか?
焼きなましにならい、温度という概念を導入する.
最初は高温にする.
そして、時間の経過とともに徐々に(線形に)冷まし、
低温にしていく.
「確率的に」をどうするか?
スコアが悪化する近傍に遷移する確率について、
i. 高温なら(時間がまだ経っていないなら)高く
ii. 低温なら(時間が十分に経っているなら)低く
する.
さらに、iiについて、
iii. スコアの悪化幅が大きいほど低く
する.
なぜそうするのか?
i. 高温なら(時間がまだ経っていないなら)高く
→ 局所解に陥ることを防ぐ.
ii. 低温なら(時間が十分に経っているなら)低く
→ 解が収束しなくなることを防ぐ.
iii. スコアの悪化幅が大きいほど低く
→悪すぎる解に落ち込むことを防ぐ.
焼きなまし法を図で見ると
先ほどと同じ初期解𝑥0で考える.
焼きなまし法を図で見ると
図のように𝑥0の近傍𝑥1, 𝑥2を考える.
なお、考える順番は𝑥1, 𝑥2の順とする.
焼きなまし法を図で見ると
𝑥1について、𝑒 𝑥1 < 𝑒(𝑥0)より、
𝑥1に遷移する確率は1未満の0.4となる.
焼きなまし法を図で見ると
今回はその確率が生じたとする.
焼きなまし法を図で見ると
この場合、解は𝑥1に遷移する.
焼きなまし法を図で見ると
このような操作を繰り返していけば、
(確率的に)最適解へとたどり着く.
焼きなまし法を図で見ると
このとき、時間は十分に経っている.
焼きなまし法を図で見ると
そのため、𝑥𝑛の近傍𝑥𝑛+1, 𝑥𝑛+2を考えても、
それらに遷移する確率は非常に低い.
焼きなまし法を図で見ると
よって、近傍には遷移しない(最適解に収束する).
TSPを焼きなまし法で解く
基本的には山登り法と同じ.
山登り法と異なるところ(#3 その近傍に遷移することで
スコアが良くなるなら必ず、悪くなるときでも確率的に
遷移する.)をどう実装するか?
TSPを焼きなまし法で解く(確率と温度)
i. 近傍の方がスコアが高いなら必ず(確率1[以上]で)
遷移する.
ii. 近傍の方がスコアが低いなら
a. 温度が高いほど高確率(ただし1未満)で
遷移する.
b. スコアが低くなるほど低確率で遷移する.
この3つの要素を確率𝑝に盛り込む.
TSPを焼きなまし法で解く(確率と温度)
温度𝑇についても考える. 時間を𝑡、終了時刻を𝑡𝑙𝑖𝑚とする.
i. 𝑡 = 0のとき、温度𝑇は開始温度(高温)である.
ii. 0 < 𝑡 < 𝑡𝑙𝑖𝑚のとき、温度𝑇は線形に減少していく.
iii. 𝑡 = 𝑡𝑙𝑖𝑚のとき、温度𝑇は終端温度(低温)である.
この3つの要素を温度𝑇に盛り込む.
TSPを焼きなまし法で解く(確率と温度)
確率𝑝を、温度𝑇、現在の解のスコア(経路長)𝑑、
解の近傍のスコア(経路長)𝑑′の3変数関数とする.
すなわち、𝑝 = 𝑓(𝑇, 𝑑, 𝑑′)とする.
また、温度𝑇を、開始温度𝑇𝑠、終端温度𝑇𝑒、時間𝑡、終了
時刻𝑡𝑙𝑖𝑚の4変数関数とする.
すなわち、𝑇 = 𝑔(𝑇𝑠, 𝑇𝑒, 𝑡, 𝑇𝑙𝑖𝑚)とする.
TSPを焼きなまし法で解く(確率と温度)
そして、確率𝑝、温度𝑇の式を以下のように与える.
𝑝 = exp
𝑑 − 𝑑′
𝑇
𝑇 = 𝑇𝑠 + 𝑇𝑒 − 𝑇𝑠 ×
𝑡
𝑡𝑙𝑖𝑚
TSPを焼きなまし法で解く(確率と温度)
なお、 開始温度𝑇𝑠、終端温度𝑇𝑒について、
𝑇𝑠は1回の遷移で動くスコア(経路長)幅の最大値程度に
𝑇𝑒は1回の遷移で動くスコア(経路長)幅の最小値程度に
するとよいことが知られている.
(焼きなまし法の実装方針と確率・温度の定義については、
gasinさんの記事を参考にしました 5.)
TSPを焼きなまし法で解く(確率と温度)
また、時間𝑡については、
近傍を⼀つ見るたびに1進むものとする.
TSPを焼きなまし法で解く(確率と温度)
確率𝑝、温度𝑇の式は先の条件を本当に満たしているのか?
グラフを描いて検証してみる.
TSPを焼きなまし法で解く(確率と温度)
横軸を𝑑 − 𝑑′
(近傍がどれだけ良い解か)として、
確率𝑝のグラフを考える.
・ 𝑇 = 10(固定)としたとき
TSPを焼きなまし法で解く(確率と温度)
横軸を𝑑 − 𝑑′
(近傍がどれだけ良い解か)として、
確率𝑝のグラフを考える.
・ 𝑇 = 10(固定)としたとき
i. が成立している.
(近傍の方がスコアが高い(d-d’>0)なら、
遷移確率が1以上になっている)
ii.b が成立している.
(近傍の方がスコアが低い(d-d’<0)なら、d-d’が小さいほど
遷移確率は小さくなっている)
TSPを焼きなまし法で解く(確率と温度)
横軸を𝑑 − 𝑑′
(近傍がどれだけ良い解か)として、
確率𝑝のグラフを考える.
・ 𝑇 = 100(固定)としたとき
TSPを焼きなまし法で解く(確率と温度)
横軸を𝑑 − 𝑑′
(近傍がどれだけ良い解か)として、
確率𝑝のグラフを考える.
・ 𝑇 = 100(固定)としたとき
ii.a が成立している.
(近傍の方がスコアが低い(d-d’<0)なら、温度が高いほど
遷移確率は大きくなっている)
TSPを焼きなまし法で解く(確率と温度)
横軸を時間𝑡として、温度𝑇のグラフを考える.
・ 𝑇𝑠 = 100, 𝑇𝑒 = 10, 𝑡𝑙𝑖𝑚 = 50としたとき
TSPを焼きなまし法で解く(確率と温度)
横軸を時間𝑡として、温度𝑇のグラフを考える.
・ 𝑇𝑠 = 100, 𝑇𝑒 = 10, 𝑡𝑙𝑖𝑚 = 50としたとき
i. が成立している.
(𝑡 = 0のとき、温度𝑇は開始温度である)
iii. が成立している.
(𝑡 = 𝑡𝑙𝑖𝑚のとき、温度𝑇は終端温度である)
ii. が成立している.
(0 < 𝑡 < 𝑡𝑙𝑖𝑚のとき、温度𝑇は線形に減少している)
TSPを焼きなまし法で解く(確率と温度)
これら確率𝑝、温度𝑇と遷移方法の変更を追加要素として、
先ほどの山登り法に盛り込み、焼きなまし法を行う.
なお、基本的な部分は山登り法と同じであるため、
同内容のものは適宜まとめている.
TSPを焼きなまし法で解く(確率と温度)
また、定数については、
開始温度𝑇𝑠 = 5、
終端温度𝑇𝑒 = 0.5、
終了時刻𝑡𝑙𝑖𝑚 = 10000
とする.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#1 初期解はランダムに決める.
ここでは、単純に
「0 -> 1 -> 2 ->
3 -> 4 -> 5 -> 6 -> 7 ->
8 -> 9 -> 10 -> 0」を考える.
このときの経路長𝑑0は59.27で
ある.
[山登り法のときと同内容のスライドにつき内容をまとめている]
TSPを焼きなまし法で解く
#2 近傍を考える.
今回は入れ替えられる都市が
11-1=10個あるため、
近傍の数は 10𝐶2 通りある.
それらをランダムに見ていく.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
[山登り法のときとほぼ同じスライド]
TSPを焼きなまし法で解く
#2 近傍を考える.
ランダムに見ていく理由は、
遷移が山登り法と違って
確率的だからである.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#2 近傍を考える.
山登り法は、近傍の方が経路
長が短くなる場合のみ遷移を
行っていた.
そのため、番号の小さい都市
から見ていっても、最終的には
偏っていない近似解が得られていた.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#2 近傍を考える.
⼀方焼きなまし法の場合、
もし順に見ていくとすると、
同じスコアが悪化する経路でも
番号の大きい都市同士より
番号の小さい都市同士を
入れ替えた経路の方に
遷移のチャンスが偏ってしまう.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#2 近傍を考える.
そのため、得られる近似解も
偏ってしまう.
それを防ぐために、近傍は
ランダムに選ぶこととする.
(このアイデアはPaizaさんからお借りしました 6.)
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#2 近傍を考える.
ここでは[1]と[2]がランダムに
選ばれたとし、その順番を
入れ替えることとする.
(わかりやすいように
図中に青色で示した)
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
[山登り法のときとほぼ同じスライド]
TSPを焼きなまし法で解く
#3 その近傍に遷移することで
スコアが良くなるなら必ず、
悪くなるときでも確率的に
遷移する.(長いため以降略記)
このときの経路長𝑑1,2は、
66.41
である.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#3 必ずor確率的に遷移する.
66.41 = 𝑑1,2 > 𝑑0 = 59.27より、
初期解の方が経路長が短い.
ここで確率𝑝を考える.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#3 必ずor確率的に遷移する.
𝑝 = exp
𝑑−𝑑′
𝑇
= 0.24 < 1となる.
まあ起こり得なくはない確率.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#3 必ずor確率的に遷移する.
ここではその確率が生起した
と仮定する.
すなわち、この経路に遷移する.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#2 近傍を考える.
次に、「経路長が短くなる
近傍」を考える.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#2 近傍を考える.
ここでは[1]と[4]がランダムに
選ばれたとし、その順番を入れ
替えることとする.
(わかりやすいように
図中に青色で示した)
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#3 必ずor確率的に遷移する.
このときの経路長𝑑2,4は、
60.46
である.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#3 必ずor確率的に遷移する.
60.46 = 𝑑2,4 < 𝑑1,2 = 66.41より、
近傍の方が経路長が短い.
ここで確率𝑝を考える.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#3 必ずor確率的に遷移する.
𝑝 = exp
𝑑−𝑑′
𝑇
= 3.29 > 1となる.
1以上なので、必ず起こる.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#3 必ずor確率的に遷移する.
よって、この経路に遷移する.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
以降も同様に、
現在の解の近傍を考え、
スコアが良くなるときは必ず、
悪くなるときでも確率的に遷移
することを繰り返す.
TSPを焼きなまし法で解く
#4 時間が十分に経つまで
#2、#3を繰り返す.
十分に時間が経ったあと、
経路は右のようになる.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#4 時間が十分に経つまで
#2、#3を繰り返す.
このときの経路長𝑑は、
44.95
である.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#4 時間が十分に経つまで
#2、#3を繰り返す.
よって、この経路が近似解と
なる.
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
TSPを焼きなまし法で解く
#4 時間が十分に経つまで
#2、#3を繰り返す.
よって、この経路が近似解と
なる.
注意:最適解とは限らない!
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
焼きなまし法の実装について
・座標のリスト
・諸関数の定義
・初期解の生成
については、山登り法と同様なので省略する.
ただし、焼きなまし法本体部分の関数名は
tsp_sim_annealingとする.
焼きなまし法の実装(近似解の探索)
temp_s = 5 # 開始温度
temp_e = 0.5 # 終端温度
temp = temp_s # 温度
t = 0 # 時間
T = 10000 # 終了時刻
while True: # 終了時刻になるまで近傍を調べる
i = random.randrange(1, N-1)# 入れ替える都市を[1, N-1)からランダムに選ぶ
j = random.randrange(i+1, N)# 入れ替える都市を[i+1, N)からランダムに選ぶ
焼きなまし法の実装(近似解の探索)
route[i], route[j] = route[j], route[i] # スワップ
dis_new = distance_of_cities(cities, route, N) # 近傍の経路長を計算
# 温度を計測
if temp > temp_e:
temp = temp_s + (temp_e - temp_s) * (t / T)
# 遷移確率を計算
prob = math.exp((dis_origin-dis_new) / temp)
焼きなまし法の実装(近似解の探索)
# 焼きなまし法で現在の解と比較
rand = random.random()
if prob <= rand: # もし確率が生起しなかったら
route[i], route[j] = route[j], route[i] # 再度スワップしてもとに戻す
# もし確率が生起したらそのまま何もしない(解は遷移させたまま)
t += 1 # 時間を進める
if t == T: # 終了時刻になったら
break # ループを抜ける
焼きなまし法の実装(近似解の探索)
# 近似解と経路長を表示
print(route)
print(distance_of_cities(cities, route, N))
焼きなまし法の実行例
[0]
[1]
[2]
[3]
[4] [5]
[6]
[7]
[8]
[9]
[10]
tsp_sim_annealing(cities, 11)
-----実行結果-----
[7, 8, 6, 5, 1, 0, 2, 3, 4, 9, 10]
42.546914264462586
確かに、経路長は山登り法の
ときよりも短くなっている.
焼きなまし法の計算量
焼きなまし法の計算量も、一般には定義できない.
理由は山登り法と同じ.
確率のとり方や近傍の定義のしかたによって、
計算量は変わる.
今回の実装例での焼きなまし法の計算量
都市の数を𝑁、終了時刻(whileループが回る回数)を𝑡𝑙𝑖𝑚
とする.
while文の中にあるループは、経路長を計算する箇所だけ.
この部分の計算量は𝑂(𝑁) .
よって、全体の計算量は𝑂(𝑡𝑙𝑖𝑚𝑁) になる.
焼きなまし法の問題点
・山登り法と比べて、より悪い解に陥ってしまう可能性
がある.
悪い解への確率的な遷移は、結果的に良い解に収束する
ことを必ずしも保証するわけではないため.
焼きなまし法の問題点(悪い解への収束)
先ほどと同じ初期解𝑥0で考える.
「最適解にたどり着ける」というのはあくまで確率的な
話であり、途中の山で止まってしまうことも確率的には
起こり得る.
焼きなまし法の問題点(悪い解への収束)
この場合、最適解𝑥𝑜𝑝𝑡はおろか、初期解から山登り法を
使って得られた近似解𝑥ℎ𝑖𝑙𝑙にすら劣っている.
焼きなまし法の問題点(悪い解への収束)
焼きなまし法の問題点
・初期温度や終端温度などの定数の調整が難しい.
定数をほんの少し変えただけで、得られる近似解は
良い方向にも悪い方向にも大きく変わる.
先ほどの実装例で示した定数の値は、
実はあれこれ試行錯誤をした結果得られたもの.
焼きなまし法の問題点(定数調整の難しさ)
・𝑇𝑠 = 5、𝑇𝑒 = 0.5、𝑡𝑙𝑖𝑚 = 10000のとき(先ほどの例)
近似解の経路長:42.55 (おそらく最適解)
焼きなまし法の問題点(定数調整の難しさ)
・𝑇𝑠 = 5、𝑇𝑒 = 0.5、𝑡𝑙𝑖𝑚 = 10000のとき(先ほどの例)
近似解の経路長:42.55 (おそらく最適解)
・ 𝑇𝑠 = 50、𝑇𝑒 = 0.05、𝑡𝑙𝑖𝑚 = 100のとき
近似解の経路長:72.63 (大ハズレ)
焼きなまし法の問題点(定数調整の難しさ)
・𝑇𝑠 = 5、𝑇𝑒 = 0.5、𝑡𝑙𝑖𝑚 = 10000のとき(先ほどの例)
近似解の経路長:42.55 (おそらく最適解)
・ 𝑇𝑠 = 50、𝑇𝑒 = 0.05、𝑡𝑙𝑖𝑚 = 100のとき
近似解の経路長:72.63 (大ハズレ)
・𝑇𝑠 = 1、𝑇𝑒 = 0.1、𝑡𝑙𝑖𝑚 = 100000のとき
近似解の経路長:42.55 (精度はいいが遅い……)
焼きなまし法の問題点(定数調整の難しさ)
この問題については、試行錯誤して良い定数を見つける
しかない.
この定数決定自体をも最適化するようなアルゴリズムを
組んでも良いかも!
山登り法と焼きなまし法の比較
項目 山登り法 焼きなまし法
時間計算量 𝑂(𝐾𝑁2
) 𝑂(𝑡𝑙𝑖𝑚𝑁)
初期解 大きく依存 それほど依存しない
局所解 陥りやすい 陥りにくい
最適解との
関係性
初期解によって
様々
確率的に近くなる
定数調整 不要 必要
実装 簡単 少し面倒
山登り法と焼きなまし法の比較
都市の数や配置を様々に変えて、
解の良さを比較してみる.
なお、焼きなまし法については、
開始温度𝑇𝑠 = 5、
終端温度𝑇𝑒 = 0.5、
終了時刻𝑡𝑙𝑖𝑚 = 10000
とした.
山登り法と焼きなまし法の比較
① 都市の数が6のとき
山登り法と焼きなまし法の比較
・山登り法
経路長: 32.51
実行時間:0.000186 s
・焼きなまし法
経路長: 32.51
実行時間:0.094571 s
① 都市の数が6のとき
山登り法と焼きなまし法の比較
① 都市の数が6のとき
近似解は、両者で⼀致している.
実行時間は、焼きなまし法が山登り法の
約500倍かかっている.
山登り法と焼きなまし法の比較
② 都市の数が14のとき
山登り法と焼きなまし法の比較
・山登り法
経路長: 75.08
実行時間:0.004220 s
・焼きなまし法
経路長: 74.71
実行時間:0.197572 s
② 都市の数が14のとき
山登り法と焼きなまし法の比較
② 都市の数が14のとき
近似解は、焼きなまし法の方が良い.
実行時間は、焼きなまし法が山登り法の
約50倍かかっており、差が縮まっている.
山登り法と焼きなまし法の比較
③ 都市の数が20のとき
山登り法と焼きなまし法の比較
・山登り法
経路長: 106.75
実行時間:0.019411 s
・焼きなまし法
経路長: 89.25
実行時間:0.268407 s
③ 都市の数が20のとき
山登り法と焼きなまし法の比較
③ 都市の数が20のとき
近似解は、焼きなまし法の方が約17ほど良い.
実行時間は、焼きなまし法が山登り法の
約25倍かかっており、さらに差が縮まっている.
まとめ
NP問題とは
今回は巡回セールスマン問題(TSP)を扱った
山登り法
実装は簡単だが、局所解に陥る可能性がある
焼きなまし法
最適解に達しやすいが、定数調整が面倒で、
山登り法より悪い局所解に陥る可能性もある
参考文献
1 山本 宙:「The P versus NP problem 計算量理論入門(P=NP 問題の紹
介)- アルゴリズムの評価と問題の複雑さ」,
東海大学, 2009.
URL: http://www.yamamotolab.jt.u-
tokai.ac.jp/~hiroshi/education/dsa/txt/complexity.html
(2023年7月9日閲覧)
2 Grant Holtes:「Playlist Optimisation as a Traveling Salesperson
Problem」, 2021.
URL: https://medium.com/dataseries/playlist-optimisation-as-a-
traveling-salesperson-problem-f31f73c417fa
(2023年7月9日閲覧)
参考文献
3 齋藤 大輔:「ソフトウェアII 第5回(2023/01/05)」, 東京大学, 2023.
URL: https://www.gavo.t.u-
tokyo.ac.jp/~dsk_saito/lecture/software2/resource/lecture5.html
(2023年7月12日閲覧)
4 甲斐 智:「熱処理とは?焼入れ・焼き戻し・焼きなまし・焼きならしを解
説」, ものづくりエンジニアのための「はじめの工作機械」, 2009.
URL: https://monoto.co.jp/heat-treatment/
(2023年7月12日閲覧)
参考文献
5 gasin:「誰でもできる焼きなまし法」, gasin’s blog, 2019.
URL: https://gasin.hatenadiary.jp/entry/2019/09/03/162613
(2023年7月12日閲覧)
6 Paiza:「焼きなまし法によるTSP (paizaランク S 相当)」,Paizaラーニン
グ.
URL:
https://paiza.jp/works/mondai/tsp_problems/tsp_problems__tsp_anneal
ing
(2023年7月12日閲覧)

More Related Content

What's hot

最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
joisino
 
Kaggle参加報告: Champs Predicting Molecular Properties
Kaggle参加報告: Champs Predicting Molecular PropertiesKaggle参加報告: Champs Predicting Molecular Properties
Kaggle参加報告: Champs Predicting Molecular Properties
Kazuki Fujikawa
 
深層生成モデルと世界モデル
深層生成モデルと世界モデル深層生成モデルと世界モデル
深層生成モデルと世界モデル
Masahiro Suzuki
 
【DL輪読会】Contrastive Learning as Goal-Conditioned Reinforcement Learning
【DL輪読会】Contrastive Learning as Goal-Conditioned Reinforcement Learning【DL輪読会】Contrastive Learning as Goal-Conditioned Reinforcement Learning
【DL輪読会】Contrastive Learning as Goal-Conditioned Reinforcement Learning
Deep Learning JP
 
線形?非線形?
線形?非線形?線形?非線形?
線形?非線形?
nishio
 
NIP2015読み会「End-To-End Memory Networks」
NIP2015読み会「End-To-End Memory Networks」NIP2015読み会「End-To-End Memory Networks」
NIP2015読み会「End-To-End Memory Networks」
Yuya Unno
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
Takami Sato
 
数学で解き明かす深層学習の原理
数学で解き明かす深層学習の原理数学で解き明かす深層学習の原理
数学で解き明かす深層学習の原理
Taiji Suzuki
 
機械学習と深層学習の数理
機械学習と深層学習の数理機械学習と深層学習の数理
機械学習と深層学習の数理
Ryo Nakamura
 
一般向けのDeep Learning
一般向けのDeep Learning一般向けのDeep Learning
一般向けのDeep Learning
Preferred Networks
 
深層学習の数理
深層学習の数理深層学習の数理
深層学習の数理
Taiji Suzuki
 
Kaggleのテクニック
KaggleのテクニックKaggleのテクニック
Kaggleのテクニック
Yasunori Ozaki
 
システム制御とディープラーニング
システム制御とディープラーニングシステム制御とディープラーニング
システム制御とディープラーニング
Keio Robotics Association
 
最適輸送入門
最適輸送入門最適輸送入門
最適輸送入門
joisino
 
方策勾配型強化学習の基礎と応用
方策勾配型強化学習の基礎と応用方策勾配型強化学習の基礎と応用
方策勾配型強化学習の基礎と応用
Ryo Iwaki
 
Transformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてTransformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法について
Sho Takase
 
グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門Kawamoto_Kazuhiko
 
PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説
弘毅 露崎
 
GBDTを使ったfeature transformationの適用例
GBDTを使ったfeature transformationの適用例GBDTを使ったfeature transformationの適用例
GBDTを使ったfeature transformationの適用例
Takanori Nakai
 
言語と画像の表現学習
言語と画像の表現学習言語と画像の表現学習
言語と画像の表現学習
Yuki Noguchi
 

What's hot (20)

最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
 
Kaggle参加報告: Champs Predicting Molecular Properties
Kaggle参加報告: Champs Predicting Molecular PropertiesKaggle参加報告: Champs Predicting Molecular Properties
Kaggle参加報告: Champs Predicting Molecular Properties
 
深層生成モデルと世界モデル
深層生成モデルと世界モデル深層生成モデルと世界モデル
深層生成モデルと世界モデル
 
【DL輪読会】Contrastive Learning as Goal-Conditioned Reinforcement Learning
【DL輪読会】Contrastive Learning as Goal-Conditioned Reinforcement Learning【DL輪読会】Contrastive Learning as Goal-Conditioned Reinforcement Learning
【DL輪読会】Contrastive Learning as Goal-Conditioned Reinforcement Learning
 
線形?非線形?
線形?非線形?線形?非線形?
線形?非線形?
 
NIP2015読み会「End-To-End Memory Networks」
NIP2015読み会「End-To-End Memory Networks」NIP2015読み会「End-To-End Memory Networks」
NIP2015読み会「End-To-End Memory Networks」
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
数学で解き明かす深層学習の原理
数学で解き明かす深層学習の原理数学で解き明かす深層学習の原理
数学で解き明かす深層学習の原理
 
機械学習と深層学習の数理
機械学習と深層学習の数理機械学習と深層学習の数理
機械学習と深層学習の数理
 
一般向けのDeep Learning
一般向けのDeep Learning一般向けのDeep Learning
一般向けのDeep Learning
 
深層学習の数理
深層学習の数理深層学習の数理
深層学習の数理
 
Kaggleのテクニック
KaggleのテクニックKaggleのテクニック
Kaggleのテクニック
 
システム制御とディープラーニング
システム制御とディープラーニングシステム制御とディープラーニング
システム制御とディープラーニング
 
最適輸送入門
最適輸送入門最適輸送入門
最適輸送入門
 
方策勾配型強化学習の基礎と応用
方策勾配型強化学習の基礎と応用方策勾配型強化学習の基礎と応用
方策勾配型強化学習の基礎と応用
 
Transformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法についてTransformerを多層にする際の勾配消失問題と解決法について
Transformerを多層にする際の勾配消失問題と解決法について
 
グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門
 
PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説PCAの最終形態GPLVMの解説
PCAの最終形態GPLVMの解説
 
GBDTを使ったfeature transformationの適用例
GBDTを使ったfeature transformationの適用例GBDTを使ったfeature transformationの適用例
GBDTを使ったfeature transformationの適用例
 
言語と画像の表現学習
言語と画像の表現学習言語と画像の表現学習
言語と画像の表現学習
 

Similar to TSPを山登り法と焼きなまし法で解く

文献紹介:Gate-Shift Networks for Video Action Recognition
文献紹介:Gate-Shift Networks for Video Action Recognition文献紹介:Gate-Shift Networks for Video Action Recognition
文献紹介:Gate-Shift Networks for Video Action Recognition
Toru Tamaki
 
Tokyo r27
Tokyo r27Tokyo r27
Tokyo r27
Takashi Minoda
 
実践コンピュータビジョン 3章 画像間の写像
実践コンピュータビジョン 3章 画像間の写像実践コンピュータビジョン 3章 画像間の写像
実践コンピュータビジョン 3章 画像間の写像
yaju88
 
多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討
Yu Sato
 
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
Toru Tamaki
 
Osc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseOsc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-database
Toshi Harada
 
Tsukuba.R #7 5/9
Tsukuba.R #7 5/9Tsukuba.R #7 5/9
Tsukuba.R #7 5/9Yo Ehara
 
文献紹介:Token Shift Transformer for Video Classification
文献紹介:Token Shift Transformer for Video Classification文献紹介:Token Shift Transformer for Video Classification
文献紹介:Token Shift Transformer for Video Classification
Toru Tamaki
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
Yoshiiro Ueno
 
日曜数学会 Ofdm
日曜数学会 Ofdm日曜数学会 Ofdm
日曜数学会 Ofdm
和人 桐ケ谷
 
文献紹介:Deep Analysis of CNN-Based Spatio-Temporal Representations for Action Re...
文献紹介:Deep Analysis of CNN-Based Spatio-Temporal Representations for Action Re...文献紹介:Deep Analysis of CNN-Based Spatio-Temporal Representations for Action Re...
文献紹介:Deep Analysis of CNN-Based Spatio-Temporal Representations for Action Re...
Toru Tamaki
 
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算(拡散方程式)2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算(拡散方程式)
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
智啓 出川
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
Kazuaki Ishizaki
 
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
Tomoharu ASAMI
 
Kosakunakano
KosakunakanoKosakunakano
Kosakunakano
ssuserb09fbd
 
20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_publicKazuaki Ishizaki
 
Tokyo r47 beginner_2
Tokyo r47 beginner_2Tokyo r47 beginner_2
Tokyo r47 beginner_2
Takashi Minoda
 
More modern gpu
More modern gpuMore modern gpu
More modern gpu
Preferred Networks
 

Similar to TSPを山登り法と焼きなまし法で解く (20)

文献紹介:Gate-Shift Networks for Video Action Recognition
文献紹介:Gate-Shift Networks for Video Action Recognition文献紹介:Gate-Shift Networks for Video Action Recognition
文献紹介:Gate-Shift Networks for Video Action Recognition
 
Tokyo r27
Tokyo r27Tokyo r27
Tokyo r27
 
実践コンピュータビジョン 3章 画像間の写像
実践コンピュータビジョン 3章 画像間の写像実践コンピュータビジョン 3章 画像間の写像
実践コンピュータビジョン 3章 画像間の写像
 
多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討
 
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
文献紹介:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
 
Osc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseOsc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-database
 
Tsukuba.R #7 5/9
Tsukuba.R #7 5/9Tsukuba.R #7 5/9
Tsukuba.R #7 5/9
 
Tokyo r33 beginner
Tokyo r33 beginnerTokyo r33 beginner
Tokyo r33 beginner
 
CMSI計算科学技術特論B(10) 大規模MD並列化の技術1
CMSI計算科学技術特論B(10) 大規模MD並列化の技術1CMSI計算科学技術特論B(10) 大規模MD並列化の技術1
CMSI計算科学技術特論B(10) 大規模MD並列化の技術1
 
文献紹介:Token Shift Transformer for Video Classification
文献紹介:Token Shift Transformer for Video Classification文献紹介:Token Shift Transformer for Video Classification
文献紹介:Token Shift Transformer for Video Classification
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
 
日曜数学会 Ofdm
日曜数学会 Ofdm日曜数学会 Ofdm
日曜数学会 Ofdm
 
文献紹介:Deep Analysis of CNN-Based Spatio-Temporal Representations for Action Re...
文献紹介:Deep Analysis of CNN-Based Spatio-Temporal Representations for Action Re...文献紹介:Deep Analysis of CNN-Based Spatio-Temporal Representations for Action Re...
文献紹介:Deep Analysis of CNN-Based Spatio-Temporal Representations for Action Re...
 
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算(拡散方程式)2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算(拡散方程式)
2015年度先端GPGPUシミュレーション工学特論 第8回 偏微分方程式の差分計算 (拡散方程式)
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
 
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
 
Kosakunakano
KosakunakanoKosakunakano
Kosakunakano
 
20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public20141224 titech lecture_ishizaki_public
20141224 titech lecture_ishizaki_public
 
Tokyo r47 beginner_2
Tokyo r47 beginner_2Tokyo r47 beginner_2
Tokyo r47 beginner_2
 
More modern gpu
More modern gpuMore modern gpu
More modern gpu
 

TSPを山登り法と焼きなまし法で解く