小白之前利用Matlab寫了一段粒子群演算法的代碼,運行較好,但是按照之前的思路改寫為Python代碼時運行效果很差,迭代程序中還發現 func1(self.p[i]) 和 self.p_best[i] 以及func1(self.g) 和 self.g_best 的值對應不起來,能有哪位大神幫忙看看嗎?
import numpy as np
import random
def func1(z):
total = 0
for i in range(0, z.size):
total = z[i] ** 2 + total
return total
class PSO:
def __init__(self, size, dim, iter_num, C1, C2, W, X_max, X_min, V_max, V_min):
self.size = size
self.dim = dim
self.iter_num = iter_num
self.C1 = C1
self.C2 = C2
self.W = W
self.X_max = X_max
self.X_min = X_min
self.V_max = V_max
self.V_min = V_min
self.x = np.random.random((self.size,self.dim))*(X_max - X_min) + X_min
self.v = np.random.random((self.size,self.dim))*(V_max - V_min) + V_min
self.p = self.x
self.p_best = [func1(self.x[i]) for i in range(0,self.size)]
self.g_best = self.p_best[0] + 1
for i in range(0,self.size):
if self.p_best[i] < self.g_best:
self.g = self.p[i]
self.g_best = self.p_best[i]
self.gb = []
self.fitness = 0
def update(self):
for i in range(self.iter_num):
for j in range(self.size):
self.fitness = func1(self.x[j])
# 更新個體最優位置、最優值
if self.fitness < self.p_best[j]:
self.p[j] = self.x[j]
self.p_best[j] = self.fitness
# 更新群體最優位置、最優值
if self.p_best[j] < self.g_best:
self.g = self.p[j]
self.g_best = self.p_best[j]
# 更新速度、位置
self.v[j] = self.W * self.v[j] + self.C1 * random.random() * (self.p[j] - self.x[j]) \
+ self.C2 * random.random() * (self.g - self.x[j])
self.x[j] = self.v[j] + self.x[j]
# 邊界條件
for k in range(self.dim):
if self.v[j][k] > self.V_max or self.v[j][k] < self.V_min:
self.v[j][k] = random.random() * (self.V_max - self.V_min) + self.V_min
if self.x[j][k] > self.X_max or self.x[j][k] < self.X_min:
self.x[j][k] = random.random() * (self.X_max - self.X_min) + self.X_min
self.gb.append(self.g_best)
return self.g, self.g_best
from PSO import PSO
size = 10
dim = 3
iter_num = 200
C1 = 1.5
C2 = 1.5
W = 0.8
X_max = 20
X_min = - 20
V_max = 10
V_min = - 10
pso = PSO(size,dim,iter_num,C1,C2,W,X_max,X_min,V_max,V_min)
best_pos, best_fitness = pso.update()
另外,我發現一個問題,為什么這邊只變了a的值,而b的值也發生了改變?

而這種情況,兩者的值有不系結了

有人知道嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/128787.html
