package com.bjfu.pso;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
//import java.util.Vector;
/**
* this is the heart of the PSO program
* the code is for 2-dimensional space problem
* but you can easily modify it to solve higher dimensional space problem
* @author xulei
*
*/
public class PSOProcess implements PSOConstants {
//private Vector<Particle> swarm = new Vector<Particle>();
private List<Particle> swarm = new ArrayList<Particle>();
//private Vector<Location> pBestLocation = new Vector<Location>();
private List<Location> pBestLocation = new ArrayList<Location>();
private double[] pBest = new double[SWARM_SIZE];
private double gBest;
private Location gBestLocation;
private double[] fitnessValueList = new double[SWARM_SIZE];
//方法调用返回下一个从这个随机数生成器的序列中均匀分布的0.0和1.0之间的double值。
Random generator = new Random();
public void execute() {
//初始化种群
initializeSwarm();
//更新适应值列表
updateFitnessList();
//初始化pBest和pBestLocation
for (int i = 0; i < SWARM_SIZE; i++) {
pBest[i] = fitnessValueList[i];
pBestLocation.add(swarm.get(i).getLocation());
}
int t = 0;
double w;
double err = 9999;
while (t < MAX_ITERATION && err > ProblemSet.ERR_TOLERANCE) {
//1、update pBest
for (int i = 0; i < SWARM_SIZE; i++) {
if (fitnessValueList[i] < pBest[i]) {
pBest[i] = fitnessValueList[i];
pBestLocation.set(i, swarm.get(i).getLocation());
}
}
//2、update gBest
int bestParticleIndex = PSOUtility.getMinPos(fitnessValueList);
if (t == 0 || fitnessValueList[bestParticleIndex] < gBest) {
gBest = fitnessValueList[bestParticleIndex];
gBestLocation = swarm.get(bestParticleIndex).getLocation();
}
//计算惯性因子
w = W_UPPERBOUND - (((double) t) / MAX_ITERATION) * (W_UPPERBOUND - W_LOWERBOUND);
for (int i = 0; i < SWARM_SIZE; i++) {
double r1 = generator.nextDouble();
double r2 = generator.nextDouble();
Particle particle = swarm.get(i);
//3、update velocity
double[] newVel = new double[PROBLEM_DIMENSION];
newVel[0] = (w * particle.getVelocity().getVel()[0])
+ (r1 * C1) * (pBestLocation.get(i).getLoc()[0] - particle.getLocation().getLoc()[0])
+ (r2 * C2) * (gBestLocation.getLoc()[0] - particle.getLocation().getLoc()[0]);
newVel[1] = (w * particle.getVelocity().getVel()[1])
+ (r1 * C1) * (pBestLocation.get(i).getLoc()[1] - particle.getLocation().getLoc()[1])
+ (r2 * C2) * (gBestLocation.getLoc()[1] - particle.getLocation().getLoc()[1]);
Velocity velocity = new Velocity(newVel);
particle.setVelocity(velocity);
//4、update location
double[] newLoc = new double[PROBLEM_DIMENSION];
newLoc[0] = particle.getLocation().getLoc()[0] + newVel[0];
newLoc[1] = particle.getLocation().getLoc()[1] + newVel[1];
Location location = new Location(newLoc);
particle.setLocation(location);
System.out.println("fasdfsadfsdafs");
}
// minimizing the functions means it's getting closer to 0
err = ProblemSet.evaluate(gBestLocation) - 0;
System.out.println("ITERATION " + t + ":");
System.out.println(" Best X: " + gBestLocation.getLoc()[0]);
System.out.println(" Best Y: " + gBestLocation.getLoc()[1]);
System.out.println(" Value: " + ProblemSet.evaluate(gBestLocation));
t++;
updateFitnessList();
}
//输出最终结果解:
System.out.println("Solution found at iteration " + (t - 1) + ", the solution is : ");
System.out.println(" Best X: " + gBestLocation.getLoc()[0]);
System.out.println(" Best Y: " + gBestLocation.getLoc()[1]);
}
/**
* 初始化种群:就是初始化数据
* 【后期从excle中读取】
*/
public void initializeSwarm() {
Particle particle;
for (int i = 0; i < SWARM_SIZE; i++) {
particle = new Particle();
//randomize location inside a space defined in Problem Set
double[] loc = new double[PROBLEM_DIMENSION];
loc[0] = ProblemSet.LOC_X_LOW + generator.nextDouble() * (ProblemSet.LOC_X_HIGH - ProblemSet.LOC_X_LOW);
loc[1] = ProblemSet.LOC_Y_LOW + generator.nextDouble() * (ProblemSet.LOC_Y_HIGH - ProblemSet.LOC_Y_LOW);
Location location = new Location(loc);
//randomize velocity in the range defined in Problem Set
double[] vel = new double[PROBLEM_DIMENSION];
vel[0] = ProblemSet.VEL_LOW + generator.nextDouble() * (ProblemSet.VEL_HIGH - ProblemSet.VEL_LOW);
vel[1] = ProblemSet.VEL_LOW + generator.nextDouble() * (ProblemSet.VEL_HIGH - ProblemSet.VEL_LOW);
Velocity velocity = new Velocity(vel);
particle.setLocation(location);
particle.setVelocity(velocity);
swarm.add(particle);
}
}
/**
* 更新适应值列表
*/
public void updateFitnessList() {
for (int i = 0; i < SWARM_SIZE; i++) {
fitnessValueList[i] = swarm.get(i).getFitnessValue();
}
}
}
粒子群算法的Java实现源码
需积分: 23 125 浏览量
2018-03-10
11:03:01
上传
评论
收藏 14KB ZIP 举报
xl_lhc_520
- 粉丝: 5
- 资源: 45
最新资源
- 基于Matlab人脸肤色定理的教师人数统计+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab霍夫曼变换的表盘读数识别+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab火灾烟雾检测源码带GUI界面+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab的恶劣天气交通标志识别系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于MATLAB的霍夫曼变换的表盘示数识别+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab的车道线识别系统 +源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于MATLAB的教室人数统计系统带Gui界面+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于MATLAB的教室人数统计系统带Gui界面+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于MATLAB 的霍夫曼变换答题卡识别源码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab+bp神经网络的神经网络汉字识别系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈