pso java_粒子群优化算法(PSO)及其java实现

package com.jiajia.pso;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

/**

* @ClassName: PSO

* @Author: fanjiajia

* @Date: 2019/5/13 上午11:02

* @Version: 1.0

* @Description:

*/

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 = 500;//迭代次数

private static int c1,c2 = 2;

private static double w = 1.4;//惯性因子

private static List particles = new ArrayList();//粒子群

private static List fittessList = new ArrayList<>(N);

/**

* 主程序入口

* @param args

*/

public static void main(String[] args) {

process();

}

/**

* 初始化所有粒子

*/

public static void initialParticles() {

for(int i=0;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

if(particles.get(i).fitness

index = i;

fitness = particles.get(i).fitness;

}

}

if(fitness

gbest = particles.get(index).pbest.clone();

gbest_fitness = fitness;

}

}

/**

* 跟新每个粒子的速度

*/

public static void updateV(int n) {

for(Particle particle:particles) {

for(int i=0;i

double v =(0.9 - n*(0.9-0.4)/N) * 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

v = -particle.Vmax;

particle.V[i] = v;//更新Vi

}

}

}

/**

* 更新每个粒子的位置和pbest

*/

public static void updateX() {

for(Particle particle:particles) {

for(int i=0;i

particle.X[i] = particle.X[i] + particle.V[i];

}

double newFitness = particle.calculateFitness();//新的适应值

//如果新的适应值比原来的小则跟新fitness和pbest

if(newFitness

particle.pbest = particle.X.clone();

particle.fitness = newFitness;

}

}

}

/**

* 算法主要流程

*/

public static void process() {

int n = 0;

initialParticles();

updateGbest();

while(n++

updateV(n);

updateX();

updateGbest();

fittessList.add(gbest_fitness);

System.out.println(n+".当前gbest:("+gbest[0]+","+gbest[1]+") fitness="+gbest_fitness);

}

write2File();

}

/**

* 返回一个0~1的随机数

* @return

*/

public static double rand() {

return new Random().nextDouble();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值