一.算法流程

Step1:初始化一群粒子(粒子个数为50个),包括随即位置和速度;

Step2:计算每个粒子的适应度fitness;

Step3:对每个粒子,将其适应度与其进过的最好位置(局部)pbest做比较,如果较好,则将其作为当前的最好位置pbest;

Step4:对每个粒子,将其将其适应值与群体所经过的最好位置gbest做比较,如果较好,则将其作为当前最好位置gbest;

Step5:更新所有粒子位置和速度;

Step6:未达到结束条件则转Step2。

二.实验设置

(1)   粒子数particle_num=20;

(2)   迭代次数N=50;

(3)  惯性因子w=1.4;

(4)  c1=c2=2;

(5)  最大速度Vmax=2。

三.实验说明

PSO维基:https://en.wikipedia.org/wiki/Particle_swarm_optimization

目标函数:https://en.wikipedia.org/wiki/Test_functions_for_optimization 中的Ackley's function、Sphere function、和Rosenbrock function(都是求最小值)

完整代码见我的github:https://github.com/wqpod2g/PSO

四.java代码

1.particle类

package nju.iip;

import java.util.Random;

/**
* 粒子类
* @author mrpod2g
*
*/
public class Particle {
//维数
public int dimension = 2; //粒子的位置
public double[] X = new double[dimension]; //局部最好位置
public double[] pbest = new double[dimension]; //粒子的速度
public double[] V = new double[dimension]; //最大速度
public double Vmax = 2; //适应值
public double fitness; /**
* 根据当前位置计算适应值
* @return newFitness
*/
public double calculateFitness() {
//1.Ackley's function:
//double newFitness = -20*Math.pow(Math.E,(-0.2*Math.sqrt(0.5*(X[0]*X[0]+X[1]*X[1]))))-Math.pow(Math.E,(0.5*(Math.cos(2*Math.PI*X[0])+Math.cos(2*Math.PI*X[1]))))+Math.E+20; //2.Sphere function
//double newFitness = X[0]*X[0]+X[1]*X[1]; //3.Rosenbrock function
double newFitness = 100*(Math.pow((X[1]-X[0]*X[0]),2))+Math.pow((X[0]-1), 2); return newFitness;
} /**
* 初始化自己的位置和pbest
*/
public void initialX() {
for(int i=0;i<dimension;i++) {
X[i] = new Random().nextInt(100);
pbest[i] = X[i];
}
} /**
* 初始化自己的速度
*/
public void initialV() {
for(int i=0;i<dimension;i++) {
double tmp = new Random().nextDouble();//随机产生一个0~1的随机小数
V[i] = tmp*4+(-2);
}
} }

2.PSO算法实现过程

package nju.iip;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* PSO算法实现
* @author mrpod2g
*
*/
public class PSO { private static double[] gbest;//全局最优位置 private static double gbest_fitness = Double.MAX_VALUE;//全局最优位置对应的fitness private static int particle_num = 20;//粒子数 private static int N = 50;//迭代次数 private static int c1,c2 = 2; private static double w = 1.4;//惯性因子 private static List<Particle> particles = new ArrayList<Particle>();//粒子群 /**
* 初始化所有粒子
*/
public static void initialParticles() {
for(int i=0;i<particle_num;i++) {
Particle particle = new Particle();
particle.initialX();
particle.initialV();
particle.fitness = particle.calculateFitness();
particles.add(particle);
}
} /**
* update gbest
*/
public static void updateGbest() {
double fitness = Double.MAX_VALUE;
int index = 0;
for(int i=0;i<particle_num;i++) {
if(particles.get(i).fitness<fitness) {
index = i;
fitness = particles.get(i).fitness;
}
}
if(fitness<gbest_fitness) {
gbest = particles.get(index).pbest.clone();
gbest_fitness = fitness;
}
} /**
* 跟新每个粒子的速度
*/
public static void updateV() {
for(Particle particle:particles) {
for(int i=0;i<particle.dimension;i++) {
double v = w*particle.V[i]+c1*rand()*(particle.pbest[i]-particle.X[i])+c2*rand()*(gbest[i]-particle.X[i]);
if(v>particle.Vmax)
v = particle.Vmax;
else if(v<-particle.Vmax)
v = -particle.Vmax;
particle.V[i] = v;//更新Vi
}
}
} /**
* 更新每个粒子的位置和pbest
*/
public static void updateX() {
for(Particle particle:particles) {
for(int i=0;i<particle.dimension;i++) {
particle.X[i] = particle.X[i] + particle.V[i];
}
double newFitness = particle.calculateFitness();//新的适应值
//如果新的适应值比原来的小则跟新fitness和pbest
if(newFitness<particle.fitness) {
particle.pbest = particle.X.clone();
particle.fitness = newFitness;
}
}
} /**
* 算法主要流程
*/
public static void process() {
int n = 0;
initialParticles();
updateGbest();
while(n++<N) {
updateV();
updateX();
updateGbest();
System.out.println(n+".当前gbest:("+gbest[0]+","+gbest[1]+") fitness="+gbest_fitness);
}
} /**
* 返回一个0~1的随机数
* @return
*/
public static double rand() {
return new Random().nextDouble();
} public static void main(String[] args) {
process();
} }

基本PSO算法实现(Java)的更多相关文章

  1. 粒子群优化算法及其java实现

    憋了两周终于把开题报告憋出来了,再一次证明自己不适合搞学术,哎--,花了点时间把报告中提到的粒子群算法看了看,看了些资料,用java跑起来. 算法简介 粒子群算法最先由Barnhart博士和Kenne ...

  2. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  3. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  4. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  5. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  6. 7种基本排序算法的Java实现

    7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...

  7. 利用朴素贝叶斯算法进行分类-Java代码实现

    http://www.crocro.cn/post/286.html 利用朴素贝叶斯算法进行分类-Java代码实现  鳄鱼  3个月前 (12-14)  分类:机器学习  阅读(44)  评论(0) ...

  8. 【LeetCode-面试算法经典-Java实现】【053-Maximum Subarray(最大子数组和)】

    [053-Maximum Subarray(最大子数组和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Find the contiguous subarray w ...

  9. 一致性hash算法及java实现

    一致性hash算法是分布式中一个常用且好用的分片算法.或者数据库分库分表算法.现在的互联网服务架构中,为避免单点故障.提升处理效率.横向扩展等原因,分布式系统已经成为了居家旅行必备的部署模式,所以也产 ...

随机推荐

  1. 三角形示例(兼容IE6)

    html代码: <!--三角形的绘制--> <div class="sanjiao"></div> css代码: .sanjiao{ width ...

  2. 使用Canvas压缩图片

    讲干货,不啰嗦,当涉及对图片有质量压缩要求的时候,可以使用Canvas实现图片压缩. 步骤: 1.获取img元素,既要压缩的图片 2.创建canvas对象 3.使用canvas的drawImage方法 ...

  3. c#winform listview设置每项的间距

    代码如下: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private stat ...

  4. Image Processing and Analysis_21_Scale Space:Feature Detection with Automatic Scale Selection——1998

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  5. GNS3 介绍

    什么是GNS3? GNS3是一款模拟CISCO网络设备的模拟器,和CPT(Cisco Packet Tracer)相比.GNS3运行的是真实设备的IOS,命令集更全,在如有部分有非常好的表现,交换部分 ...

  6. 解决 分布式事务中HRESULT:0x8004D025 错误

    最近在开发分布式事务的过程中,碰到 该伙伴事务管理器已经禁止了它对远程/网络事务的支持. (异常来自 HRESULT:0x8004D025)的错误. 后来检查到,原来是数据库服务器的MSDTC 没有设 ...

  7. Java数组复制、遍历、反转

    /* 1.数组长度,直接length 即可! 2.min()/max(),需要调用库! 3.数组的复制 ,遍历复制,或者直接命名相等 即可! 4.数组反转时,直接折中即可!对调两重循环麻烦! */ i ...

  8. python_面向对象——类之间的依赖关系

    class Dog: def __init__(self,name,age,master): self.name = name self.age = age self.master = master ...

  9. js获取链接?后边的参数名称或者值

    1.获取后边的参数名称<script type="text/javascript"> var url = location.search; //获取url中" ...

  10. MySQL分组排序(取第一或最后)

    MySQL分组排序(取第一或最后) 方法一:速度非常慢,跑了30分钟 SELECT custid, apply_date, rejectrule FROM ( SELECT *, IF ( , ) A ...