package RPSO;
import java.io.IOException;
import java.util.Random;
public class pso {
static int n = 5;
double pi = Math.PI;
/**
* 计算两个个体间的距离
*
* @param a
* @param b
* @return
*/
public double calculatedis(double a[], double b[]) {
double dis = 0.0;
for (int i = 0; i < n; i++) {
dis += Math.pow((a[i] - b[i]), 2);
}
return Math.sqrt(dis);
}
/**
* 计算个体之间的距离
*
* @param population
* [][]种群
* @param dis
* [][]距离矩阵
* @param popsize
* 种群规模
*/
public void distance(double population[][], double dis[][], int popsize) {
double temp1[] = new double[n];
double temp2[] = new double[n];
for (int i = 0; i < popsize; i++) {
for (int j = 0; j < popsize; j++) {
for (int k = 0; k < n; k++) {
temp1[k] = population[i][k];
temp2[k] = population[j][k];
}
dis[i][j] = calculatedis(temp1, temp2);
}
}
}
/**
* 更新速度和位置
*/
public void updatev(int k, double v[][], double population[][],
double pbest[][], double nbest[][], double w, double c1, double c2,
int popsize, double low, double high) { // 速度、位置更新公式
double random_pick1 = 0.0;
double random_pick2 = 0.0;
for (int i = 0; i < popsize; i++) {
for (int j = 0; j < n; j++) {
Random random = new Random();
random_pick1 = (double) Math.abs(random.nextInt(10000)) / 10000;
random_pick2 = (double) Math.abs(random.nextInt(10000)) / 10000;
v[i][j] = w * v[i][j] + c1 * random_pick1
* (pbest[i][j] - population[i][j]) + c2 * random_pick2
* (nbest[i][j] - population[i][j]);
double Vmax = (high - (low)) * 0.1;// Vmax决定粒子在一个循环中最大的移动距离
double Vmin = -Vmax;
if (v[i][j] > Vmax) {
v[i][j] = Vmax;
// System.out.println("速度超了");
}
if (v[i][j] < Vmin) {
v[i][j] = Vmin;
// System.out.println("速度低了");
}
population[i][j] = population[i][j] + v[i][j]; // r
if (population[i][j] > high) {
population[i][j] = high;
// System.out.println("上界超了");
}
if (population[i][j] < low) {
population[i][j] = low;
// System.out.println("下界超了");
}
}
}
}
/**
* 找最优个体
*
* @param fitness
* [] 适应值
* @param popsize
* 种群数目
* @param population
* [][] 所有种群的种群个体
* @param BestIndividual
* [] 最优个体
* @return fitness[population_position] 最优适应值
* @author zzx
* @create Date 2016-1-4
*/
public double FindBestIndividual(double fitness[], int popsize,
double population[][], double BestIndividual[]) {
// int lay_num = 200;
int population_position = 0;
double best = 99999;
for (int i = 0; i < popsize; i++) {
if (best > fitness[i]) {
best = fitness[i];
population_position = i;
}
}
for (int i = 0; i < n; i++)
BestIndividual[i] = population[population_position][i];
return fitness[population_position];
}
/**
* 寻找相邻两个粒子的nbest
*
* @param a
* @param b
* @param nbest_fitness
* @param pbest_fitness
* @param nbest
* @param pbest
* @param n
*/
public void comparetwo(int a, int b, double nbest_fitness[],
double pbest_fitness[], double nbest[][], double pbest[][]) {
if (pbest_fitness[a] <= pbest_fitness[b]) {
nbest_fitness[a] = pbest_fitness[a];
nbest_fitness[b] = pbest_fitness[a];
for (int i = 0; i < n; i++) {
nbest[a][i] = pbest[a][i];
nbest[b][i] = pbest[a][i];
}
} else {
nbest_fitness[a] = pbest_fitness[b];
nbest_fitness[b] = pbest_fitness[b];
for (int i = 0; i < n; i++) {
nbest[a][i] = pbest[b][i];
nbest[b][i] = pbest[b][i];
}
}
}
/**
* 找三个粒子的nbest
*
* @param left
* 左粒子
* @param mid
* 中间粒子
* @param right
* 右粒子
* @param nbest_fitness
* []nbest的适应度值
* @param pbest_fitness
* []pbest的适应度值
* @param nbest
* [][]nbest种群
* @param pbest
* [][]pbest种群
* @param n染色体长度
*/
public void Findnbest(int left, int mid, int right, double nbest_fitness[],
double pbest_fitness[], double nbest[][], double pbest[][]) {
comparetwo(left, mid, nbest_fitness, pbest_fitness, nbest, pbest);
comparetwo(mid, right, nbest_fitness, pbest_fitness, nbest, pbest);
}
/**
* 计算适应度值
*
* @param I_popoulation
* @return
*/
public double caculte(double I_population[]) {
double x1 = 0;
double t[] = new double[n];
double y[] = new double[n + 1];
double x[] = new double[n + 1];
for (int i = 0; i < n; i++) {
x[i + 1] = I_population[i];
}
for (int i = 1; i < n + 1; i++) {
x1 += Math.pow(x[i] - 1, 2) + Math.pow(x[1] - x[i] * x[i], 2);
}
return x1;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
pso pso = new pso();
double w = 0.8; // 0.8 保持原来速度的系数,所以叫做惯性权重
double c1 = 2; // 2 粒子跟踪自己历史最优值的权重系数,它表示粒子自身的认识,所以叫“认知”。通常设置为2
double c2 = 2; // 2粒子跟踪群体最优值的权重系数,它表示粒子对整个群体知识的认识,所以叫做“社会知识”,经常叫做“社会”。通常设置为2。
// public static double r=1;//对位置更新的时候,在速度前面加的一个系数,这个系数我们叫做约束因子。通常设置为1
int popsize = 40;// 粒子 数目
int maxGen = 5000;// 迭代次数
double low = 0;// 下界
double high = 10;// 上界
/**
*
* 初始化部分
*/
// 根据井的数据用于生成Vp,Vs,ρ的上下域
double population[][] = new double[popsize][n];// 粒子的位置,求解问题多少维,则此数组为多少维
double pbest[][] = new double[popsize][n];// 粒子的历史最好位置
double pbest_fitness[] = new double[popsize];// 历史最优解
double v[][] = new double[popsize][n];// 粒子的速度,维数同位置
double nbest[][] = new double[popsize][n];// nbest
double nbest_fitness[] = new double[popsize];
double dis[][] = new double[popsize][popsize];
// pso.GeneratePopulation(population, popsize, v, pbest);// 根据上下域生成初始种群
// 种群初始化
for (int i = 0; i < popsize; i++) {
for (int j = 0; j < n; j++) {
Random random = new Random();
double val = ((double) Math.abs(random.nextInt(10000000)) / 10000000)
* (high - low) + low;
population[i][j] = val;
}
}
/**
* 存储初始种群的数据、适应值的数据
*/
double GA_per_pop_sample[] = new double[n];// 存储单个种群个体所拥有的603个数据
double fitness[] = new double[popsize];// 种群大小的适应值数组
for (int i = 0; i < popsize; i++) {
for (int j = 0; j < n; j++) {
GA_per_pop_sample[j] = population[i][j];
}
fitness[i] = pso.caculte(GA_per_pop_sample);
pbest_fitness[i] = fitness[i];
}
double gbest[] = new double[n];// 所有粒子找到的最好位置
double gbest_fitness = 99999;
gbest_fitness = pso.FindBestIndividual(fitness, popsize, population,
gbest);
System.out.println("初始 gbest_fitness: " + gbest_fitness);
// 初始pbest为自身
for (int i = 0; i < popsize; i++) {
for (int j = 0; j < n; j++) {
pbest[i][j] = population[i][j];
}
}
for (int i = 0; i < 40 / 3; i++) {
// 三个体不重叠
pso.Findnbest(i * 3, i * 3 + 1, i * 3 + 2, nbest_fitness,
pbest_fitness, nbest, pbest);
}
nbest_fitness[popsize - 1] = fitness[popsize - 1];
nbest[popsize - 1] = pbest[popsize - 1];
// 开始迭代
for (int k = 0; k < maxGen; k++) {
pso.updatev(k, v, population, pbest, nbest, w, c1, c2, popsize,
low, high);// 更新速度和位置
for (int i = 0; i < popsize; i++) {
for (int j = 0; j < n; j++) {
GA_per_pop_sample[j] = population[i][j];
}
fitness[i] = pso.caculte(GA_per_pop_sample);// 计算适应度值
if (fitness[i] < pbest_fitnes
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java实现PSO算法解决环形拓扑多模问题(源码).rar
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共1个文件
java:1个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 167 浏览量
2023-03-22
16:23:53
上传
评论
收藏 3KB RAR 举报
温馨提示
1、资源内容:基于Java实现PSO算法解决环形拓扑多模问题(源码).rar 2、适用人群:计算机,电子信息工程、数学等专业的学习者,作为“参考资料”参考学习使用。 3、解压说明:本资源需要电脑端使用WinRAR、7zip等解压工具进行解压,没有解压工具的自行百度下载即可。 4、免责声明:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。由于作者大厂工作较忙,不提供答疑服务,如不存在资源缺失问题概不负责,谢谢理解。
资源推荐
资源详情
资源评论
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![md](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 1 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/72a9936e28d84a44b8d02dcbe3729b26_m0_62143653.jpg!1)
Matlab仿真实验室
- 粉丝: 2w+
- 资源: 2179
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)