python编写PSO算法

本文通过Python实现粒子群优化算法(PSO),详细介绍了该算法的工作原理及其参数设置。通过对一系列粒子的位置和速度更新迭代,寻找目标函数的最优解。文章提供了完整的代码示例并展示了算法运行结果。

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

关键在于赋值的关系:
浅赋值:对原来的引用
深度赋值:才是对值影响

#! /user/bin/env python
#encoding=utf-8
__author__ = 'chw'
import time
import numpy as np
import copy
import matplotlib.pyplot as plt
start=time.time()
c1=2
c2=2
PopMax=100
Vmax=PopMax/10
SizePop=20
D=2
Maxgen=200
Wmax=0.9
Wmin=0.4
pop=np.random.rand(SizePop,D)*2*PopMax-PopMax
v=np.random.rand(SizePop,D)*Vmax*2-Vmax

def fun(x1,x2):
    return x1**2+x2**2

fitness=np.zeros((SizePop,1),dtype=float)
for i in xrange(SizePop):
    fitness[i]=fun(pop[i,0],pop[i,1])
bestfitness=max(fitness)
for i in xrange(SizePop):
    if fitness[i]==bestfitness:
        zbest=pop[i,:]
        break
gbest=pop
fitnessgbest=fitness
fitnesszbest=bestfitness
# yy=np.zeros((Maxgen,1),dtype=float)
yy=np.random.rand(Maxgen,1)
x=np.arange(Maxgen)
for i in xrange(Maxgen):
    if i==0:
        w=Wmax
    else:
        w=Wmax-i*0.5/Maxgen
    for j in xrange(SizePop):
        v[j,:]=w*v[j,:]+c1*np.random.rand()*(gbest[j,:]-pop[j,:])+c2*np.random.rand()*(zbest-pop[j,:])
        pop[j,:]=pop[j,:]+v[j,:]
        for t in xrange(D):
            if pop[j,t]>PopMax:
                pop[j,t]=PopMax
            if pop[j,t]<-PopMax:
                pop[j,t]=-PopMax
            if v[j,t]>Vmax:
                v[j,t]=Vmax
            if v[j,t]<-Vmax:
                v[j,t]=-Vmax
        fitness[j]=fun(pop[j,0],pop[j,1])
    for j in xrange(SizePop):
        if fitness[j]<fitnessgbest[j]:
            gbest[j,:]=copy.deepcopy(pop[j,:])
            fitnessgbest[j]=copy.deepcopy(fitness[j])
    for j in xrange(SizePop):
        if fitnessgbest[j]<fitnesszbest:
            zbest=copy.deepcopy(gbest[j,:])
            fitnesszbest=copy.deepcopy(fitnessgbest[j])
    yy[i]=copy.deepcopy(fitnesszbest)
print zbest
print fitnesszbest
plt.figure()
plt.plot(x,yy)
plt.show()
print time.time()-start
# s1=[0,1,2]
# s2=[2,3,4]
# plt.figure()
# plt.plot(s1,s2)
# plt.show()

这里写图片描述
参考:http://blog.youkuaiyun.com/just_do_it_123/article/details/50927348
http://www.jb51.net/article/61902.htm

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值