Z = 2 * A + X ** 2 - A * np.cos(2 * np.pi * X) + Y ** 2 - A * np.cos(2 * np.pi * Y)
绘图
fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)
plt.show()
4 代码实现:Python&Matlab
====================
4.1 Python实现
4.1.1 代码
该问题中上下限约束通过策略 1 解决,不等式约束通过惩罚项解决。
导入包============
import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams[‘font.sans-serif’] = [‘SimHei’] # 指定默认字体
mpl.rcParams[‘axes.unicode_minus’] = False ## 解决保存图像是负号’-'显示为方块的问题
class Liqun:
def init(self):
Pso参数:
self.w = 1 # 惯性因子,一般取 1
self.c1 = 2 # 学习因子 1,一般取 2
self.c2 = 2 #学习因子 2,一般取 2
self.dim = 2 # 维度的维度#对应 2 个参数 x,y (针对具体问题)
self.size = 100 # 种群大小,即种群中小鸟的个数
self.iter_num = 1000 # 算法最大迭代次数
self.max_vel = 0.5 # 限制粒子的最大速度为 0.5
self.min_vel = -0.5 # 限制粒子的最小速度为-0.5
#============= 目标函数公式:============================
def calc_f(self, X): #计算个体粒子的的适应度值,也就是目标函数值,X 的维度是 size * 2
a = 10
x = X[0]
y = X[1]
return 2 * a + x ** 2 - a * np.cos(2 * np.pi * x) + y ** 2 - a * np.cos(2 * np.pi * y)
=惩罚项公式:=====================
def calc_e1(self, X): #个体惩罚项,计算第一个约束的惩罚项
e = X[0] + X[1] - 6
return max(0, e)
def calc_e2(self, X): #个体惩罚项,计算第二个约束的惩罚项
e = 3 * X[0] - 2 * X[1] - 5
return max(0, e)
#========== 由惩罚项计算Lj(权重值):====================
def calc_Lj(self, e1, e2): #根据每个粒子的约束惩罚项计算Lj权重值,e1, e2列向量,表示每个粒子的第1个第2个约束的惩罚项值
if (e1.sum() + e2.sum()) <= 0: # 注意防止分母为零的情况