粒子群优化算法py版

其中维数为自变量个数

此代码仅能处理二维矩阵,在处理高于二维的矩阵时需要修改

返回值为目标函数的最小值

import numpy as np
import pandas as pd
import math
import os
import random as rd

dim=1#维数
p_num=10#粒子数量
counts=100#迭代数量
amax=999999#max
#粒子速度范围与位置范围
v_max=4
v_min=-2
pos_max=2
pos_min=-1
#位置向量与速度向量
pos=[]
spe=[]
#粒子历史最优位置与全局最优位置
p_best=[]
g_best=0
#函数值矩阵与位置矩阵
f=np.ma.zeros((counts,p_num))
pos_mat=np.ma.zeros((counts,p_num))
#速度更新函数相关参数
w=0.5
c1=2
r1=0
c2=2
r2=0
#定义适应度函数
def af(x):
    res=x*x+1
    return res
#初始化粒子群的位置与速度

def init():
    global f,pos_mat,pos_min,g_best,p_best,pos,spe
    #初始化为最大值
    for i in range(0,f.shape[0]):
        for j in range(0,f.shape[1]):
            f[i][j]=amax
    for i in range(0,pos_mat.shape[0]):
        for j in range(0,pos_mat.shape[1]):
            pos_mat[i][j]=amax
    #生成随机数
    for i in range(0,p_num):
        r1=rd.randint(pos_min,pos_max-1)+rd.random()
        r2=rd.randint(v_min,v_max-1)+rd.random()
        pos.append(r1)
        spe.append(r2)
    for i in range(0,p_num):
        #计算适应函数值
        res=af(pos[i])
        #初始化函数值矩阵和位置矩阵
        f[0][i]=res
        pos_mat[0][i]=pos[i]
        #初始化粒子历史最优位置
        p_best.append(pos[i])
    g_best=min(f[0])

def PSO():
    global f,pos_mat,pos_min,g_best,p_best,pos,spe
    r1=rd.random()
    r2=rd.random()
    #更新速度与位置向量
    for con in range(1,counts):
        for i in range(0,p_num):
            spe[i]=w*spe[i]+c1*r1*(p_best[i]-pos[i])+c2*r2*(g_best-pos[i])
            pos[i]=pos[i]+spe[i]
            #越界时修正
            if spe[i]<v_min:
                spe[i]=v_min
            elif spe[i]>v_max:
                spe[i]=v_max
            if pos[i] < pos_min:
                pos[i] = pos_min
            elif pos[i] > pos_max:
                pos[i] = pos_max
            #更新位置矩阵
            pos_mat[con][i]=pos[i]
        #更新函数值矩阵
        for i in range(0,p_num):
            x=af(pos[i])
            f[con][i]=x
        lo=[]
        for i in range(0,p_num):
            lo.clear()
            for j in range(0,con):
                lo.append(f[j][i])
            p_best[i]=min(lo)
        g_best=min(p_best)
    return g_best

init()
PSO()
print(PSO())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值