粒子群算法局部最优位置总是更新,明明适应度并没有优于上一次的局部最优,但是他就是把局部最优位置更新了
# 适应度更新
for i in range(m):
if (fit0[i][0] > pbest[i][0] and fit0[i][1] < pbest[i][1]) or (fit0[i][0] > pbest[i][0] and fit0[i][1] == pbest[i][1]) or (fit0[i][0] == pbest[i][0] and fit0[i][1] < pbest[i][1]): # 效益更好
pbest[i] = fit0[i] # 更新最佳效益
px[i][:] = p[i][:] # 更新最佳位置
else:
if fit0[i][2] > pbest[i][2] :
pbest[i] = fit0[i] # 更新最佳效益
px[i] = p[i] # 更新最佳位置
else:
if fit0[i][2] == pbest[i][2]:
if fit0[i][1] < pbest[i][1]:
pbest[i] = fit0[i] # 更新最佳效益
px[i] = p[i] # 更新最佳位置
return pbest, px
# 运行
Weight, Value, K0 = readexcel('shuju1.xls')
# N = 100 # 群体粒子个数
nitem = len(Weight[0]) # 每组物品数量
D = len(Weight) # 组数
# T = 300 # 最大迭代次数
c1 = 1.5 # 学习因子1
c2 = 1.5 # 学习因子2
W_max = 0.8 # 惯性权重最大值
W_min = 0.4 # 惯性权重最小值
V_max = 10 # 速度最大值
V_min = -10 # 速度最小值
Weight_max = 300 # 背包容量
afa = 10 # 惩罚系数
x = init_x(N, D, nitem) # 初始化x
v = init_v(N, D, V_max, V_min) # 初始化v
pb, px = fitness(x, N, D, Weight, Weight_max, Value, afa, K0)
gb = pb[0]
gx = px[0]
cha_0 = [[],[]]
cha_1 = []
# gb = 0.0
# gx = [0, 0, 0, 0, 0, 0]
gb, gx = update_gbest(px, pb, gb, gx, N)
# print(pb, px)
for i in range(T):
v = update_v(v, x, N, D, px, gx, c1, c2, V_max, V_min) # 速度更新
x = update_x(x, v, N, D, nitem) # 位置更新
fit0, x0 = fitness(x, N, D, Weight, Weight_max, Value, afa, K0) # 适应度fitvalue和fitweight
print("适应度", i, fit0, x0)
pb, px = update_pbest(x0, fit0, pb, px, N) # 本次循环局部最佳适应度和最佳位置
print("局部最优", i, pb, px)
gb, gx = update_gbest(px, pb, gb, gx, N) # 本次循环全局最佳适应度和最佳位置
运行结果及报错内容
局部最优 3 [[852.0418999999999, 86.53999999999999, 1.0686], [799.5312, 94.55, 0.954]] [[1 1], [0 1]]
适应度 4 [[804.1499999999999, 92.22, 0.9474], [751.6393, 100.22999999999999, 0.8328]] [[1 0],[0 0]]
局部最优 4 [[852.0418999999999, 86.53999999999999, 1.0686], [799.5312, 94.55, 0.954]] [[1 0],[0 0]]