問題:
求解函式y=xsin(10πx)+2的[-1,2]之間的最大值
解法:還是隨機播種的優化方法,判定終止是最大y和次大y對應的x之差小於0.0001
import math
import matplotlib.pylab as plt
import random_list
import find_max_min2
import time
defslovey
(x):
y = x * math.sin(math.pi *
10* x)+2
# xy函式
return y # 返回y值
deffunction
(start, end)
: lst_x =
lst_y =
if start > end:
start, end = end, start
if start == end:
return
print
('wrong'
) x = start
while x < end:
y = slovey(x)
x +=
0.001
return
[lst_x, lst_y]
# 返回函式散點值用於畫圖
defgene_x
(value)
: start = value - radius
end = value + radius
if start <=-1
: start =
1if end >=2:
end =
2return start, end # 避免生成的隨機數超出範圍,返回隨機數範圍
time1 = time.time(
)x, y = function(-1
,2)[
0], function(-1
,2)[
1]plt.figure(1)
plt.plot(x, y)
# 畫出函式影象
random_lst_x = random_list.random_list(-1
,2,20
)# 第一次播種,10個
random_lst_y =
for i in random_lst_x:
)max2_x =
[random_lst_x[find_max_min2.findmax2(random_lst_y)[0
]], random_lst_x[find_max_min2.findmax2(random_lst_y)[1
]]]# 得到y值最大次大對應的x值
radius =3*
0.66
# 播種半徑
plt.plot(max2_x[0]
, slovey(max2_x[0]
),'ro'
)plt.annotate(1,
(max2_x[0]
, slovey(max2_x[0]
)), xycoords=
'data'
, xytext=
(max2_x[0]
+0.001
, slovey(max2_x[0]
)+0.001))
print
(max2_x[0]
, max2_x[1]
, max2_x[1]
- max2_x[0]
)n =
0m =
1while
abs(max2_x[1]
- max2_x[0]
)>
0.0001
: random_lst_x.clear(
) random_lst_y.clear(
) x1 = max2_x[0]
start1, end1 = gene_x(x1)
x2 = max2_x[1]
start2, end2 = gene_x(x2)
lst_x1 = random_list.random_list(start1, end1,10)
lst_x2 = random_list.random_list(start2, end2,10)
random_lst_x = lst_x1 + lst_x2 +
[x1]
for i in random_lst_x:
) max2_x =
[random_lst_x[find_max_min2.findmax2(random_lst_y)[0
]], random_lst_x[find_max_min2.findmax2(random_lst_y)[1
]]] radius *=
0.9# 搜尋半徑變化
n +=
1print
(max2_x[0]
, max2_x[1]
, max2_x[1]
- max2_x[0]
) yy = slovey(max2_x[0]
)if n <
100:
plt.plot(max2_x[0]
, yy,
'bo'
)# 圖中顯示最高點變化
if x1 != max2_x[0]
: m +=
1 plt.annotate(m,
(max2_x[0]
, yy)
, xycoords=
'data'
, xytext=
(max2_x[0]
+0.001
, yy +
0.001))
plt.plot(max2_x[0]
, slovey(max2_x[0]
),'ro'
)time2 = time.time(
)timez = time2 - time1
print
('用時'
+str
(round
(timez,5)
)+'s')
plt.show(
)
結果如圖:
優化方法 隨機數播種(求函式最大3d)
問題 求解函式z x2 y2的 10,10 之間的最大值 解法 還是隨機播種的優化方法,判定終止是迴圈50次 import math import matplotlib.pylab as plt import random list import find max min2 import time ...
db2 隨機數函式 sql中的隨機函式怎麼用
oracle dbms random.value函式 1.產生乙個介於0和1之間 不包含0和1 的38位精度的隨機數 sql select dbms random.value from dual value 881021859 2.產生乙個介於指定範圍之內的38位精度的隨機數 sql select ...
Math的常用方法獲取隨機數 最大小值 捨入方法
m,n math.floor math.random n m 1 m 1.math.random 獲取0到1之間的隨機數 0,1 2.獲取 0,n 之間的隨機整數 math.floor math.random n 1 console.log math.floor math.random 6 1 3....