Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Meta Heuristics のすゝめ
Search
thirofoo
August 10, 2023
83
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Meta Heuristics のすゝめ
thirofoo
August 10, 2023
More Decks by thirofoo
See All by thirofoo
深層強化学習を用いたテトリスBotの作成の試行
thirofoo
0
940
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
GraphQLとの向き合い方2022年版
quramy
50
15k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
320
Being A Developer After 40
akosma
91
590k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Agile that works and the tools we love
rasmusluckow
331
21k
Claude Code のすすめ
schroneko
67
230k
Balancing Empowerment & Direction
lara
6
1.2k
Transcript
Meta Heuristics のすゝめ
目次 1. Meta Heuristics について
1. Meta Heuristics について
そもそも Heuristics って何? 問題の解決や判断を助けるための近似的な方法やルールのこと。 ⇒ 概念が広すぎるので、今回は Meta Heuristics という分野に絞って説明
Meta Heuristics とは ? 最適化問題
最適化問題って…??
例1 もっと効率が良い 製造ラインの計画 を立てたいなー
例2 出来るだけ沢山の荷物を 運びたいけど荷物をどうい う風に積めばいいかな…。
例3 今積んである荷物を出 来るだけ短時間で届け たいなー
これら全部、最適化問題です。
世の中には最適化問題が沢山!
広大な探索空間
例:製造工程最適化 考えられる制約条件 ・作業の順序・依存関係 ・各作業にかかる時間 ・機械の利用状況・利用可能時間 ・製品の在庫レベル・保管容量 ・バッチサイズ ( 最大同時生産可能数 )
etc… 考慮しないといけ ないこといっぱい
現実的な時間では到底探索しきれないことが多い!
厳密解に近い近似解を高速に出せる手法がある! その1つが Meta Heuristics 。
参考 https://www.youtube.com/watch?v=Q4gTV4r0zRs&ab_channel=MiraikanChannel
Meta Heuristics と 機械学習 Meta Heuristics 目的関数を最大化または最小化する近似解 を見つける探索手法。 機械学習 データからパターンや関係性を学習し、未
知のデータに対する予測や分析を行う手法。
機械学習 ( 簡易説明ver ) 最善手は55玉です データ モデル
最善手は55玉です データ モデル 既存データから、正しく予測出来るようなモデルを生成することを機械学習という。 機械学習 ( 簡易説明ver )
Meta Heuristics ( 簡易説明ver ) この差し手は100 点です。 データ ( 現在の状態
) 評価 乱択(*1)で手を指 したり戻したり 評価の高い手を出力
Meta Heuristics ( 簡易説明ver ) この差し手は100 点です。 データ ( 現在の状態
) 評価 評価の高い手を出力 学習という概念が無く、乱択な探索を繰り返す ⇒ 問題の特性に合わせて工夫することで精度の良い解が出せる 乱択(*1)で手を指 したり戻したり
Meta Heuristics ( 簡易説明ver ) この差し手は100 点です。 データ ( 現在の状態
) 評価 評価の高い手を出力 ではどうやって ↑ こいつ ↑ は操作を評価している ?? ⇒ 評価関数を自分で定義して、それを用いて評価している 乱択(*1)で手を指 したり戻したり
Meta Heuristics ( 簡易説明ver ) 語句の説明 評価関数:今現時点での状態が良いか悪いかを数値化する関数。 目的関数:最終的に良い値にもっていきたい関数。 Ex )
シューティングゲームで高スコアを取りたい時 評価関数:現時点での敵の数 * 自分の装備の強さ 目的関数:最終的なスコア 評価関数を最大化することが、目的関数の最大化に繋がるような、 因果関係を持つ評価関数を自分で決める。 ※ 目的関数が既に扱いやすい形なら、(評価関数) = (目的関数) になる時も普通にある。 これは自分が適当に作ったやつ。 ( ここを考えるのが Heuristic の 醍 醐味の1つでもある。 )
Meta Heuristics ( 簡易説明ver ) データ ( 現在の状態 ) 評価
( 評価関数 f(x) ) 今現在の状態 X におけ る評価値は f(X) です。 乱択(*1)で手を指 したり戻したり 評価の高い手を出力 これが Meta Heuristics の基本構造
Meta Heuristics 機械学習 必要なデータ量 少 ( 教師データ不要 ) 多 (
運用を漏れなく模した膨大な データが必要 ) 要件変更への対応 部分的な修正で対応可能 1からやり直すケースがあり得る 計算時間 数分 ~ 数十分 数秒で出せる時もある 説明性・透明性 透明性が高い ブラックボックスになり易い Meta Heuristics と 機械学習の違い
2. 具体的な Heuristic の Logic
Heuristic でよく出る探索アルゴリズム ここが Meta Heuristics ( 今回は上の2つだけを説 明します! )
説明の前に(1)
説明の前に…(2) #include <bits/stdc++.h> using namespace std; inline unsigned int rand_int()
{ static unsigned int tx = 123456789, ty=362436069, tz=521288629, tw=88675123; unsigned int tt = (tx^(tx<<11)); tx = ty; ty = tz; tz = tw; return ( tw=(tw^(tw>>19))^(tt^(tt>>8)) ); } inline double rand_double() { return (double)(rand_int()%(int)1e9)/1e9; }
説明の前に… (3) namespace utility { struct timer { chrono::system_clock::time_point start;
// 開始時間を記録 void CodeStart() { start = chrono::system_clock::now(); } // 経過時間 (ms) を返す double elapsed() const { using namespace std::chrono; return (double)duration_cast<milliseconds>(system_clock::now() - start).count(); } } mytm; }
山登り法 目的関数のスコアが上昇した場合に限り 近接最適性
#define TIME_LIMIT 1000 int main(){ cout << setprecision(5) << fixed;
auto f = [](double x) -> double { return -pow(x,4) + 7*pow(x,3) - 9*pow(x,2) - 7*x + 5; }; double now = -1.40; utility::mytm.CodeStart(); while( utility::mytm.elapsed() <= TIME_LIMIT ) { double dx = (0.5 - rand_double()) / 3; // 近傍探索 if( f(now) < f(now+dx) ) now += dx; } cout << now << " : " << f(now) << endl; return 0; } 実際のソースコード
山登り法の遷移の plot の結果 -1.40 を start に、次第に評価関数 が大きい方向に移動している。 ただこちらの方が評価関数が 大きいのに、来れていない。
( 局所解にハマっている )
山登り法 1. 評価関数の決め方 2. 初期解の生成 3. 近傍の取り方
山登り法
山登り法 近傍が広いが故に、一気にここま で飛んで隣の山に移った。
焼きなまし法 一定の確率で悪い方向にも進ませてみる
焼きなまし法 採用確率 温度関数 Start_temp と end_temp を端点とし た直線を、横軸時間として結んだ直線 今と次の評価関数のスコア・温度関 数からなる、指数関数
( ௫ )
焼きなまし法 温度関数 Start_temp と end_temp を端点とし た直線を、横軸時間として結んだ直線 時間経過とともに温度が下がっている。 ( これが焼きなまし法の名前の由来
)
焼きなまし法 採用確率
//温度関数 #define TIME_LIMIT 1000 inline double temp(double start) { double
start_temp = 100,end_temp = 1; return start_temp + (end_temp-start_temp)*((utility::mytm.elapsed()-start)/TIME_LIMIT); } //焼きなましの採用確率 inline double prob(double best, double now, double start) { return exp((double)(now - best) / temp(start)); } 実際のソースコード
int main(){ cout << setprecision(5) << fixed; auto f =
[](double x) -> double { return -pow(x,4) + 7*pow(x,3) - 9*pow(x,2) - 7*x + 5; }; double now = -1.40; utility::mytm.CodeStart(); double start_time = utility::mytm.elapsed(); while( utility::mytm.elapsed() <= TIME_LIMIT ) { double dx = (0.5 - rand_double()) / 3; if( prob(f(now+dx), f(now), start_time) > rand_double() ) { now += dx; } } cout << now << " : " << f(now) << endl; return 0; } 実際のソースコード
焼きなまし法の遷移の plot の結果 -1.40 を start に、次第に評価関数 が大きい方向に移動している。 こっちまで探索出来てる! (
局所解にハマっていない )
焼きなまし法 温度を適切に決めれば、それだけで局所解に落ちない凄い良い解 に大変身! ゆるやかな評価関数を定義してあげないと全然 機能しない
焼きなまし法 温度を適切に決めれば、それだけで局所解に落ちない凄い良い解 に大変身! ゆるやかな評価関数を定義してあげないと全然 機能しない
3. Heuristic Contest での戦い方
Algorithm と Heuristic の違い Algorithm 厳密解 ( 全てのケースで正しい 解 )
→ 正解するか否かが重要 Heuristic 出来るだけ良いとされる解 スコアの高さ → 正解の中にも序列がある
実際に問題を見てみよう https://www.youtube.com/watch?v=Q4gTV4r0zRs&ab_channel=MiraikanChannel
Heuristic Contest でやる事一覧 ( 参考 )
1. 問題を読み込んでかみ砕く
1. 問題を読み込んでかみ砕く
2. Visualizer を実際に動かす Visualizerが提供されていて、今の自分の解を可視化出来るところ!
3. 無難な解を提出しよう
4. 時間一杯探索してみよう
更に高みを目指すなら…
最後に
皆さんが AHC の沼に入ることを心待ちにしてます!