import java.util.Random;
public class test_pso {
public static void main(String[] args) {
// Math.exp(a)
pso pso_ = new pso();
pso_.start();
//System.out.println(Math.exp(2));
}
}
class pso {
private final static int iAgentDim=100;//粒子数目
private final static int iStep =10000;//迭代100次
private final static int c1 =2;//粒子对自身知识的认识 “认知”
private final static int c2 =2;//粒子对群体知识的认识 “社会知识”
private static int r = 1;//物理速度约束因子
private static double min_x = 0.0;//最小X取值
private static double max_x = 4.0;//最大X取值
private static double[] m_dpos = new double[iAgentDim]; // 粒子所在位置
// private double[] m_dy= new double[iAgentDim];//粒子本身的解
private static double[] m_dpbest = new double[iAgentDim]; // 粒子本身的最优位置
private static double[] m_dBestfitness = new double[iAgentDim]; // 粒子本身的最优解(粒子适应速度)
static double g_best ;// 全体的最优位置
static double g_Bestfitness ;// 全体的最优解
static double[] dv = new double[iAgentDim]; // 粒子的速度
static double[] dw = new double[iAgentDim]; // 粒子惯性权重
private static Random random = new Random();//随机数
public pso() {//初始化各参数
for (int i = 0; i < iAgentDim; i++) {
dw[i]=0;//惯性权重初始化为0
dv[i] =random.nextDouble();//初始化速度
m_dBestfitness[i] =0;// 最优解变量的初始化:设最差解为0
g_Bestfitness=0;
m_dpbest[i] = 0;
m_dpos[i] = (max_x -min_x)/(iAgentDim+2) *(i+1);//均匀分布位置
}
System.out.println("start " );
}
public void start() {
double x,y;
for (int i = 0; i < iStep; i++) {//迭代100次
for (int j = 0; j < iAgentDim; j++) {//粒子数目
x = getnewseat(j);
while(x <min_x || x >max_x ) {//超出正常范围
x = getnewseat(j);//重新计算
}
y = 1-Math.cos(3*x)*Math.exp(-x);
if (y >m_dBestfitness[j]) {//优于自身最优解
m_dBestfitness[j] =y;
m_dpbest[j] = x;
}
if (y>g_Bestfitness) {//优于全局最优解
g_Bestfitness = y;
g_best =x;
}
}
}
System.out.println( g_best+" " +g_Bestfitness);
for (int j = 0; j < iAgentDim; j++){
System.out.print(m_dBestfitness[j] +" ");
}
}
public static double getnewseat(int num) {//获取新的位置(x坐标)
//System.out.println(num);
double ran1 = random.nextDouble();
double ran2 = random.nextDouble();
dv[num] = dw[num] * dv[num] +c1*ran1*(m_dpbest[num] -m_dpos[num]) + c2*ran2*(g_Bestfitness-m_dpos[num]) ;
m_dpos[num] =m_dpos[num] + r*dv[num];
// if (m_dpos[num] <min_x || m_dpos[num] >max_x) {//超出正常范围
// getnewseat(num);//重新计算
// }
dw[num] = dv[num];//惯性=上次速度
return(m_dpos[num]);
}
}
- 1
- 2
前往页