粒子集群算法简单实例 java实现
2017-02-20 15:34
591 查看
利用粒子集群算法,求解y=x1^2+x2^2+x3^2的最小值,迭代次数2000.
package com.song.test.pos; import java.util.Random; /** * 此例子用来理解粒子集群算法。 * 注意:在编写例子过程中,曾遇到过这样一个问题:在给数组赋值时,某些数据会产生覆盖、脏读等不可预期的错误。仔细调试,发现可能是因为在给数组赋值时,直接 * 使用了一个数组给另外一个数组赋值。这种方式是不正确的,切记!!! * */ public class Pos { private static int M=200; //迭代次数 private static int N=50; //粒子数 private static int D=3; //粒子维数 private static double[][] xPos = new double [D]; //存储各粒子的位置信息 private static double[][] yPos = new double [D]; //存储各粒子的位置信息副本(局部最优解) private static double[][] xVel = new double [D]; //存储各粒子的速度信息 private static double[] gBest = new double[D]; //全局最优解 private static double[] expense = new double ; //存储各粒子代价函数值 //相关参数 private static double w = 0.6; private static double c1 = 2.0; private static double c2 = 2.0; private Random random = new Random(); public static void main(String args[]) { Pos pos=new Pos(); pos.Initialize(); pos.Search(); } //初始化 public void Initialize() { //初始化位置和速度 for(int i=0;i<N;i++){ for(int j=0;j<D;j++){ xPos[i][j]=random.nextGaussian(); xVel[i][j]=random.nextGaussian(); } } //计算每个粒子的代价函数值,并初始化局部最优解和全局最优解 for(int i=0;i<N;i++){ expense[i] = function(xPos[i]); for(int d=0;d<D;d++){ yPos[i][d]=xPos[i][d]; } } for(int d=0;d<D;d++){ gBest[d] = xPos[N-1][d]; } for(int i=0;i<N-1;i++){ if(function(gBest)>=function(xPos[i])){ for(int d=0;d<D;d++){ gBest[d] = xPos[i][d]; } } } System.out.println("初始化完毕!"+function(gBest)); } //算法主体 public void Search() { for(int m=0;m<M;m++){ for(int n=0;n<N;n++) { //计算出粒子的速度和位置 for(int d=0;d<D;d++){ xVel [d] = w*xVel [d] + c1*random.nextDouble()*(yPos [d]-xPos [d])+c2*random.nextDouble()*(gBest[d]-xPos [d]); System.out.print(xPos [d]+" "); xPos [d] += xVel [d]; } //将粒子新位置的代价与粒子原本的代价进行比较,如果新的代价更小,则用此时新的位置更新粒子局部最优解,并更新此粒子代价 if(function(xPos )<expense ){ expense = function(xPos ); for(int d=0;d<D;d++){ yPos [d]=xPos [d]; } } //将此粒子的代价(是否更新过取决于上一步)与全局最优解的代价进行比较。如果此时的全局最优解代价更大,则将此粒子的局部最优解用来更新全局最优解 if(expense <function(gBest)){ for(int d=0;d<D;d++){ gBest[d] = yPos [d]; } } } System.out.println(function(gBest)+"\r\n"); } } public double function(double[] temp) { double y = temp[0] * temp[0] + temp[1] * temp[1] + temp[2] * temp[2]; return y; } }
相关文章推荐
- 用Java实现小球碰壁反弹的简单实例(算法十分简单)
- Java使用异或运算实现简单的加密解密算法实例代码
- 贪心算法实例:找零钱(Java实现)
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- 数据结构与算法——基数排序简单Java实现
- 进程调度-优先级算法(Java简单实现)
- 用Java实现小球碰壁反弹(算法十分简单)
- 又一种JSP实现的Java通用简单分页算法
- java 使用简单的demo实例告诉你优化算法的强大
- 最简单的LRU算法java实现
- Java类似淘宝分页简单算法实现
- 【算法数据结构Java实现】递归的简单剖析及时间复杂度计算
- 查找""排序""简单数学计算" "简单算法"[Java实现](数据结构和算法)(复习)(持续更新
- 感知机学习算法的原始形式的java简单实现
- [零基础学JAVA]Java SE应用部分-31.Java IO操作(05)IO操作实例讲解之实现简单MIS 推荐
- java实现简单留言板功能的代码实例
- 求一个向量的任何连续子向量的最大和的4种算法实现(简单实例)
- JAVA实现简单分组算法
- 微博URL短网址生成算法原理及(java版、php版实现实例)
- Kruskal生成树算法的java代码简单实现