執行環境:windows10,python3.7
1.問題模型:
y =(
x−7)
∗(x+
2)∗(
x−6)
∗(x+
9)∗s
in(x
)∗si
n(0.5∗x)
y=(x-7)*(x+2)*(x-6)*(x+9)*sin(x)*sin(0.5*x)
y=(x−7
)∗(x
+2)∗
(x−6
)∗(x
+9)∗
sin(
x)∗s
in(0
.5∗x),x
∈[−10
,10], x \in [-10,10]
,x∈[−1
0,10
]函式影象如圖
求解最小解,及其值?
2.模擬退火演算法是用於解決最優化問題的一種啟發式搜尋(ea)演算法。
init_temperature = 1000 #初始溫度
min_temperature= 1 #溫度下限
cycle_iterator = 1000 #每個t值的迭代次數
decay_factor = 0.95 #溫度衰減係數
3.求解效果
python**片【anneal上的子函式排列順序與annea的**中函式呼叫順序一致】
.
import random
import math
import matplotlib.pyplot as plt
import numpy as np
###########全域性引數##################
init_temperature =
1000
#起始溫度
min_temperature=
1#溫度底線
cycle_iterator =
1000
#每個t值的迭代次數
decay_factor =
0.95
#溫度衰減係數
####################################
########被求解函式影象
defissue()
: x=np.linspace(-10
,10,10000
) y=
(x-7)*
(x+2)*
(x-6)*
(x+9
)*np.sin(x)
*np.sin(
0.5*x)
plt.plot(x, y,
'r')
plt.show(
)########進行擾動
defdisturbance
(x1)
: x2=x1+(2
*random.random()-
1)#隨機產生[-1,1]之間的擾動
return x2
########判斷是否接受x2
defaccept_x2
(x1,x2,differ_e,now__temperature)
: x=x1
if differ_e<0:
x = x2
else
:a p = np.exp(
-(differ_e)/(
1*now__temperature)
)if random.random(
)x = x2
return x
########函式
deffunction
(x):
y=(x-7)*
(x+2)*
(x-6)*
(x+9
)*np.sin(x)
*np.sin(
0.5*x)
return y
########退火過程
defannealing
(init_x,init_temperature)
: x1=init_x
now__temperature=init_temperature
iterator_counter=
0#迭代計數器-計數總共迭代次數
results=
#計算結果
while now__temperature>min_temperature:
for i in
range(0
,cycle_iterator)
: x2 = disturbance(x1)
if x2>=-10
and x2<=10:
#函式區間
function_value1 = function(x1)
function_value2 = function(x2)
differ_e= function_value2 -function_value1#能差
x1=accept_x2(x1,x2,differ_e,now__temperature)
now__temperature = now__temperature*decay_factor
iterator_counter+=
1#不斷新增新行
return iterator_counter,results
########畫圖
defdraw_plot
(iterator_counter,results)
: x_axis =
y_axis =
for i in
range
(iterator_counter):)
plt.plot(x_axis, y_axis)
#x為被迭代到第幾次,y為被迭代到該次的優解
plt.show(
)########'main__':
init_x =10*
(2*random.random()-
1)#產生初始解
iterator_counter,results=annealing(init_x,init_temperature)
issue(
) draw_plot(iterator_counter,results)
啟發式演算法 模擬退火演算法
爬山演算法 是一種簡單的貪心搜尋演算法,該演算法每次從當前解的臨近空間中選擇乙個最優解作為當前解,直到達到乙個區域性最優解。該演算法實現簡單,其主要缺點是會陷入區域性最優解。如,按箭頭的方向搜尋,當達到a點時,無論朝哪個方向小幅度移動都不能得到更優的解。模擬退火演算法 模擬退火演算法 於固體退火原理...
現代啟發式演算法(二) 模擬退火演算法
繼續我們在遺傳演算法求解tsp問題中所說的,遺傳演算法具有很強的全域性搜尋能力,但由於 早熟 問題使得區域性搜尋能力不足,模擬退火演算法雖然全域性搜尋能力不強,但具有很強的區域性搜尋能力,混合使用遺傳演算法和模擬退火演算法可以解決很多np hard問題,即由遺傳演算法提供問題的較優解,然後由模擬退火...
啟發式演算法之蟻群演算法 模擬退火演算法
啟發式演算法 heuristic algorithm 是相對於最優化演算法提出的。乙個問題的最優演算法求得該問題每個例項的最優解。啟發式演算法可以這樣定義 乙個基於直觀或經驗構造的演算法,在可接受的花費 指計算時間和空間 下給出待解決組合優化問題每乙個例項的乙個可行解,該可行解與最優解的偏離程度一般...