Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Meta Heuristics のすゝめ

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for thirofoo thirofoo
August 10, 2023
81

Meta Heuristics のすゝめ

Avatar for thirofoo

thirofoo

August 10, 2023
Tweet

Transcript

  1. Meta Heuristics ( 簡易説明ver ) この差し手は100 点です。 データ ( 現在の状態

    ) 評価 乱択(*1)で手を指 したり戻したり 評価の高い手を出力
  2. Meta Heuristics ( 簡易説明ver ) この差し手は100 点です。 データ ( 現在の状態

    ) 評価 評価の高い手を出力 学習という概念が無く、乱択な探索を繰り返す ⇒ 問題の特性に合わせて工夫することで精度の良い解が出せる 乱択(*1)で手を指 したり戻したり
  3. Meta Heuristics ( 簡易説明ver ) この差し手は100 点です。 データ ( 現在の状態

    ) 評価 評価の高い手を出力 ではどうやって ↑ こいつ ↑ は操作を評価している ?? ⇒ 評価関数を自分で定義して、それを用いて評価している 乱択(*1)で手を指 したり戻したり
  4. Meta Heuristics ( 簡易説明ver ) 語句の説明 評価関数:今現時点での状態が良いか悪いかを数値化する関数。 目的関数:最終的に良い値にもっていきたい関数。 Ex )

    シューティングゲームで高スコアを取りたい時 評価関数:現時点での敵の数 * 自分の装備の強さ 目的関数:最終的なスコア 評価関数を最大化することが、目的関数の最大化に繋がるような、 因果関係を持つ評価関数を自分で決める。 ※ 目的関数が既に扱いやすい形なら、(評価関数) = (目的関数) になる時も普通にある。 これは自分が適当に作ったやつ。 ( ここを考えるのが Heuristic の 醍 醐味の1つでもある。 )
  5. Meta Heuristics ( 簡易説明ver ) データ ( 現在の状態 ) 評価

    ( 評価関数 f(x) ) 今現在の状態 X におけ る評価値は f(X) です。 乱択(*1)で手を指 したり戻したり 評価の高い手を出力 これが Meta Heuristics の基本構造
  6. Meta Heuristics 機械学習 必要なデータ量 少 ( 教師データ不要 ) 多 (

    運用を漏れなく模した膨大な データが必要 ) 要件変更への対応 部分的な修正で対応可能 1からやり直すケースがあり得る 計算時間 数分 ~ 数十分 数秒で出せる時もある 説明性・透明性 透明性が高い ブラックボックスになり易い Meta Heuristics と 機械学習の違い
  7. 説明の前に…(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; }
  8. 説明の前に… (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; }
  9. #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; } 実際のソースコード
  10. //温度関数 #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)); } 実際のソースコード
  11. 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; } 実際のソースコード
  12. Algorithm と Heuristic の違い Algorithm 厳密解 ( 全てのケースで正しい 解 )

    → 正解するか否かが重要 Heuristic 出来るだけ良いとされる解 スコアの高さ → 正解の中にも序列がある