return max(0, e)
#========== 由惩罚项计算Lj(权重值):====================
def calc_Lj(self, e1, e2): #根据每个粒子的约束惩罚项计算Lj权重值,e1, e2列向量,表示每个粒子的第1个第2个约束的惩罚项值
if (e1.sum() + e2.sum()) <= 0: # 注意防止分母为零的情况
return 0, 0
else:
L1 = e1.sum() / (e1.sum() + e2.sum())
L2 = e2.sum() / (e1.sum() + e2.sum())
return L1, L2
=粒子群速度更新公式:======================
def velocity_update(self, V, X, pbest, gbest):
#根据速度更新公式更新每个粒子的速度
#种群 size
#:param V: 粒子当前的速度矩阵,size*dim 的矩阵
#:param X: 粒子当前的位置矩阵,size*dim 的矩阵
#:param pbest: 每个粒子历史最优位置,size*dim 的矩阵
#:param gbest: 种群历史最优位置,1*dim 的矩阵
r1 = np.random.random((self.size, 1))
r2 = np.random.random((self.size, 1))
V = self.w * V + self.c1 * r1 * (pbest - X) + self.c2 * r2 + (gbest - X) # 直接对照公式写就好了
防止越界:
V[V > self.max_vel] = self.max_vel
V[V < self.min_vel] = self.min_vel
return V
=粒子群位置更新公式:==================
def position_update(self, X, V):
#根据公式更新粒子的位置
#:param X: 粒子当前的位置矩阵,维度是 size*dim
#:param V: 粒子当前的速度举着,维度是 size*dim
X=X+V
size = np.shape(X)[0]
for i in range(size):
if X[i][0] <= 1 or X[i][0] >= 2:
X[i][0] = np.random.uniform(1, 2, 1)[0]
if X[i][1] <= -1 or X[i][1] >= 0:
X[i][1] = np.random.uniform(-1, 0, 1)[0]
return X
#=========== 更新种群函数:=============================
def update_pbest(self, pbest, pbest_fitness, pbest_e, xi, xi_fitness, xi_e):
#判断是否需要更新粒子的历史最优位置
#:param pbest: 历史最优位置
#:param pbest_fitness: 历史最优位置对应的适应度值
#:param pbest_e: 历史最优位置对应的约束惩罚项
#:param xi: 当前位置
#:param xi_fitness: 当前位置的适应度函数值
#:param xi_e: 当前位置的约束惩罚项
#:return:
A = 0.0000001
下面的 0.0000001 是考虑到计算机的数值精度位置,值等同于 0,不同问题设置不同的可接受值
1、如果pbest和xi都没有违反约束,则取适应度(目标函数)小的:
if pbest_e <= A and xi_e <= A:
if pbest_fitness <= xi_fitness:
return pbest, pbest_fitness, pbest_e
else:
return xi, xi_fitness, xi_e
规则 2,如果当前位置违反约束而历史最优没有违反约束,则取历史最优
if pbest_e <= A and xi_e >= A:
return pbest, pbest_fitness, pbest_e