問題:
求解函式z=-x2-y2的[-10,10]之間的最大值
解法:還是隨機播種的優化方法,判定終止是迴圈50次
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 # 避免生成的隨機數超出範圍,返回隨機數範圍
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
import random_list
import find_max_min2
defslovez
(x, y)
:# 三維函式
z =- x**
2- y**
2return z
defgene_xy
(value)
:# 避免隨機布種超出範圍
start = value - radius
end = value + radius
if start <=-10
: start =-10
if end >=10:
end =
10return start, end
fig = plt.figure(
)ax = axes3d(fig)
x = np.arange(-10
,10,0.5
)y = np.arange(-10
,10,0.5
)x, y = np.meshgrid(x, y)
z = slovez(x, y)
ax.plot_su***ce(x, y, z, rstride=
1, cstride=
1, cmap=
'rainbow'
)# 畫三維圖
# ax.contourf(x, y, z, zdir='z', offset=-2, cmap='rainbow')
# ax.set_zlim(-2, 2)
list_x = random_list.random_list(-10
,10,10
)# 第一次布種
list_y = random_list.random_list(-10
,10,10
)list_xy =
answer_z =
for i, ii in
enumerate
(list_x)
:[list_x[i]
, list_y[i]])
for i in list_xy:0]
, i[1]
))max2_z =
[find_max_min2.findmax2(answer_z)[0
], find_max_min2.findmax2(answer_z)[1
]]# ax.scatter(list_x[max2_z[0]], list_y[max2_z[0]], answer_z[max2_z[0]], c='r')
radius =20*
0.66
# 初始搜尋半徑
n =0
while n <50:
# 搜尋50次
n +=
1 x1, y1 = list_x[max2_z[0]
], list_y[max2_z[0]
] x2, y2 = list_x[max2_z[1]
], list_y[max2_z[1]
] startx1, endx1 = gene_xy(x1)
starty1, endy1 = gene_xy(y1)
startx2, endx2 = gene_xy(x2)
starty2, endy2 = gene_xy(y2)
list_x = random_list.random_list(startx1, endx1,10)
+ random_list.random_list(startx2, endx2,10)
+[x1]
list_y = random_list.random_list(starty1, endy1,10)
+ random_list.random_list(starty2, endy2,10)
+[y1]
list_xy.clear(
) answer_z.clear(
)for i, ii in
enumerate
(list_x)
:[list_x[i]
, list_y[i]])
for i in list_xy:0]
, i[1]
))max2_z =
[find_max_min2.findmax2(answer_z)[0
], find_max_min2.findmax2(answer_z)[1
]]# ax.scatter(list_x[max2_z[0]], list_y[max2_z[0]], answer_z[max2_z[0]], c='b')
radius = radius *
0.55
# 搜尋半徑變化
xx = list_x[max2_z[0]
]yy = list_y[max2_z[0]
]zz = slovez(xx, yy)
ax.scatter(xx, yy, zz, c=
'r')
print
(xx, yy, zz)
plt.show(
)
結果如圖:
優化方法 隨機數播種(求函式最大2d)
問題 求解函式y xsin 10 x 2的 1,2 之間的最大值 解法 還是隨機播種的優化方法,判定終止是最大y和次大y對應的x之差小於0.0001 import math import matplotlib.pylab as plt import random list import find m...
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....
C 產生隨機數,並用冒泡對其排序求最大值
寫這個程式的主要原因是,課程作業需要用labview寫類似的乙個功能,我就試著用c 寫一下試試,其實原理很簡單,就是用rand 函式產生隨機數存入到陣列當中去,然後對陣列中的 數用冒泡演算法進行排序就可以了。先介紹一下rand 這個函式的用法,這個函式可以用來產生隨機數,但不是真正意義上的隨機數,它...