PSO算法的java实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_39919527/article/details/82532840

1.粒子类

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.进化类

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();
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_39919527/article/details/82532840