pythonでシミュレーテッドアニーリング(SA法)のシミュレーションをしてみた
公開日:
:
未分類
どうも! 今回は、最近扱ったプログラミングについて紹介したいと思います。
数学や、統計や物流などでよく扱われる、「最適解」を求める方法はいくつかあります。
こういう問題は、グラフにすると一目瞭然なのですが、コンピュータに計算させるとなるとなかなか難しいものです。
SA法が出来る前に、山登り法(ヒルクライム法)という手法がありました。
図のように、このグラフの最大値を求めろという問題があったとします。
山登り法は、初期値がランダムで与えられて、そこからx軸の前後を比較し、良い解に進んでいくという手法です。
この山登り法では、局所解や、局所最適解、最適解どれかにはたどり着くことはできますが、最適解にたどり着く可能性は低いという問題点がありました。
そこで、局所解に陥ったとしても、なんとか抜け出して最適解に近づいていくアルゴリズムを持った手法が提案されました。 それが、シミュレーテッドアニーリング(以下SA法)という手法です。
SA(シミュレーテッド・アニーリング)法とは?
ほとんどの組み合わせ問題は、問題が大きくなると組み合わせ数が指数的に増大するために真の最適解を求めるのが実質的に不可能になってしまうのに対し、SAでは局所探索をランダムに繰り返し行うことで解を求める。更に解に改良が見られない場合でも確率的に改悪方向への移動を認めるために局所解に陥りにくく、良好な近似解を求めることができる。 参照(http://pure-tech.jp/delivery/sa/sa.html)
1.局所解に陥りにくい
1.計算量が多い
2.個別にパラメータを設定する必要がある
簡単に言うと、、、
シミュレーションをしてみる
作成したSA法のプログラムは以下の通り。
</p> <pre class="code lang-python" style="color: #454545;" data-lang="python" data-unlink=""># -+- coding: utf-8 -*- import random #ランダムモジュール import math def annealingoptimize(T=10000, cool=0.99, step=1): # ランダムな値で初期化 vec = random.randint(-2,2) while T > 0.0001: # 変更する変数を一つ選ぶ。 # 今回の場合は1次元なので選ぶ必要がない。 # i = random.randint(0, dimmension-1) # 変数の値を増加させるか、減少させるかを決定する。 dir = random.random() dir = (dir - 0.5) * step # 変数の値を変更する。 newvec = vec + dir # 変更前と変更後のコストを計算する。 newcost = costf(newvec) cost = costf(vec) # 温度から確率を定義する。 p = pow(math.e, -abs(newcost - cost) / T) print (p) # 変更後のコストが小さければ採用する。 # コストが大きい場合は確率的に採用する。 if(newcost < cost or random.random() < p): vec = newvec # 温度を下げる T = T * cool return vec def costf(x): return (3*(x**4)) - (5*(x**3)) + (2*(x**2)) if __name__ == '__main__': print (annealingoptimize()) if __name__ == '__main__': success, failure = 0,0 for i in range(0, 1000): ans = annealingoptimize() if (ans >= -0.05 and ans <= 0.05): failure += 1 if (ans > 0.8 and ans <= 0.9): success += 1 print (success,failure)</pre> </div> <div style="color: #000000;">
実行結果
成功 940
失敗 60
約95%の確率で、最適解にたどり着くことが出来ました。
今回はパラメータ数値が1つだけで非常にシンプルなデータを扱いましたが、パラメータが増えるだけで計算量は激増しますので、計算時間が非常に長くなります。
ちなみにこのプログラムの実行時間は約2分ほどでした。 さらに終了条件を限定させて、実行回数を増やせば、成功確率も上がります。
といった感じで以上メモでした。
密かにランキング登録しています!応援よろしくお願いします(´▽`)
関連記事
-
-
ユニバーサルスタジオジャパン(USJ)が人気な理由
以前、ディズニーランドが人気な理由の関連記事ということでUSJはなぜ人気なのか。 その理由を考察した
-
-
日本巡りの旅 9日目 ~出雲→名古屋~
ここまでのあらすじ 日本巡りの旅 1日目 ~埼玉→名古屋~ 家を出発し、名古屋の名古屋まで行き
-
-
【近未来】グニャグニャに曲がるタブレット ペーパータブ!
近未来を感じさせるものを発見したので紹介します。 その名もペーパータブ! 電子ペーパーデ
-
-
車のクラクションの感じ取り方
あなたは車のクラクションについて深く考えたことありますか? 私はここまで気に留めてはこなかった
-
-
【検証】電気ケトルとガスのコスパ比較
電気ケトルは百利あって一害なし! 初めて電気ケトルを買った私はそう思いました。 今回はその素晴
-
-
日本巡りの旅 最終日 ~名古屋→箱根→埼玉~
ここまでのあらすじ 日本巡りの旅 1日目 ~埼玉→名古屋~ 家を出発し、名古屋の名古屋まで行き着