一款PSO算法实现

package pso;
/**
* 一个文件里写两个类原则上和分别在两个文件里写没有区别,只是
* 在一个文件里,只有一个类是可以用public修饰的,这个类必须和
* 文件同名。否则会报错“The public type must be defined in
* its own file”。
* 而且,没有用public修饰的类不能被其它包里的类引用。
* main方法要写在public的那个类中, 类名和文件名一致。
*
*/
import java.util.*;

public class Particle {
public static void main(String[] args){
PSO pso = new PSO();
pso.Initialize();
pso.Search();
}
}

/**
* class Agent
*/
class Agent{ //Start class Agent
public static int iPOSNum = 20;
public static int iAgentDim = 20;
private final int iRang = 30;
private final double w = 0.9;
private final double delta1 = 1;
private final double delta2 = 1;
public double[] dpos = new double[iAgentDim]; //粒子的位置
public double[] dpbest = new double[iAgentDim]; //粒子本身的最优位置
public double[] dv = new double[iAgentDim]; //粒子的速度
private double m_dFitness;
public double m_dBestfitness; //m_dBestfitness 粒子本身的最优解
private Random random = new Random();
public static double[] gbest = new double[iAgentDim];

//==========构造Agent()函数==========
public Agent(){ //对Start Agent(),粒子的位置和速度进行初始化
for(int i = 0; i < iAgentDim; i++){
dpos[i] = (random.nextDouble()-0.5)*2*iRang; //返回[-iRang,+iRang]之间的一个任意的值
dv[i] = dpbest[i] = dpos[i];
}
} //End Agent()

//==========定义UpdateFitness()函数==========
public void UpdateFitness(){ //Start UpdateFitness()
double sum1 = 0;
double sum2 = 0;
//计算Ackley 函数的值
for(int i = 0; i < iAgentDim; i++ ){
sum1 += dpos[i] * dpos[i];
sum2 += Math.cos(2 * Math.PI * dpos[i]);
}
//m_dFitness 计算出的当前值
m_dFitness = -20 * Math.exp(-0.2 * Math.sqrt((1.0/iAgentDim) * sum1))
- Math.exp((1.0/iAgentDim) * sum2) + 20 + Math.E;
if(m_dFitness < m_dBestfitness){
m_dBestfitness = m_dFitness;
for(int i = 0; i < iAgentDim; i++){
dpbest[i] = dpos[i];
}
}
} //End UpdateFitness()

//==========定义UpdatePos()函数==========
public void UpdatePos(){ //Start UpdatePos()
for(int i = 0;i < iAgentDim;i++){
dv[i] = w * dv[i] + delta1 * random.nextDouble()
*(dpbest[i] - dpos[i]) + delta2 * random.nextDouble()
* ( gbest[i] - dpos[i]);
dpos[i] = dpos[i] + dv[i];
}
} //End UpdatePos()
} //End class Agent


/**
* class PSO
*/
class PSO{//Start class PSO
private Agent[] agent;
private final int iStep = 1000; //迭代次数
private double m_dBestFitness;
private int m_iTempPos;

public PSO(){
m_dBestFitness = 10000;
agent = new Agent[Agent.iPOSNum];
for(int i =0;i < Agent.iPOSNum;i++)
agent[i] = new Agent();
}
public void Initialize(){
for(int i = 0;i < Agent.iPOSNum;i++){
agent[i].m_dBestfitness = 10000;
agent[i].UpdateFitness();
}
}
public void Search(){ //Start Search()
int k = 0;
while(k < iStep){//Start while(k < iStep)
m_iTempPos = 999;
for(int i =0; i< Agent.iPOSNum;i++){
if(agent[i].m_dBestfitness < m_dBestFitness){
m_dBestFitness = agent[i].m_dBestfitness;
m_iTempPos = i;
}
}
if(m_iTempPos != 999){
for(int i =0;i < Agent.iAgentDim;i++){
Agent.gbest[i] = agent[m_iTempPos].dpbest[i];
}
}
for(int i = 0; i < Agent.iPOSNum;i++){
agent[i].UpdateFitness();
agent[i].UpdatePos();
}
k++;
} //End while(k < iStep)
System.out.println("After " + k + " steps " + "the best value is "
+ m_dBestFitness );
System.out.print("The best position is :");
for(int i = 0;i < Agent.iAgentDim;i++){
System.out.print(Agent.gbest[i] + " ");
}
}//End Search()
}//End class PSO
好的,以下是一个基于类的PSO算法实现示例: ```python import numpy as np class Particle: def __init__(self, dim, lb, ub): self.position = np.random.uniform(lb, ub, dim) self.velocity = np.zeros(dim) self.best_position = self.position.copy() self.best_cost = np.inf class PSO: def __init__(self, cost_function, dim, num_particles, maxiter, lb, ub, w=0.8, c1=2, c2=2): self.cost_function = cost_function self.dim = dim self.num_particles = num_particles self.maxiter = maxiter self.lb = lb self.ub = ub self.w = w self.c1 = c1 self.c2 = c2 self.particles = [Particle(dim, lb, ub) for _ in range(num_particles)] self.g_best = np.zeros(dim) self.g_best_cost = np.inf def optimize(self): for i in range(self.maxiter): for j in range(self.num_particles): # 计算适应度值 cost = self.cost_function(self.particles[j].position) # 更新个体历史最优位置和适应度值 if cost < self.particles[j].best_cost: self.particles[j].best_position = self.particles[j].position.copy() self.particles[j].best_cost = cost # 更新全局历史最优位置和适应度值 if cost < self.g_best_cost: self.g_best = self.particles[j].position.copy() self.g_best_cost = cost # 更新粒子速度和位置 r1 = np.random.uniform(size=self.dim) r2 = np.random.uniform(size=self.dim) self.particles[j].velocity = self.w * self.particles[j].velocity \ + self.c1 * r1 * (self.particles[j].best_position - self.particles[j].position) \ + self.c2 * r2 * (self.g_best - self.particles[j].position) self.particles[j].position = self.particles[j].position + self.particles[j].velocity # 边界处理 self.particles[j].position = np.maximum(self.particles[j].position, self.lb) self.particles[j].position = np.minimum(self.particles[j].position, self.ub) return self.g_best, self.g_best_cost ``` `Particle`类表示粒子,包含位置、速度、个体历史最优位置和适应度值等属性。`PSO`类表示整个粒子群算法,包含目标函数、变量数目、粒子数、最大迭代次数、变量下界和上界、惯性权重、加速常数等属性,以及粒子列表、全局历史最优位置和适应度值等属性。`optimize`方法实现算法的优化过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值