粒子群优化算法的实践 - 多个约束条件

文章介绍了在粒子群优化算法中处理多个约束条件的方法,包括使用if条件表达不等式约束,以及通过可视化的动画展示算法迭代过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

粒子群优化算法的实践 - 多个约束条件

flyfish

粒子群优化算法的实践 - 目标函数的可视化
粒子群优化算法的实践 - 向量减法

粒子群优化算法的代码实践
代码写法是

#非线性约束 (x[0] - 1) ** 2 + (x[1] - 1) ** 2 - 1<=0
constraint_ueq = (
    lambda x: (x[0] - 1) ** 2 + (x[1] - 1) ** 2-1
    ,
)

也是函数

def constraint_ueq(x): 

    if ((x[0] - 1) ** 2 + (x[1] - 1) ** 2-1) <=0:
        return False
    return  True

u是否定,返回False,是否定,双重否定表肯定
即符合条件(x[0] - 1) ** 2 + (x[1] - 1) ** 2 - 1<=0
运行结果是
在这里插入图片描述

增加多个约束条件是
两个if条件是or的关系

def constraint_ueq(x): 

    if ((x[0] - 1) ** 2 + (x[1] - 1) ** 2-1) <=0:
        return False
    
    if x[0]>=0 or x[1]<=0:
        return False
    
    return  True 
运行结果是

在这里插入图片描述
完整是

import numpy as np
from sko.PSO import PSO

def demo_func(X):
    x, y = X
    return (x-3.14)**2 + (y-3.14)**2 + np.sin(3*x+3.14) + np.cos(4*y-3.14)



#非线性约束 (x[0] - 1) ** 2 + (x[1] - 1) ** 2 - 1<=0
# constraint_ueq = (
#     lambda x: (x[0] - 1) ** 2 + (x[1] - 1) ** 2-1
#     ,
# )

# 不等式约束实现
# u是否定,返回False,是否定,双重否定表肯定
# def constraint_ueq(x): 
#     if ((x[0] - 1) ** 2 + (x[1] - 1) ** 2-1) <=0:
#         return False
#     return  True
def constraint_ueq(x): 

    if ((x[0] - 1) ** 2 + (x[1] - 1) ** 2-1) <=0:
        return False
    
    if x[0]>=0 or x[1]<=0:
        return False
    
    return  True 



constraint_ueq=[constraint_ueq]
max_iter = 30
# lb	None	每个参数的最小值
# ub	None	每个参数的最大值
pso = PSO(func=demo_func, n_dim=2, pop=40, max_iter=max_iter, lb=[-1, -1], ub=[5, 5],constraint_ueq=constraint_ueq)

pso.record_mode = True
pso.run()
print('best_x is ', pso.gbest_x, 'best_y is', pso.gbest_y)

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

record_value = pso.record_value
X_list, V_list = record_value['X'], record_value['V']

fig, ax = plt.subplots(1, 1)
ax.set_title('title', loc='center')
line = ax.plot([], [], 'b.')

X_grid, Y_grid = np.meshgrid(np.linspace(0,5,100), np.linspace(0,5,100))


Z_grid = demo_func((X_grid, Y_grid))
ax.contour(X_grid, Y_grid, Z_grid, 10)


ax.set_xlim([0,5])
ax.set_ylim([0,5])

draw_circle=plt.Circle((1.8, 1.5), 0.5,fill=False,color='r')
ax.add_artist(draw_circle)

plt.ion()
p = plt.show()


def update_scatter(frame):
    i, j = frame // 10, frame % 10
    ax.set_title('iter = ' + str(i))
    X_tmp = X_list[i] + V_list[i] * j / 10.0
    plt.setp(line, 'xdata', X_tmp[:, 0], 'ydata', X_tmp[:, 1])
    return line


ani = FuncAnimation(fig, update_scatter, blit=True, interval=25, frames=max_iter * 10)
plt.show()

ani.save('PSO_2.gif', writer='pillow')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二分掌柜的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值