2024年最新粒子群算法(带约束处理)——Python&Matlab实现(1)

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

规则

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值