import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
theta=[10,10,10,10,10,10,10,10,10,10]
a=0.1
c=0.01
A=20
Alpha=0.602
garma=0.101
p=len(theta)
Fval=[]
n=300
theta_=[]
归一化
def normalization(data): _range = np.max(data) - np.min(data) return (data - np.min(data)) / _range def loss(x): N=len(x) fval=0.0 for i in range(0,int(np.floor(N/2))): fval=fval+56np.power(np.power(x[2i],2)-x[2i+1],2)+np.power(x[2i]-57,2) return fval for k in range(0,n): #产生序列ak,迭代步长 ak=a/np.power(k+1+A,Alpha)
产生序列ck,扰动步长
ck=c/np.power((k+1),garma)
同时扰动向量生成,p维随机扰动向量△
delta=2*np.round(np.random.normal(0,1,p))-1
产生损失函数带有扰动策略的两个测量值
thetaplus=theta+ck*delta
thetaminus=theta-ck*delta
yplus=loss(thetaplus)
yminus=loss(thetaminus)
ghat=(yplus-yminus)/(2*ck*delta)
ghat=normalization(ghat)
收敛速度太慢,加一个系数,适当就好,太大容易越过极小值
theta=theta-14*ak*ghat
theta_.append(theta)
这里可以加一个判断,不加也可以,需要调整迭代步长
Fval.append(loss(theta))
print('y最小值=',np.min(Fval)) print('y最小时,x的值=',theta) plt.figure(figsize=(15,5)) plt.subplot(1,2,1) plt.title('y值变化规律',fontproperties='SimHei',fontsize=20) plt.ylabel('y变化',fontproperties='SimHei',fontsize=18) plt.xlabel('搜索步数',fontproperties='SimHei',fontsize=18) plt.plot(Fval,label='y') plt.subplot(1,2,2) plt.title('x值变化规律',fontproperties='SimHei',fontsize=20) plt.ylabel('x变化',fontproperties='SimHei',fontsize=18) plt.xlabel('搜索步数',fontproperties='SimHei',fontsize=18) for i in range(0,len(theta_[0])): x=[] for j in range(0,len(theta_)): x.append(theta_[j][i]) plt.plot(x)