*

pythonでシミュレーテッドアニーリング(SA法)のシミュレーションをしてみた

公開日: : 未分類

どうも! 今回は、最近扱ったプログラミングについて紹介したいと思います。

数学や、統計や物流などでよく扱われる、「最適解」を求める方法はいくつかあります。

こういう問題は、グラフにすると一目瞭然なのですが、コンピュータに計算させるとなるとなかなか難しいものです。

SA法が出来る前に、山登り法(ヒルクライム法)という手法がありました。

図1

 

図のように、このグラフの最大値を求めろという問題があったとします。

山登り法は、初期値がランダムで与えられて、そこからx軸の前後を比較し、良い解に進んでいくという手法です。

この山登り法では、局所解や、局所最適解、最適解どれかにはたどり着くことはできますが、最適解にたどり着く可能性は低いという問題点がありました。

そこで、局所解に陥ったとしても、なんとか抜け出して最適解に近づいていくアルゴリズムを持った手法が提案されました。 それが、シミュレーテッドアニーリング(以下SA法)という手法です。

SA(シミュレーテッド・アニーリング)法とは?

シミュレーテッド・アニーリング(Simulated Annealing:SA)は、Kirktpatrickらによって提案された組み合わせ最適化問題を解く汎用近似解法の一つである。
ほとんどの組み合わせ問題は、問題が大きくなると組み合わせ数が指数的に増大するために真の最適解を求めるのが実質的に不可能になってしまうのに対し、SAでは局所探索をランダムに繰り返し行うことで解を求める。更に解に改良が見られない場合でも確率的に改悪方向への移動を認めるために局所解に陥りにくく、良好な近似解を求めることができる。 参照(http://pure-tech.jp/delivery/sa/sa.html)
【長所】

1.局所解に陥りにくい

最急降下法といった古典的な最適化解法は、初期値の与え方によって往々にして局所最適解に陥りやすい。これに対し、SAでは解の改良方向を改悪方向へも探索を進めることで真の最適解に到達することが可能である。
【短所】

1.計算量が多い

最適解を得るのに非常に多くの計算量を要する。

2.個別にパラメータを設定する必要がある

汎用解法であるために、問題を解く場合には、配送経路であれば交通量や道路の広さといったパラメータチューニングなどを個別に行う必要がある。

簡単に言うと、、、

初めは大雑把な解を求めていって、徐々に細かい探索をしていくことで、局所解に陥りにくい探索が出来るというものです。

シミュレーションをしてみる

さて、どれほどのものなのかをシミュレーションしていきます。
Baidu IME_2014-5-28_11-29-40
の最小値を求めてみる。

作成した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分ほどでした。 さらに終了条件を限定させて、実行回数を増やせば、成功確率も上がります。

 

といった感じで以上メモでした。


密かにランキング登録しています!応援よろしくお願いします(´▽`)
にほんブログ村 大学生日記ブログ 理系大学生へ


関連記事

img178

ユニバーサルスタジオジャパン(USJ)が人気な理由

以前、ディズニーランドが人気な理由の関連記事ということでUSJはなぜ人気なのか。 その理由を考察した

記事を読む

tabi01051025

日本巡りの旅 9日目 ~出雲→名古屋~

ここまでのあらすじ 日本巡りの旅 1日目 ~埼玉→名古屋~  家を出発し、名古屋の名古屋まで行き

記事を読む

130108papertab02

【近未来】グニャグニャに曲がるタブレット ペーパータブ!

近未来を感じさせるものを発見したので紹介します。 その名もペーパータブ! 電子ペーパーデ

記事を読む

E382AFE383A9E382AFE382B7E383A7E383B3

車のクラクションの感じ取り方

あなたは車のクラクションについて深く考えたことありますか? 私はここまで気に留めてはこなかった

記事を読む

6006

【検証】電気ケトルとガスのコスパ比較

電気ケトルは百利あって一害なし! 初めて電気ケトルを買った私はそう思いました。 今回はその素晴

記事を読む

tabi01051025

日本巡りの旅 最終日 ~名古屋→箱根→埼玉~

ここまでのあらすじ 日本巡りの旅 1日目 ~埼玉→名古屋~  家を出発し、名古屋の名古屋まで行き着

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

Music-while-Jogging-02-630x419
【アイデア!】音楽とスピードを組み合わせたランニングのモチベーションを上げるアプリ

今回はちょっとしょうもないアイデアを一つ・・・笑 そのテーマは、

top
【ヒトカラ】私が一人でカラオケに行く理由

先日友人と「時間があるとき、何をしているか」という話題になって、私はす

常念岳
【大馬鹿野郎】常念岳で経験したこと

今回は少し前のことになりますが、初めて北アルプスの登山に挑戦した時の話

365738269ec2f83bf0773b42e7feb553
【考案】電子レンジを使って和風スープパスタを作る最適な茹で時間

こんにちは。 みなさん、レンジでパスタを作ったことはありますか?

20140926disney_04-480x240
【尻フェチ必見】ディズニーのお尻充電器!☆

みなさんこんにちは! 今日は少し可愛らしい充電器を見つけたので紹

→もっと見る

PAGE TOP ↑