栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

粒子群算法(惩罚项)(Python)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

粒子群算法(惩罚项)(Python)

目录

1、概述

(1)智能优化算法

 (2)群智能算法

2、粒子群算法 

3、程序框图

4、代码

5、结果

6、参考文献


1、概述

(1)智能优化算法

 (2)群智能算法

2、粒子群算法 

       粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.
  PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。

       惩罚项即罚函数法。即如果一个解 x 不满足约束条件,就对适应度值设置一个惩罚项。它的思想类似线性规划内点法,都是通过增加罚函数,迫使模型在迭代计算的过程中始终在可行域内寻优。        在粒子群算法中,每一步迭代都会更新 Pbest 和 Gbest,虽然可以将有约束问题转换为无约束问题进行迭代求解,但是问题的解 xi依然存在不满足约束条件的情况,因此需要编制一些规则来比较两 个粒子的优劣,规则如下: 1.如果两个粒子 xi 和 xj 都可行,则比较其适应度函数 f(xi)和f(xj),值小的粒子为优。 2.当两个粒子 xi 和 xj 都不可行,则比较惩罚项 P(xi)和 P(xj), 违背约束程度小的粒子更优。 3.当粒子 xi 可行而粒子 xj 不可行,选可行解。对于粒子的上下限约束 可以体现在位置更新函数里,不必加惩 罚项。 具体思路就是遍历每一个粒子的位置,如果超除上下限,位置则更改为上下限中的任何一个位置

3、程序框图

4、代码
#粒子群
#导入包
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 Niqun:
    def __init__(self):
    # Pso参数:
        self.w=1
        self.c1=2
        self.c2=2
        self.dim=2
        self.size=100
        self.iter_num=1000
        self.max_vel=0.5
        self.min_vel=-0.5
#目标函数公式:
def calc_f(self,x):
    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_Li(self,e1,e2):
    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):
    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[vself.min_vel]=self.min_vel
#粒子群位置更新公式:
def position_update(self,x,v):
    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):
    A=0.0000001
    #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
    if pbest_e<=A and xi_e>=A:
        return pbest,pbest_fitness,pbest_e
    if pbest_e>=A and xi_e<=A:
        return xi,xi_fitness,xi_e
    #4、如果两个都违反了,取适应度较小的一个:
    if pbest_fitness<=xi_fitness:
        return pbest,pbest_fitness,pbest_e
    else:
        return xi,xi_fitness,xi_e
#更新全局最优位置
def update_gbest(self,gbest, gbest_fitness, gbest_e, pbest, pbest_fitness, pbest_e):
    A = 0.0000001  # 可接受阈值,不同问题修改为不同的值
    # 先对种群,寻找约束惩罚项=0 的最优个体,如果每个个体的约束惩罚项都大于 0,就找适应度最小的个体
    pbest2 = np.concatenate([pbest, pbest_fitness.reshape(-1, 1), pbest_e.reshape(-1, 1)],axis=1) # 将几个矩阵拼接成矩阵 ,4 维矩阵(x,y,fitness,e)
    pbest2_1 = pbest2[pbest2[:, -1] <= A]  # 找出没有违反约束的个体
    if len(pbest2_1) > 0:
        pbest2_1 = pbest2_1[pbest2_1[:, 2].argsort()]  # 根据适应度值排序
    else:
        pbest2_1 = pbest2[pbest2[:, 2].argsort()]  # 如果所有个体都违反约束,直接找出适应度值最小
    # 当前迭代的最优个体
    pbesti, pbesti_fitness, pbesti_e = pbest2_1[0, :2], pbest2_1[0, 2], pbest2_1[0, 3]
    # 当前最优和全局最优比较
    # 如果两者都没有约束
    if gbest_e <= A and pbesti_e <= A:
        if gbest_fitness < pbesti_fitness:
            return gbest, gbest_fitness, gbest_e
        else:
            return pbesti, pbesti_fitness, pbesti_e
        if gbest_e <= A and pbesti_e > A:
            return gbest, gbest_fitness, gbest_e
        if gbest_e > A and pbesti_e <= A:
            return pbesti, pbesti_fitness, pbesti_e
        # 如果都违反约束,直接取适应度小的
        if gbest_fitness < pbesti_fitness:
            return gbest, gbest_fitness, gbest_e
        else:
            return pbesti, pbesti_fitness, pbesti_e
        # 主函数
    def main(self):
    # 初始化一个矩阵 info, 记录:
    # 0、种群每个粒子的历史最优位置对应的适应度,
    # 1、历史最优位置对应的惩罚项,
    # 2、当前适应度,
    # 3、当前目标函数值,
    # 4、约束 1 惩罚项,
    # 5、约束 2 惩罚项,
    # 6、惩罚项的和
    # 所以列的维度是 7
        info = np.zeros((self.size, 7))
        fitneess_value_list = []
        # 用一个 size*dim 的矩阵表示种群,每行表示一个粒子
        X = np.random.uniform(-5, 5, size=(self.size, self.dim))
        # 初始化种群的各个粒子的速度
        V = np.random.uniform(-0.5, 0.5, size=(self.size, self.dim))
        # 初始化粒子历史最优位置为当当前位置
        pbest = X
    # 计算每个粒子的适应度
        for i in range(self.size):
            info[i, 3] = self.calc_f(X[i])  # 目标函数值
            info[i, 4] = self.calc_e1(X[i])  # 第一个约束的惩罚项
            info[i, 5] = self.calc_e2(X[i])  # 第二个约束的惩罚项
            # 计算惩罚项的权重,及适应度值
        L1, L2 = self.calc_Lj(info[i, 4], info[i, 5])
        info[:, 2] = info[:, 3] + L1 * info[:, 4] + L2 * info[:, 5]  # 适应度值
        info[:, 6] = L1 * info[:, 4] + L2 * info[:, 5]  # 惩罚项的加权求和
        # 历史最优
        info[:, 0] = info[:, 2]  # 粒子的历史最优位置对应的适应度值
        info[:, 1] = info[:, 6]  # 粒子的历史最优位置对应的惩罚项值
        # 全局最优
        gbest_i = info[:, 0].argmin()  # 全局最优对应的粒子编号
        gbest = X[gbest_i]  # 全局最优粒子的位置
        gbest_fitness = info[gbest_i, 0]  # 全局最优位置对应的适应度值
        gbest_e = info[gbest_i, 1]  # 全局最优位置对应的惩罚项
        # 记录迭代过程的最优适应度值
        fitneess_value_list.append(gbest_fitness)
        # 接下来开始迭代
        for j in tqdm(range(self.iter_num)):
        # 更新速度
            V = self.velocity_update(V, X, pbest=pbest, gbest=gbest)
            # 更新位置
            X = self.position_update(X, V)
            # 计算每个粒子的目标函数和约束惩罚项
            for i in range(self.size):
                info[i, 3] = self.calc_f(X[i])  # 目标函数值
                info[i, 4] = self.calc_e1(X[i])  # 第一个约束的惩罚项
                info[i, 5] = self.calc_e2(X[i])  # 第二个约束的惩罚项
            # 计算惩罚项的权重,及适应度值
            L1, L2 = self.calc_Lj(info[i, 4], info[i, 5])
            info[:, 2] = info[:, 3] + L1 * info[:, 4] + L2 * info[:, 5]  # 适应度值
            info[:, 6] = L1 * info[:, 4] + L2 * info[:, 5]  # 惩罚项的加权求和
            # 更新历史最优位置
            for i in range(self.size):
                pbesti = pbest[i]
                pbest_fitness = info[i, 0]
                pbest_e = info[i, 1]
                xi = X[i]
                xi_fitness = info[i, 2]
                xi_e = info[i, 6]
                # 计算更新个体历史最优
                pbesti, pbest_fitness, pbest_e = 
                    self.update_pbest(pbesti, pbest_fitness, pbest_e, xi, xi_fitness, xi_e)
                pbest[i] = pbesti
                info[i, 0] = pbest_fitness
                info[i, 1] = pbest_e
            # 更新全局最优
            pbest_fitness = info[:, 2]
            pbest_e = info[:, 6]
            gbest, gbest_fitness, gbest_e = 
                self.update_gbest(gbest, gbest_fitness, gbest_e, pbest, pbest_fitness, pbest_e)
            # 记录当前迭代全局之硬度
            fitneess_value_list.append(gbest_fitness)
            # 最后绘制适应度值曲线
        print('迭代最优结果是:%.5f' % self.calc_f(gbest))
        print('迭代最优变量是:x=%.5f, y=%.5f' % (gbest[0], gbest[1]))
        print('迭代约束惩罚项是:', gbest_e)
        # 绘图
        plt.plot(fitneess_value_list[: 30], color='r')
        plt.title('迭代过程')
        plt.show()
if __name__ == '__main__':
    ni = Niqun()
    ni.main()

5、结果

6、参考文献

最优化算法之粒子群算法(PSO)_青萍之末的博客-CSDN博客_粒子群算法一、粒子群算法的概念  粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.   PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制...https://blog.csdn.net/daaikuaichuan/article/details/81382794?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%B2%92%E5%AD%90%E7%BE%A4%E7%AE%97%E6%B3%95%E5%8E%9F%E7%90%86&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-81382794.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187粒子群算法求解无约束优化问题 源码实现_总裁余(余登武)博客-CSDN博客粒子群算法求解无约束优化问题 源码实现 语言pythonhttps://blog.csdn.net/kobeyu652453/article/details/115298847

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/618409.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号