最優化演算法 模擬退火 Python實現

2021-09-24 20:10:02 字數 3302 閱讀 5659

模擬退貨演算法可以分解為解空間、目標函式和初始解三部分

求乙個函式的最優解可以通過貪心演算法獲得其最優解,但有可能是區域性最有解,而不是全域性最優解。為了解決這一問題,產生了模擬退火演算法,該演算法是在搜尋的過程中加入了隨機的因素,以一定的概率接受比當前解要差的解,因此有可能會跳出這個區域性最優解,達到全域性最優解。

初始化:初始溫度 t

tt, 溫度變化率 δ

t\delta t

δt(通常取值0.95

−0.99

0.95-0.99

0.95−0

.99),初始解狀態 s

ss,每個t

tt值的迭代次數 lll;

對 k =1

,...

,l

k=1, ..., l

k=1,..

.,l 做第 3 至第 6 步;

產生新解 s′s'

s′;計算增量 δt′

=c(s

′)−c

(s

)\delta t' = c(s') - c(s)

δt′=c(

s′)−

c(s)

,其中 c(s

)c(s)

c(s)

為評價函式;

若 δ t′

<

0\delta t' < 0

δt′<

0 則接受 s′s'

s′作為新的當前解,否則以概率 met

ropo

li

smetropolis

metrop

olis

準則接受 s′s'

s′作為當前解;

如果滿足終止條件則輸出當前解作為最優解,結束程式;

t

tt 根據 δ

t\delta t

δt逐漸減少,且 t→0

t \to 0

t→0,然後轉向第二步。

metropolis準則

p

=1&, ) < e(x_)}\\ exp(-\frac) - e(x_)}&, ) \geq e(x_}) \end

p=) \geq e(x_)

e(xnew

​)≥e

(xol

d​) 時,求出的 p

pp 在 (0,

1)

(0, 1)

(0,1

) 之間,以此概率接受比當前解要差的解。

初始溫度:初始溫度的確定可以隨機產生資料來粗略的估計一下,比如可以先進行100個迭代,計算出目標函式的平均差值或者最大差值,再根據你希望的初始溫度下由當前解轉換為較差的解的概率和metropolis準則計算出初始溫度。

最小溫度:可以設定的很小,進行很多次的迭代,找到全域性最優解。

溫度變化率:一般設定為 0.95

−0.99

0.95 - 0.99

0.95−0

.99 之間的值,一般使用 t(i

+1)=

δt∗t

(i

)t(i + 1) = \delta t * t(i)

t(i+1)

=δt∗

t(i)

來衰減溫度,當然也可以根據自己想要的衰減速率選取合適的公式。

目標函式:要求解的函式。

生成新解:可以在當前解的基礎上進行部分或者全部值的改動,根據自己解的需求限定當前解的範圍。

# -*- coding: utf-8 -*-

import math

import random

iters =

100# 每個溫度下的迭代次數

t =100

# 初始溫度

t_min =

0.002

# 溫度最小值

delta_t =

0.98

# 溫度變化率

classsa:

''' 求最小值

'''def__init__

(self)

: self.t = t

self.iters = iters

self.t_min = t_min

self.delta_t = delta_t

defsa(self, fun)

:'''

模擬退火演算法

:param fun: 目標函式

:return:

'''x_old = self._init_x(

) y_old = fun(x_old)

while self.t > self.t_min:

for i in

range

(self.iters)

: x_new = self._update_x(x_old)

y_new = fun(x_new)

loss = y_new - y_old

if loss <=0:

# 替換比當前解好的解

x_old = x_new

y_old = y_new

else

: random_p = random.random(

)if self.metropolis(loss)

> random_p:

# 以一定概率替換比當前解差的解

x_old = x_new

y_old = y_new

# 是否滿足條件, 滿足則結束, 不滿足則更新溫度繼續

self.t *= self. delta_t

# 最終儲存或者輸出最優解

print

("x {}, y {}"

.format

(x_old, y_old)

)def

metropolis

(self, loss)

:return math.e **

(loss / self.t)

def_update_x

(self, x_old)

:'''

生成新解

:return:

'''pass

def_init_x

(self)

:'''

設定初始解

:return:

'''pass

優化演算法(二)模擬退火演算法

import numpy as np 隨機確定變化的方向 def direction2 if np.random.random 0.5 return 1 return 1 隨機確定是否接受較差的解 def direction3 delta,t chance np.exp 1 delta t if n...

智慧型優化演算法之模擬退火演算法

詳細的 解釋及背景,過幾天再進行補充 模擬退火演算法 問題背景是tsp問題,有100個旅遊景點。並且假設距離矩陣d已經給出。d已知 sum inf for j 1 1000 s 1,1 randperm 100 102 temp 0 for i 1 101 temp temp d s i s i 1...

python實現模擬退火演算法

問題 求f x 在定義域 5,8 上的最大值 原始碼 模擬退火法 import numpy as np import math 定義域x從5到8閉區間 bound 5,8 tmp 1e2 tmp min 1e 3 alpha 0.98 beta 1 def f x return math.sin x...