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

Meta Heuristics のすゝめ

thirofoo
August 10, 2023
76

Meta Heuristics のすゝめ

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 出来るだけ良いとされる解 スコアの高さ → 正解の中にも序列がある