Slide 1

Slide 1 text

メタヒューリスティクスで広がる 「解けた!」の世界 JOI夏季セミナー2023 全体講演会1 株式会社ALGO ARTIS 松尾 充

Slide 2

Slide 2 text

松尾 充 株式会社ALGO ARTIS まつお あたる (世界 位) 2196 アルゴリズム ヒューリスティック 最高 2920 @terry_u16 terry_u16 1992年 福岡県生まれ 九州大学に入学して機械工学を勉強 九州大学大学院の修士課程に進学 2010年 2014年 株式会社IHIに入社し戦闘機用ジェットエンジンを開発 うっかり競技プログラミングにハマってしまう 株式会社ALGO ARTISに入社しアルゴリズムを仕事に 2016年 2020年 2022年

Slide 3

Slide 3 text

講演のねらい 聞いてくださっている皆さんを AtCoder Heuristic Contestの世界へ 引きずり込むこと ではなく……

Slide 4

Slide 4 text

講演のねらい メタヒューリスティクスとは何か 実社会にどのように使われているか学び、 皆さんに興味を持ってもらうこと できればAHC (AtCoder Heuristic Contest) も始めてくれると嬉しいな……

Slide 5

Slide 5 text

講演の構成 第1部 はじめてのメタヒューリスティクス メタヒューリスティクスという言葉を初めて聞いたという人も多いのではないでしょうか。 第1部では、メタヒューリスティクスとは何か、 それを使うとどういった嬉しいことがあるのかについて学びます。 第2部 メタヒューリスティクスの実社会への応用 実社会ではどのようにメタヒューリスティクスが使われているのでしょうか。 第2部では、実社会で使われているメタヒューリスティクスについて見ていきます。

Slide 6

Slide 6 text

はじめてのメタヒューリスティクス 第1部

Slide 7

Slide 7 text

メタヒューリスティクスとは メタヒューリスティクスとは、組合せ最適化問題向けのアルゴリズムのうち、 最適解は保証されないが幅広い問題に適用できるもののことをいいます。 特に、解くのにとても長い時間のかかる難しい問題に対して有効です。

Slide 8

Slide 8 text

メタヒューリスティクスとは ……といってもよく分からないと思うので、 順を追って見ていきましょう!

Slide 9

Slide 9 text

第1部 はじめてのメタヒューリスティクス 課題 解決策 具体例 解くのが難しい問題 メタヒューリスティクスのここが嬉しい! メタヒューリスティクスの例

Slide 10

Slide 10 text

第1部 はじめてのメタヒューリスティクス 課題 解決策 具体例 解くのが難しい問題 メタヒューリスティクスのここが嬉しい! メタヒューリスティクスの例

Slide 11

Slide 11 text

「解くのが難しい問題」って何? 「解くのが難しい問題」と言っても、人によって思い浮かべるものは様々です。 あなたの思う「解くのが難しい問題」とは何か、考えてみてください。 「難しい問題」の定義の例 • 難しいアルゴリズムを使わないと解けない問題 今回は、「多項式時間アルゴリズムが見つかっていない問題」のこととします。 • 実装が大変な問題 • 考察のステップ数が多い問題 • 多項式時間アルゴリズム(𝑂 𝑁2 など)が見つかっていない問題

Slide 12

Slide 12 text

なぜ多項式時間で解きたいの? 多項式時間で解けないと、計算時間が大爆発してしまうためです。 そのため、多項式時間で解けない問題を「解くのが難しい問題」としました。 𝑵𝟐 𝑵𝟓 𝟐𝑵 𝑵! N=10 一瞬 一瞬 一瞬 0.003秒 N=20 一瞬 0.003秒 0.001秒 77年 N=50 一瞬 0.3秒 13日 1極年 N=100 一瞬 10秒 40兆年 3×10141年 以下の表は、1秒間に10億回の計算ができるコンピューターにおける入力サイズごとの計算時間のおおまかな目安です。 ※1極=1048乗 ※ 多項式時間 指数時間

Slide 13

Slide 13 text

「解くのが難しい問題」の例 「解くのが難しい問題」の一例を挙げてみました。 聞いたことのある問題も入っているかもしれません。 次のページから、巡回セールスマン問題の解き方について見ていきます。 巡回セールスマン問題 ナップサック問題 3-SAT問題 (一般化) テトリス (一般化) ぷよぷよ (一般化) 数独 (一般化) 詰め将棋 マリオメーカー ゲームの RTA (Real Time Attack)

Slide 14

Slide 14 text

巡回セールスマン問題 巡回セールスマン問題とは、一言で言えば 最小コストで全ての都市を回る経路を探す最適化問題です。 問題文 𝑁 個の都市があり、全ての都市同士の間は 道でつながっています。 都市 𝑖 から都市 𝑗 に移動するときの コスト(≒距離)は𝑑𝑖,𝑗 です。 松尾くんは都市 1 から出発して、都市 1 以外の 都市を全て回り、最後に都市 1 に戻ってきたいです。 そのときの合計コストの最小値を求めてください。 都市 1 都市 2 都市 3 都市 4

Slide 15

Slide 15 text

巡回セールスマン問題 - 解法を考えてみよう 初めて聞いたよ!という人 N = 7 のときにどうやったら解くことができそうか、ちょっと考えてみてください! もう解いたことあるよ!という人 N = 20, 100, 1000 のときに高速に解く方法がないか、考えてみてください! ただし、松尾くんはヒマなので、少しくらい最適解より悪くても大丈夫なものとします。

Slide 16

Slide 16 text

巡回セールスマン問題 - 全探索 全てのパターンを調べつくせば、間違いなく最適解が求められます。 この手法を全探索と呼びます。 3×2×1= 6 通り試せば 答えが分かる 1都市目の候補が 3通り 2都市目の候補が 2通り 3都市目の候補が 1通り

Slide 17

Slide 17 text

巡回セールスマン問題 - 全探索 都市がN個あるとき、何通り試せばよいか考えてみましょう。 多すぎてコンピュータを使っても無理!何かいい方法はないでしょうか? 𝑁 × 𝑁 − 1 × ⋯ × 2 × 1 のことを 階乗といい、 𝑁! と表します。 たとえば、 3! = 3 × 2 × 1 = 6 です。 詳しくは高校数学で学びますので、 お楽しみに! 4都市のとき、 3×2×1= 6通り 3! = 5都市のとき、 4×3×2×1= 24通り 4! = 6都市のとき、 5×4×3×2×1= 120通り 5! = 7都市のとき、 6×5×4×3×2×1= 720通り 6! = 8都市のとき、 7×6×5×4×3×2×1= 5,040通り 7! = 20都市のとき、 19×18×17×…×1= 121,645,100,408,832,000 通り 19! = ⋮ かいじょう

Slide 18

Slide 18 text

巡回セールスマン問題 - 動的計画法 実は全探索を行うとき、実質同じであるパターンがたくさん出てきます。 実質同じであるパターンをまとめて高速に計算する方法が動的計画法です。 1 2 3 4 5 6 7 8 これらはすべて 「都市1, 2, 3, 4, 5を訪問済で、 今は都市5にいる状態」として まとめてしまうことができ、 無駄な計算を省くことができます。 訪問済 未訪問 1 2 3 4 5 6 7 8

Slide 19

Slide 19 text

巡回セールスマン問題 - 動的計画法 動的計画法の計算量はどのくらいになるか、考えてみましょう。 まずは状態が何通りあるか考えてみます。 訪問済みの都市 都市ごとに「訪問済み」 「未訪問」の2通り 2N 通り 状態数 2つをかけ算して N2N 通り (くらい) 今いる都市 最後にいる都市の数は N 通り (くらい)

Slide 20

Slide 20 text

状態数 考えるべき状態の数は N2N 通り (くらい) 巡回セールスマン問題 - 動的計画法 状態数は約𝑁2𝑁通りと分かりました。 あとは次に行く都市の候補の数をかければ、計算量が分かります。 次の都市の候補 次に行く都市の数は N 通り (くらい) 計算量 2つをかけ算して N22N (くらい)

Slide 21

Slide 21 text

巡回セールスマン問題 - 動的計画法 動的計画法ではNがどのくらいの大きさになるまで解けるでしょうか? Nを変化させたときの N22N の値を調べてみましょう。 ※1秒間に10億回の計算ができるコンピューターでのおおよその所要時間を示しています。 ※計算時間だけでなく、メモリの使用量も問題になってきます。32都市の巡回セールスマン問題を解く場合、工夫しないと1TBほどのメモリが必要になります。 10都市のとき、 10×10×210= 102,400 → 一瞬 15都市のとき、 15×15×215 = 7,372,800 → 0.007秒 くらい 20都市のとき、 20×20×220 = 419,430,400 → 0.4秒 くらい 30都市のとき、 30×30×230 = 966,367,641,600 → 16分 くらい 50都市のとき、 50×50×250 = 2,814,749,767,106,560,000 → 89年 くらい 5都市のとき、 5×5×25= 800 → 一瞬 全探索より解ける幅は広がりましたが、まだまだNが大きくなると厳しい!

Slide 22

Slide 22 text

諦めるしかない……? 20~30都市くらいが限界というのはかなり厳しいですね。 「47都道府県を最短距離で回りたい」という問題さえ解けません。 コンピューターに解かせるのは諦めるしかないのでしょうか……?

Slide 23

Slide 23 text

メタヒューリスティクスを使えば解けるようになる! 「厳密解でなければダメ」という条件を外せば、 メタヒューリスティクスを使って 近似的に解けるようになります! そもそも普段生活していて、「厳密解でなければダメ」ということは少ないです。 5時間かかる道のりが5時間5分になってもあまり気にしないことが多いです。

Slide 24

Slide 24 text

第1部 はじめてのメタヒューリスティクス 課題 解決策 具体例 解くのが難しい問題 メタヒューリスティクスのここが嬉しい! メタヒューリスティクスの例

Slide 25

Slide 25 text

メタヒューリスティクスの嬉しいところ メタヒューリスティクスは、 このような難しい問題に対して使われるアルゴリズムです。 主に2つの嬉しいところがあります。 「解くのが難しい問題」が解けるようになる! 普通の解法では一生かかっても終わらなかった計算が、 実用的な時間で解けるようになって嬉しい! 幅広い問題に適用することができる! 問題1つ1つに対して1から解法を考えなくても、 同じ枠組みに沿って考えればいろんな問題に対応できて嬉しい!

Slide 26

Slide 26 text

「解くのが難しい問題」を解けるようになる! 普通の解法では一生かかっても終わらない計算が、 実用的な時間で解けるようになって嬉しい! 巡回セールスマン問題をいろんな近似解法で解く(その6: さまざまな近傍), take314 https://qiita.com/take314/items/69b93481403feb857d6e 例えば巡回セールスマン問題の場合、 普通の全探索では10都市ちょっと、 動的計画法でも30都市くらいが限界でした。 焼きなまし法(後述) を使うと、 1379都市の巡回セールスマン問題でも 4秒ほどでかなり良い解※が得られます。 ※この実行例では、最適解に対しておよそ+1.6%の解が得られたとのことです。

Slide 27

Slide 27 text

幅広い問題に適用することができる! (1/2) 実は巡回セールスマン問題に限って言えば、 もっと強力なアルゴリズムやソフトウェアが存在します。 Lin-Kernighan法 EAX Concorde 山登りベースだが、k-optという操作を効率的に行うアルゴリズム LKHという実装例が公開されている 遺伝的アルゴリズム系の比較的新しいアルゴリズム Kaggleの最適化コンテストで上位陣がみんな使っていたことで有名 厳密解法・近似解法いろいろ入ったすごいソフトウェア 85,900都市の巡回セールスマン問題の厳密解を出すことに成功 こんなに強い解法が既にあるなら、わざわざメタヒューリスティクスを勉強しなくても良いのでは? そんなことはありません!

Slide 28

Slide 28 text

幅広い問題に適用することができる! (2/2) メタヒューリスティクスの嬉しいところは、 研究者人生をかけて1から最強の解法を作らなくても 同じ枠組みに沿って考えればいろんな問題に対応できることです。 0 5 10 15 20 その他 全探索系 推定系 モンテカルロ法 貪欲法・ビームサーチ 山登り・焼きなまし 過去21回のAHCにおける強かった手法 ※重複あり、選定は松尾の独断と偏見です。漏れもあるかもしれないので参考程度に……。 過去のAHCにおいても幅広い問題で メタヒューリスティクス解法が上位を取っています。 新しい問題に出会うたびに 数年かけて新しい解法を考えるのは大変です。 メタヒューリスティクスを使えば、 いろんな問題を同じ枠組みで解くことができます。 この2つが代表的な メタヒューリスティクス

Slide 29

Slide 29 text

メタヒューリスティクスの長所と短所 メタヒューリスティクスは長所と短所を持ちますが、 使いどころを間違えなければとても強力なアルゴリズムとなります。 特定の問題に限定されず 幅広い問題に適用できる 問題専用に作られた アルゴリズムより 性能は落ちる 解くのが難しい問題を 実用的な速度で解ける 解の精度が 保証されておらず どのくらいよい解か不明 長所 短所 専用アルゴリズムが 存在しない問題に有効 精度の保証が不要で 難しい問題を解くときに 有効 使いどころ

Slide 30

Slide 30 text

第1部 はじめてのメタヒューリスティクス 課題 解決策 具体例 解くのが難しい問題 メタヒューリスティクスのここが嬉しい! メタヒューリスティクスの例

Slide 31

Slide 31 text

ビームサーチ 解の候補を1つではなく複数個保持して 解を作り上げていく貪欲法 山登り法 ある解を少し変更して改善したら採用し よりよい解に近付けていく方法 メタヒューリスティクスの一覧 メタヒューリスティクスにはいろいろな種類がありますが、 今回はよく使われるものに絞って紹介します。 貪欲法 その場その場で最もよい選択肢を選び 解を作り上げていく方法 焼きなまし法 改善しない場合も一定確率で採用し 局所解にハマりにくくした山登り法 発展 発展

Slide 32

Slide 32 text

貪欲法・ビームサーチ まずは貪欲法とビームサーチについて見ていきましょう。 ビームサーチは貪欲法の発展型なので、まずは貪欲法から説明します。 ビームサーチ 解の候補を1つではなく複数個保持して 解を作り上げていく貪欲法 山登り法 ある解を少し変更して改善したら採用し よりよい解に近付けていく方法 貪欲法 その場その場で最もよい選択肢を選び 解を作り上げていく方法 焼きなまし法 改善しない場合も一定確率で採用し 局所解にハマりにくくした山登り法 発展 発展

Slide 33

Slide 33 text

貪欲法 貪欲法とは、(後先考えずに)その場その場で最も良さそうな選択肢を選び、 解を一から作り上げていく方法です。 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 複数の選択肢から…… 一番良さそうなものを選択!

Slide 34

Slide 34 text

貪欲法の適用例 巡回セールスマン問題に貪欲法を適用してみましょう。 「未訪問の都市の中で最も近い都市に移動する」という貪欲にしてみます。 1 2 3 5 4 6 都市1からスタート 1 2 3 5 4 6 最寄りの都市6へ 1 2 3 5 4 6 最寄りの都市2へ 1 2 3 5 4 6 最寄りの都市3へ 1 2 3 5 4 6 最寄りの都市5へ 1 2 3 5 4 6 最寄りの都市4へ 1 2 3 5 4 6 都市1でゴール!

Slide 35

Slide 35 text

貪欲法の実装例 N = 4 cost = [[0, 5, 3, 8], [5, 0, 4, 6], [3, 4, 0, 9], [8, 6, 9, 0]] total_cost = 0 current_city = 0 visited = [True, False, False, False] order = [0] # 都市0以外のN-1都市を訪問するまでループ for _ in range(N - 1): # 最も近い次の都市を全探索 best_cost = 1000000000 best_city = -1 for next_city in range(N): if visited[next_city]: continue # コストが最小の場合は更新 next_cost = total_cost + cost[current_city][next_city] if next_cost < best_cost: best_cost = next_cost best_city = next_city # 次の都市に移動し、状態を更新する visited[best_city] = True order.append(best_city) total_cost = best_cost current_city = best_city # 最後に都市0に戻ってくる total_cost += cost[current_city][0] order.append(0) print(f"total_cost: {total_cost}") print(f"order: {order}") 入力の作成 合計コスト・現在位置・訪問済みフラグ・訪問順を初期化 都市0以外を全て訪問するまでループ まだ訪問していない都市を全探索し、 最もコストが小さい都市を次の都市として選ぶ 次の都市に移動する 合計コスト・現在位置・訪問済みフラグ・訪問順を更新 最後に都市0に戻る 合計コスト・訪問順を出力して終了

Slide 36

Slide 36 text

貪欲法の長所と短所 貪欲法の長所と短所を表にしてみました。 実装が簡単で動作が高速なため、初心者から上級者までオススメです。 実装が簡単 まずお試しで組んでみることがやりやすく、 より高度な手法を使う前の足がかりになる 長所 短所 動作が高速 今回のケースだと𝑂 𝑁2 となり、とても高速 他の手法と組み合わせて使うこともやりやすい 「損して得取れ」が難しい 基本的に後先考えずに動くので、 後ろの方にしわ寄せが行きやすい 評価関数のチューニングが難しい 選び方の基準となる評価関数によって 性能が変わり、そのチューニングが難しい 1 2 3 5 4 6 ※各状態の「良さ」を決める関数のことを「評価関数」といいます。

Slide 37

Slide 37 text

ビームサーチ ビームサーチとは貪欲法の発展形であり、貪欲法では1つしか持たなかった 解の候補を複数個保持して解を作り上げていく方法です。 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 複数の選択肢から…… 良さそうなものを複数選択!

Slide 38

Slide 38 text

ビームサーチの適用例 こちらも巡回セールスマン問題に適用してみましょう。 貪欲法をベースに「総コストの小さい3つを保持する」という方針にしてみます。 都市1からスタート 1 2 3 4 0分 候補3つとも保持 1 2 3 4 4分 1 2 3 4 6分 1 2 3 4 10分 1 2 3 4 9分 1 2 3 4 10分 1 2 3 4 10分 1 2 3 4 11分 ⋮ 1 2 3 4 13分 1 2 3 4 16分 1 2 3 4 14分 1 2 3 4 20分 1 2 3 4 20分 1 2 3 4 23分 上位3つまで保持 候補3つとも保持 解の完成!

Slide 39

Slide 39 text

貪欲法とビームサーチの比較 貪欲法では「その時点で一番良いもの」だけを考えていましたが、 ビームサーチでは「その時点で良い順にK番目まで」を考える点が異なります。 1 2 3 4 0分 1 2 3 4 4分 1 2 3 4 6分 1 2 3 4 10分 1 2 3 4 9分 1 2 3 4 10分 1 2 3 4 10分 1 2 3 4 13分 1 2 3 4 16分 1 2 3 4 14分 1 2 3 4 20分 1 2 3 4 20分 1 2 3 4 23分 1 2 3 4 0分 1 2 3 4 4分 1 2 3 4 9分 1 2 3 4 13分 1 2 3 4 23分 1個 K個 貪 欲 法 ビ ー ム サ ー チ

Slide 40

Slide 40 text

ビームサーチの実装例 長くなるので省略します!ごめんなさい!

Slide 41

Slide 41 text

山登り法・焼きなまし法 次に山登り法と焼きなまし法について見ていきましょう。 焼きなまし法は山登り法の発展型なので、まずは山登り法から説明します。 ビームサーチ 解の候補を1つではなく複数個保持して 解を作り上げていく貪欲法 山登り法 ある解を少し変更して改善したら採用し よりよい解に近付けていく方法 貪欲法 その場その場で最もよい選択肢を選び 解を作り上げていく方法 焼きなまし法 改善しない場合も一定確率で採用し 局所解にハマりにくくした山登り法 発展 発展

Slide 42

Slide 42 text

山登り法 山登り法(局所探索法) とは、ある解を少し変更してみて、改善したら採用し、 よりよい解に少しずつ近付けていく方法です。 1 2 3 4 1 2 3 4 微妙な解を…… 少し変更して改善!

Slide 43

Slide 43 text

なぜ山登り法という名前なの? 解を少しずつ改善していく動きが山を登っていくイメージに似ているため、 山登り法と呼ばれることが多いです。 初期解 下がることは しない 上がる方向なら 進んでいく 良い解が 得られた! スコア

Slide 44

Slide 44 text

山登り法の適用例 巡回セールスマン問題に山登り法を適用してみましょう。 巡回セールスマン問題では「ランダムな区間の訪問順を反転させる」※という2-optと呼ばれる変更が 有効なので、今回はその手法を試してみます。 1 3 2 4 52分 5 6 1 3 2 4 58分 5 6 1 3 2 4 43分 5 6 ※「2辺をランダムに選び、辺をつなぎ替える」と説明されることが多いですが、やっていることは同じです。 [3, 4]を 反転 [3, 5]を 反転 [3, 5, 6]を 反転 1 3 2 4 65分 5 6 1 3 2 4 74分 5 6 1 3 2 4 68分 5 6 [5, 3]を 反転 [5, 1, 2]を 反転 1 3 2 4 61分 5 6 [2, 4]を 反転

Slide 45

Slide 45 text

山登り法の実装例 # 制限時間の定義 TIME_LIMIT = 1.9 # 初期解 (state) を作る # ランダムな解にしても、貪欲法で解を作ってもよい state = generate_initial_state() start_time = get_time() # 時間いっぱいループ while get_time() - start_time < TIME_LIMIT: # 解を少し変化させる # 1箇所の値を変化させたり、2つの値を交換したり new_state = change_state(state) # スコアを計算する old_score = calculate_score(state) new_score = calculate_score(state) # スコアが悪化しなければ採用 if new_score >= old_score: state = new_state # 解を出力する print(state) 制限時間の定義 初期解を作成 ランダムな解を作っても、貪欲法などで解を作ってもよい 解の出力 制限時間になるまでループ 解を少し変化させる 古い解のスコアと新しい解のスコアを計算する スコアが悪化していなければ採用 ※擬似コードなので、そのままコピペしても動きません。

Slide 46

Slide 46 text

山登り法の長所と短所 山登り法の長所と短所を表にしてみました。 貪欲法以上に強力な手法なので、適用できる問題にはかなり強いです。 全体を見て判断できる 途中段階ではなく最終状態で評価できるので 「損して得取れ」という動きがとてもやりやすい 長所 短所 性能が高い 比較的実装がシンプルでありながら、 貪欲法よりも良い解を出しやすい 適用できる問題の幅が少し狭い テトリスのように「少し変えただけで最終状態が 大きく変わってしまう」ような問題は苦手 局所解にハマりやすい それ以上改善ができない局所解になりやすい (詳しくは次のページ)

Slide 47

Slide 47 text

局所解 山登り法では、「どちらに行ってもスコアが下がってしまう」という 嘘の最適解にハマってしまうことがあります。この解のことを局所解といいます。 初期解 頂上まで 来たつもりが…… より良い解に たどり着けない! スコア

Slide 48

Slide 48 text

焼きなまし法 「局所解にハマりやすい」という欠点を解消したのが焼きなまし法です。 ある確率でスコアが悪化する変更を許すことで局所解から脱出します。 初期解 悪化する変更も たまに許す スコア より良い解に 到達できた!

Slide 49

Slide 49 text

温度パラメータ 焼きなまし法で重要な役割を果たすのが温度パラメータです。 温度によってスコアが悪化する変更を採用する確率が変化します。 温度が高いとき スコアが悪化する変更を採用しやすく、 幅広い解を探し回ります。 山登り法というより、ランダムに近いです。 温度が低いとき スコアが悪化する変更を採用しにくく、 確実に良い解に近付いていきます。 山登り法に近い動きです。

Slide 50

Slide 50 text

温度スケジューリング 焼きなまし法では、序盤は温度を高くし、だんだんと温度を下げていきます。 序盤は幅広い解を探索し、終盤は確実に良い解に近付きます。 高温 低温 大きな解の悪化も許し 幅広い解を探し回る 少しずつ温度を下げて 探索する範囲を狭める 山登りのような動きになり 確実に良い解に近付く

Slide 51

Slide 51 text

焼きなまし法の実装例 詳細は割愛しますが、山登り法から解の採用判断だけ変更すればOKです。 # 制限時間の定義 TIME_LIMIT = 1.9 # 初期解 (state) を作る # ランダムな解にしても、貪欲法で解を作ってもよい state = generate_initial_state() start_time = get_time() # 時間いっぱいループ while get_time() - start_time < TIME_LIMIT: # 解を少し変化させる # 1箇所の値を変化させたり、2つの値を交換したり new_state = change_state(state) # スコアを計算する old_score = calculate_score(state) new_score = calculate_score(state) # スコアが悪化しなければ採用 if new_score >= old_score: state = new_state # 解を出力する print(state) ↑違いはここだけ! # 各種パラメータ定義 TIME_LIMIT = 1.9 START_TEMP = 10000 END_TEMP = 100 # 初期解 (state) を作る # ランダムな解にしても、貪欲法で解を作ってもよい state = generate_initial_state() start_time = get_time() # 時間いっぱいループ while get_time() - start_time < TIME_LIMIT: # 解を少し変化させる # 1箇所の値を変化させたり、2つの値を交換したり new_state = change_state(state) # スコアを計算する old_score = calculate_score(state) new_score = calculate_score(state) # 温度 (temperature) と遷移確率 (probability) を計算 time = (get_time() - start_time) / TIME_LIMIT temperature = pow(START_TEMP, 1 - time) * pow(END_TEMP, time) probatility = exp((new_score - old_score) / temperature) # スコアが悪化しなければ無条件で採用 # 悪くなっていても確率的に採用 if new_score >= old_score or random() < probatility: state = new_state # 解を出力する print(state) 山登り法 焼きなまし法 温度 温度パラメータ𝑇は、 開始温度を𝑇0 、終了温度を𝑇1 、 経過時間を𝑡 0 ≤ 𝑡 ≤ 1 として、 𝑇 𝑡 = 𝑇0 1−𝑡 × 𝑇1 𝑡 としています。 採用確率 採用確率𝑝は、スコア変化量をΔ𝑆、 温度を𝑇として、 𝑝 Δ𝑆, 𝑇 = ቊ 1 Δ𝑆 ≥ 0 𝑒 Τ Δ𝑆 𝑇 Δ𝑆 < 0 としています(最大化問題の場合)。 ※擬似コードなので、そのままコピペしても動きません。

Slide 52

Slide 52 text

焼きなましの長所 最強! というのは言いすぎですが、幅広い問題に対してとても高い性能を示します。

Slide 53

Slide 53 text

第1部のまとめ 1. 普通に解こうとすると、 時間がかかりすぎてまともに解けない問題がある 2. メタヒューリスティクスは難しい問題を解くためのアルゴリズムで、 幅広い問題が現実的な時間で解けるようになるので嬉しい 3. 代表的なメタヒューリスティクスには2つの種類があり、 貪欲法系と山登り法系に分けられる

Slide 54

Slide 54 text

メタヒューリスティクスの 実社会への応用 第2部

Slide 55

Slide 55 text

第2部 メタヒューリスティクスの実社会への応用 1. 巡回セールスマン問題と見なせる実社会の問題たち 2. 実社会への応用例の紹介

Slide 56

Slide 56 text

第2部 メタヒューリスティクスの実社会への応用 1. 巡回セールスマン問題と見なせる実社会の問題たち 2. 実社会への応用例の紹介

Slide 57

Slide 57 text

巡回セールスマン問題と見なせる実社会の問題 巡回セールスマン問題はさまざまな応用先があります。 どんな問題が巡回セールスマン問題と見なせるかについて見ていきましょう。 倉庫における 荷物のピッキング 電子回路基板の 穴開け順最適化 工具の取り替え順序 最適化

Slide 58

Slide 58 text

倉庫における荷物のピッキング あなたはネットショッピングの倉庫で品物を集めるアルバイトをしています。 注文ごとに品物のリストを受け取り、できるだけ早く品物を集めたいです。 どのような経路で回ればよいでしょうか?

Slide 59

Slide 59 text

倉庫における荷物のピッキング 全ての場所を1回ずつ訪れて元の位置に帰ってきたい → 巡回セールスマン問題 とみなして解くことができる

Slide 60

Slide 60 text

電子回路基板の穴開け順最適化 あなたは工場で電子回路の基板に穴を開ける装置の設定をしています。 必要な場所に穴を開けるためには、ドリルを前後左右に動かす必要があります。 たくさん基板を作りたいので、できるだけ高速に穴を開ける順序を求めたいです。 どのような順序で穴を開ければよいでしょうか? 電子回路 ドリル(イメージ) ドリルによる穴開け

Slide 61

Slide 61 text

電子回路基板の穴開け順最適化 人が移動するのもドリルが移動するのも同じ → 巡回セールスマン問題 とみなして解くことができる 実問題では数千点の穴を開ける必要があることも! 定位置

Slide 62

Slide 62 text

工具の取り替え順序最適化 あなたは工作用ロボットの取り扱いをしています。 ロボットを用いて作りたい品物が3つあり、それぞれ必要な工具が異なります。 ロボットが工具を取り替えるとき、表に示す取り替え時間がかかります。 どのような順番で作れば取り替え時間が最小になるでしょうか? なし なし - 15秒 10秒 30秒 15秒 - 25秒 15秒 10秒 25秒 - 5秒 30秒 15秒 5秒 - 取り替え後の工具 取 り 替 え 前 の 工 具 工具取り替え時間の一覧表 ロボットと工具 作りたい品物

Slide 63

Slide 63 text

工具の取り替え順序最適化 情報を整理してみましょう。 取り替え前後の時間の表を図に整理すると、右上の図のようになります。 全ての状態を1回ずつ訪れてから元の状態に戻ってきたい → 巡回セールスマン問題 とみなして解くことができる なし なし - 15秒 10秒 30秒 15秒 - 25秒 15秒 10秒 25秒 - 5秒 30秒 15秒 5秒 - 取り替え後の工具 取 り 替 え 前 の 工 具 なし 10秒 15秒 5秒 15秒 30秒 25秒

Slide 64

Slide 64 text

身近に潜んでいる最適化問題たち このように、一見未知の問題のように見えても 見方を変えて考察すれば知っている問題になったりします。 普段のなにげない生活の中に最適化問題が潜んでいないか 意識して見てみるのも面白いかもしれません。

Slide 65

Slide 65 text

第2部 メタヒューリスティクスの実社会への応用 1. 巡回セールスマン問題と見なせる実社会の問題たち 2. 実社会への応用例の紹介

Slide 66

Slide 66 text

実社会への応用例の紹介 巡回セールスマン問題に限らず、 実社会の問題でメタヒューリスティクスが使えるものはたくさんあります。 今回はその一部の例を見ていきましょう。 テレビ放送網の 最適化 工場の生産計画 最適化 貨物船の運航計画 最適化

Slide 67

Slide 67 text

テレビ放送網の最適化 どのように放送局同士をつなぎ、どのくらいの強度で電波を発信すれば 全ての住人にできるだけ安くテレビの電波を届けられるかという問題です。 現実にある問題ではなくAHC020の問題なのですが、題材としてちょうど良いので紹介します。 ちなみにwriterは私です。 問題文 高橋社長は公式生放送「あーだこーだー」をテレビ放送したいです。 放送するためには、オフィスと放送局を通信ケーブルでつなぎ、 放送局から電波を発信する必要があります。 高橋社長は全住民に生放送を配信したいのですが、 通信ケーブルと電波の発信にはコストがかかります。 できるだけコストを抑えつつ、 全住民に生放送の配信ができるような放送網を作ってください。 オフィス 住民 放送局 通信ケーブル 電波の届く範囲 ※この問題文はフィクションです。実在の人物・団体・番組・chokudaiさんとは一切関係がありません。

Slide 68

Slide 68 text

テレビ放送網の最適化 writer解は焼きなましでした。 この動画のように序盤は幅広い解を探索し、終盤は確実に良い解に近付きます。 高温 低温 大きな解の悪化も許し 幅広い解を探し回る 山登りのような動きになり 確実に良い解に近付く

Slide 69

Slide 69 text

工場の生産計画最適化 ALGO ARTIS、株式会社日本触媒に高吸水性樹脂の生産計画最適化ソリューションを提供 | 株式会社ALGO ARTIS https://www.algo-artis.com/news/20221004

Slide 70

Slide 70 text

貨物船の運航計画最適化 東北電力株式会社へ最適化AI(アルゴリズム)を活用した配船計画最適化ソリューションを提供 | 株式会社ALGO ARTIS https://www.algo-artis.com/news/20220920

Slide 71

Slide 71 text

社会的なインパクト メタヒューリスティクスを実社会の問題に適用するのは、 社会的なインパクトがとても大きい仕事です。 コスト削減 例えば年間数百億円の業務の効率を1%上げることができれば、 年間数億円のコスト削減効果が得られます。 複数パターン検討 人手で計画を作ると1つの計画を立てるので精一杯ですが、 最適化で高速に計画を作れば複数パターンの検討ができます。 属人化の排除 計画作成という仕事は難しく、ベテランの勘頼みになりがちですが、 最適化を使えばベテランでなくても計画を作れるようになります。 少しでもこういった仕事が面白そうだなと思ってもらえたら嬉しいです。

Slide 72

Slide 72 text

第2部のまとめ 1. 一見未知の問題のように見えても、 実は見方を変えれば知っている問題と同じになることがある 2. メタヒューリスティクスは実社会の問題にも使われており、 コスト削減や属人化の排除などの大きな社会的インパクトがある

Slide 73

Slide 73 text

おわりに

Slide 74

Slide 74 text

おわりに メタヒューリスティクスは、 今まで解けなかった問題が解けるようになる強力な武器です。 皆さんもメタヒューリスティクスを学び、 「解けた!」の世界を広げてみませんか?

Slide 75

Slide 75 text

もっと学びたい人向けの参考資料 最後に、もっと学びたい人向けの資料紹介をして 講演の締めとします。

Slide 76

Slide 76 text

オススメの本 ゲームで学ぶ探索アルゴリズム実践入門 青木栄太 著/技術評論社 メタヒューリスティクスをはじめとする幅広い探索アルゴリズムがぎゅっと詰まった一冊! 丁寧な実装例付きで、各手法の基礎から一歩進んだテクニックまで学べます。 初心者から上級者まで、メタヒューリスティクスをじっくり学びたい人にオススメです! https://book.mynavi.jp/ec/products/detail/id=131288 https://gihyo.jp/book/2023/978-4-297-13360-3 競技プログラミングの鉄則 アルゴリズム力と思考力を高める77の技術 米田優峻 著/マイナビ出版 メタヒューリスティクス関連の章は1章だけですが、とても分かりやすくまとまっています! AtCoder上での自動採点システムも提供されているので、定着度の確認もバッチリです。 アルゴリズムもメタヒューリスティクスも勉強してみたい初~中級者の方にオススメです!

Slide 77

Slide 77 text

オススメの問題 AHCのうち、長期コンテストは複雑な問題が出されることが多いので、 まずは短期コンテスト(4時間程度)で学んでみるのがオススメです。 Introduction to Heuristics Contest 問題がシンプルな上、いろいろな解法で解くことができる良問です。 wataさんの解説pdfがとても丁寧です。 私もこれでメタヒューリスティクスに入門しました。 AtCoder Heuristics Contest 020 手前味噌ですが、私がwriterを務めた問題です。 基本問題から一歩進んだ貪欲法や焼きなましの練習にどうぞ。 解説放送で、いろいろな解き方をステップを踏みつつ紹介しています。

Slide 78

Slide 78 text

ご清聴ありがとうございました!