C语言实现的粒子群算法代码及解释
- 格式:pdf
- 大小:65.53 KB
- 文档页数:5


粒子群算法求函数极值(Fortran代码)
c Using Particle Swarm Optimization Algorithm to
c Calculate the minimum of the following function
c y=sin(x3)*(5-x4)*exp(-x1*x2)
c where 0
c Originally written in format of Fortran 77.
Program PSO
Implicit none
integer,parameter::N = 500, d = 4, maxiter = 100
integer i,j,nmax,iter
real(kind=4)
* xlimit(d,2),vlimit(d,2),x(N,d),v(N,d),pbestlo(N,d),
* gbestlo(1,d),loca(1),pbest(N),p(N),rand(1,1),randi(N,d)
real(kind=4)
* w,c1,c2,gbest
!N = 500 Number of individuals
!d = 4 Dimensions
!maxiter = 100 Maximum iteration
data xlimit /0, 0, 0, 0, 10, 10, 5, 5/
data vlimit /-0.2, -0.2, -0.1, -0.1, 0.2, 0.2, 0.1, 0.1/
w = 0.5
c1 = 0.5
c2 = 1
cccc Initial location and speed cccc
do i = 1,N
do j = 1,d
call random(rand,i,j) randi(i,j)=rand(1,1)
x(i,j) = xlimit(j, 1) + (xlimit(j, 2)- xlimit(j, 1)) * randi(i,j)
粒子群算法原理及简单案例 [ python ]介绍
粒子群算法(Particle swarm optimization,PSO)是模拟群体智能所建立起来的一种优化算法,主要用于解决最优化问题(optimization problems)。1995年由 Eberhart和Kennedy 提出,是基于对鸟群觅食行为的研究和模拟而来的。
假设一群鸟在觅食,在觅食范围内,只在一个地方有食物,所有鸟儿都看不到食物(即不知道食物的具体位置。当然不知道了,知道了就不用觅食了),但是能闻到食物的味道(即能知道食物距离自己是远是近。鸟的嗅觉是很灵敏的)。
假设鸟与鸟之间能共享信息(即互相知道每个鸟离食物多远。这个是人工假定,实际上鸟们肯定不会也不愿意),那么最好的策略就是结合自己离食物最近的位置和鸟群中其他鸟距离食物最近的位置这2个因素综合考虑找到最好的搜索位置。
粒子群算法与《遗传算法》等进化算法有很多相似之处。也需要初始化种群,计算适应度值,通过进化进行迭代等。但是与遗传算法不同,它没有交叉,变异等进化操作。与遗传算法比较,PSO的优势在于很容易编码,需要调整的参数也很少。
一、基本概念
与遗传算法类似,PSO也有几个核心概念。粒子(particle):一只鸟。类似于遗传算法中的个体。
1.种群(population):一群鸟。类似于遗传算法中的种群。
2.位置(position):一个粒子(鸟)当前所在的位置。
3.经验(best):一个粒子(鸟)自身曾经离食物最近的位置。
4.速度(velocity ):一个粒子(鸟)飞行的速度。
5.适应度(fitness):一个粒子(鸟)距离食物的远近。与遗传算法中的适应度类似。
二、粒子群算法的过程
可以看出,粒子群算法的过程比遗传算法还要简单。
1)根据问题需要,随机生成粒子,粒子的数量可自行控制。
2)将粒子组成一个种群。这前2个过程一般合并在一起。
3)计算粒子适应度值。
单⽬标----PSO(粒⼦群算法)
PSO也写了⼀个多⽉了吧,记得是今年3⽉底完成了
差不多是破釜沉⾈式写出来的,当时写出来那个激动哇。。
因为就花⼀天,⽽且很简单,更主要的是,写过了JADE,这个写起来就思路清晰很多了。
我觉得这个问题是⽐较有意思的⼀个问题,它是模拟鸟群捕⾷⾏为的⼀种算法:
设想这样⼀个场景:⼀群鸟在随机搜索⾷物。在这个区域⾥只有⼀块⾷物。所有的鸟都不知道⾷物在那⾥。但是他们知道当前的位置离⾷物
还有多远。那么找到⾷物的最优策略是什么呢。最简单有效的就是搜寻⽬前离⾷物最近的鸟的周围区域。
但是这个问题⼜继⽽演化成了⼀个物理问题了(这⾥得打个问号了,是我⾃⼰这么认为的)
PSO最主要的是有⼀个速度公式和⼀个位移公式,如下:
v[] = w * v[] + c1 * rand() * (pbest[] - present[]) + c2 * rand() * (gbest[] - present[])
present[] = persent[] + v[]
这⾥⾯的3个参数w,c1,c2是⾮常之重要的,w是惯性权重,如果它太⼤,相当于运动的惯性系数太⼤,会突然间超过⽬标(停不下来。。。
),如果太⼩,那么飞⾏到⽬标解⼜得花很长的时间。更奇葩的应该是c1,c2的选取吧,等下看我程序⾥给的值吧(其实这⾥,标准算法的
值是w=1.0,c1=c2=2.0的)
先看下PSO的基本流程吧
再贴⼀下百度上找的伪代码:
clear all;
clc;
format long;
%------给定初始化条件----------------------------------------------
c1=1.4962; %学习因⼦1
c2=1.4962; %学习因⼦2
w=0.7298; %惯性权重
MaxDT=1000; %最⼤迭代次数
D=10; %搜索空间维数(未知数个数)
N=40; %初始化群体个体数⽬
eps=10^(-6); %设置精度(在已知最⼩值时候⽤)
pso算法代码
PSO算法简介
粒子群优化(Particle Swarm Optimization,PSO)算法是一种基于群体智能的优化算法,它模拟了鸟群或鱼群等生物在搜索过程中的行为,通过不断地调整个体位置和速度来寻找最优解。PSO算法具有收敛速度快、易于实现、适用范围广等特点,在多目标优化、非线性优化、组合优化等领域得到了广泛应用。
PSO算法流程
1.初始化粒子群
2.计算每个粒子的适应度值
3.更新全局最优解和每个粒子的最优解
4.更新每个粒子的速度和位置
5.判断是否达到停止条件,如果没有则返回第二步
PSO算法代码实现
下面是一个简单的PSO算法代码实现,该代码实现了一个求解函数y=x^2在[-5,5]区间内的最小值问题:
```
import random
# 初始化参数
pop_size = 50 # 粒子数量
max_iter = 100 # 迭代次数
w = 0.6 # 惯性权重
c1 = 1.5 # 自我认知学习因子
c2 = 1.5 # 社会认知学习因子
# 定义目标函数
def fitness(x):
return x ** 2
# 初始化粒子群
class Particle:
def __init__(self):
self.position = random.uniform(-5, 5) # 粒子位置
self.velocity = random.uniform(-1, 1) # 粒子速度
self.pbest_pos = self.position # 粒子最优位置
self.pbest_val = fitness(self.position) # 粒子最优适应度值
# 初始化全局最优解
gbest_pos = random.uniform(-5, 5)
gbest_val = fitness(gbest_pos)