当前位置: 首页 > 编程日记 > 正文

普通粒子群算法和优化方法

粒子群优化(PSO, particle swarm optimization) 是由Kennedy和Eberhart在1995年提出的一 种群智能优化方法。

优点:好理解容易实现,适合解决极值问题

缺点:容易过早收敛,容易陷入局部最优解,(如果初始点选的不好,可能就会被某个粒子带偏了= =/)

(Java实现):

 1 package pso;
 2 
 3 import java.util.Random;
 4 
 5 /**
 6  * 粒子类
 7  * 
 8  * @see dimension
 9  * @author Flyuz
10  */
11 public class Particle {
12     // 维数
13     public int dimension = 2;
14     // 粒子的位置
15     public double[] X = new double[dimension];
16     // 粒子的速度
17     public double[] V = new double[dimension];
18     // 局部最好位置
19     public double[] pbest = new double[dimension];
20     // 最大速度
21     public double Vmax = 2;
22     // 最大位置
23     public double[] Xmax = { 2, 2 };
24     // 最小位置
25     public double[] Xmin = { -2, -2 };
26     // 适应值
27     public double fitness;
28 
29     /**
30      * 根据当前位置计算适应值 本例子求式子最大值
31      * 
32      * @return newFitness
33      */
34     public double calculateFitness() {
35 
36         double newFitness = 0;
37         if (X[0] == 0 && X[1] == 0)
38             newFitness = Math.exp((Math.cos(2 * Math.PI * X[0]) + Math.cos(2 * Math.PI * X[1])) / 2) - 2.71289;
39         else
40             newFitness = Math.sin(Math.sqrt(Math.pow(X[0], 2) + Math.pow(X[1], 2)))
41                     / Math.sqrt(Math.pow(X[0], 2) + Math.pow(X[1], 2))
42                     + Math.exp((Math.cos(2 * Math.PI * X[0]) + Math.cos(2 * Math.PI * X[1])) / 2) - 2.71289;
43         return newFitness;
44     }
45 
46     /**
47      * 初始化自己的位置和pbest
48      */
49     public void initialX() {
50         for (int i = 0; i < dimension; i++) {
51             X[i] = new Random().nextDouble() * (Xmax[i] - Xmin[i]) + Xmin[i];
52             pbest[i] = X[i];
53         }
54     }
55 
56     /**
57      * 初始化自己的速度
58      */
59     public void initialV() {
60         for (int i = 0; i < dimension; i++) {
61             V[i] = new Random().nextDouble() * Vmax * 0.5;
62         }
63     }
64 }
粒子类
算法类
针对缺点,提出了 Multi-start PSO 算法,即每迭代若干次后,都保留历史优粒子,粒子全部初始化,以提高粒子的多样性,扩大搜索 空间。又提出了一种动态惯性权重的粒子群优化算法,惯性权重随着迭代次数的增加而降低,在开始阶段具有较强的全局搜索能力,而在后期以 较小的惯性权重能够收敛到优解。
  1 package pso;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import java.util.Random;
  6 
  7 public class NormalPSO {
  8 
  9     private static double[] gbest;// 全局最优位置
 10     private static double gbest_fitness = -0x3f3f3f;// 全局最优位置对应的fitness
 11     private static int particle_num = 10;// 粒子数
 12     private static int N = 100;// 迭代次数
 13     private static int c1, c2 = 2;
 14     private static double w = 1.4;// 惯性因子
 15     private static List<Particle> particles = new ArrayList<Particle>();// 粒子群
 16 
 17     /**
 18      * 初始化所有粒子
 19      */
 20     public static void initialParticles() {
 21         for (int i = 0; i < particle_num; i++) {
 22             Particle particle = new Particle();
 23             particle.initialX();
 24             particle.initialV();
 25             particle.fitness = particle.calculateFitness();
 26             particles.add(particle);
 27         }
 28     }
 29 
 30     /**
 31      * 更新 gbest
 32      */
 33     public static void updateGbest() {
 34         double fitness = -0x3f3f3f;
 35         int index = 0;
 36         for (int i = 0; i < particle_num; i++) {
 37             if (particles.get(i).fitness > fitness) {
 38                 index = i;
 39                 fitness = particles.get(i).fitness;
 40             }
 41         }
 42         if (fitness > gbest_fitness) {
 43             gbest = particles.get(index).pbest.clone();
 44             gbest_fitness = fitness;
 45         }
 46     }
 47 
 48     /**
 49      * 更新每个粒子的速度
 50      */
 51     public static void updateV() {
 52         for (Particle particle : particles) {
 53             for (int i = 0; i < particle.dimension; i++) {
 54                 double v = w * particle.V[i] + c1 * rand() * (particle.pbest[i] - particle.X[i])
 55                         + c2 * rand() * (gbest[i] - particle.X[i]);
 56                 if (v > particle.Vmax)
 57                     v = particle.Vmax * rand();
 58                 else if (v < -particle.Vmax)
 59                     v = -particle.Vmax * rand();
 60                 particle.V[i] = v;// 更新Vi
 61             }
 62         }
 63     }
 64 
 65     /**
 66      * 更新每个粒子的位置和pbest
 67      */
 68     public static void updateX() {
 69         for (Particle particle : particles) {
 70             for (int i = 0; i < particle.dimension; i++) {
 71                 particle.X[i] = particle.X[i] + particle.V[i];
 72                 if (particle.X[i] > particle.Xmax[i])
 73                     particle.X[i] = new Random().nextDouble() * (particle.Xmax[i] - particle.Xmin[i])
 74                             + particle.Xmin[i];
 75                 if (particle.X[i] < particle.Xmin[i])
 76                     particle.X[i] = new Random().nextDouble() * (particle.Xmax[i] - particle.Xmin[i])
 77                             + particle.Xmin[i];
 78             }
 79             double newFitness = particle.calculateFitness();// 新的适应值
 80             if (newFitness > particle.fitness) {
 81                 particle.pbest = particle.X.clone();
 82                 particle.fitness = newFitness;
 83             }
 84         }
 85     }
 86 
 87     /**
 88      * 算法主要流程
 89      */
 90     public static void process() {
 91         int n = 0;
 92         initialParticles();
 93         updateGbest();
 94         while (n++ < N) {
 95             /*
 96              * Multi-start PSO 算法,即每迭代若干次后,都保留历史优粒子, 粒子全部初始化,以提高粒子的多样性,扩大搜索 空间。
 97              */
 98             if (n == N / 2) {
 99                 initialParticles();
100                 updateGbest();
101             }
102             updateV();
103             updateX();
104             updateGbest();
105             w -= 0.01; // 动态惯性权重
106             System.out.println(n + ". 当前gbest:(" + gbest[0] + "," + gbest[1] + ")  fitness = " + gbest_fitness);
107         }
108     }
109 
110     public static double rand() {
111         return new Random().nextDouble();
112     }
113 
114     public static void main(String[] args) {
115         process();
116     }
117 }
改进后的PSO

改进后,虽然有一定的效果,但是效果不太明显。

后来又提出许多混合粒子群算法,比如遗传粒子群(BPSO)、免疫粒子群(IPSO)、混沌粒子群等(CPSO),针对不同的领域,需选用适合的优化算法。

转载于:https://www.cnblogs.com/flyuz/p/9210777.html

相关文章:

古人怎么称呼年龄

来自为知笔记(Wiz)转载于:https://www.cnblogs.com/sanyuanempire/p/6154780.html

vue变量传值_vue组件与组件之间传值

目录一、父组件向子组件传值二、子组件向父组件传值三、兄弟组件之间的传值如上图所示&#xff0c;2是1的子组件&#xff0c;1是3的父组件&#xff0c;2和3是兄弟组件一、父组件向子组件传值&#xff1a;html代码:<div id"app"><v-app><!-- 用:xxxx&q…

区块链技术背后的运行逻辑

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链技术可能是自互联网技术以来最伟大的发明。区块链可以在不需要有中央权威机构的情况下或不需要双方信任的情况下交换价值或财富。想像一下你…

scp遇到路径中有空格

sudo scp root1.1.1.1:/test/soft/123/Microsoft SQL Server 2000.iso . 错误&#xff01; sudo scp root1.1.1.1:"/test/soft/123/Microsoft SQL Server 2000.iso" . 错误&#xff01; sudo scp root1.1.1.1:/test/soft/123/Microsoft\ SQL\ Server\ 2000.…

bzoj 3262 陌上花开

本质是一个三维偏序&#xff0c;一位排序后cdq分治&#xff0c;一维在子函数里排序&#xff0c;一维用树状数组维护。 把三维相等的合并到一个里面。 1 #include<iostream>2 #include<cstdio>3 #include<algorithm>4 #include<cstring>5 #define N 100…

jspstudy启动mysql失败_MySql启动数据库设置初始密码

这一小节介绍在Mac OS、Linux、Windows上启动关闭重启MySQL服务&#xff0c;以及部分图形化界面对服务的操控。安装完成后&#xff0c;可以使用 service 命令启动 mysql 服务&#xff0c;在Mac上service命令不存在。命令行启动关闭重启MySQL服务在命令行终端启动 MySQL 非常方便…

区块链技术产生数字货币时代

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 比特币是一种革命性的数字货币&#xff0c;更是一种颠覆性的创新技术。比特币最大的贡献是创造了信用&#xff0c;解决了困扰互联网进一步发展的拜…

软件构造 第二章 第一节 软件生命周期和版本控制

软件构造第二章 第一节 软件生命周期和版本控制 基本内容 Software Development Lifecycle (SDLC) Traditional software process models (waterfall, incremental, V- model, prototyping, spiral) Agile development and eXtreme Programming (XP) Collaborative software de…

三极管在ad中的原理图库_555时基电路内部结构及其工作原理

555时基电路特点时基电路是一种常用的模数混合型集成电路。由它组成的振荡器、单稳态触发器、双稳态触发器和各类电子开关等都被十分广泛地应用在各类电路之中。它具有定时精度高、响应速度快、温漂小、输出驱动电流大、结构简单等优点。555时基电路型号命名555时基芯片由其内部…

Mac下导出chrome插件

Mac下导出chrome插件 chrome最强大的功能之一就是插件&#xff0c;有时候需要给小伙伴们共享一些插件&#xff0c;所以需要将自己chrome中的插件打包&#xff0c;在mac下打包插件还是挺费劲的&#xff0c;在此记录。 打开chrome的扩展程序&#xff0c;找到要导出的插件&#xf…

区块链技术的本质是分布式数据库

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链技术是基于比特币应用提出的一个概念&#xff0c;他是一个融合了多种技术的一个集成式创新。目前区块链的应用早已不仅仅局限在比特币上。人…

sql数据库系统表和mysql系统表

sql数据库系统表,常用的(sysobjects,sysindexes,sysindexkeys,SYSCOLUMNS,SYSTYPES 及更多解释说明): https://docs.microsoft.com/zh-tw/previous-versions/sql/sql-server-2012/ms177596(v%3dsql.110) 系统存储过程sp_spaceused: 执行sp_spaceused存储过程的时候可以不用带参…

交换机启用光口命令_如何在思科交换机上查询光模块状态?

本篇文章易天光通信(ETU-LINK)将为大家介绍下怎么在思科交换机上查询光模块的信息。 第一步,我们需要连接网络,然后登陆思科交换机的管理平台,用户名和密码默认是cisco/cisco。 第二步,在交换机的特权EXEC模式,通过输入以下使用显示光纤端口光纤收发器命令:show光纤端口…

深入浅出谈以太坊智能合约

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 1什么是合约? 合约是代码&#xff08;它的功能&#xff09;和数据&#xff08;它的状态&#xff09;的集合&#xff0c;存在于以太坊区块链的特定…

人机猜拳(这是最近的一个总结)

人机猜拳是我自己原创的一段代码&#xff0c;我刚学完do-while&#xff0c;知识有限&#xff0c;但自己感觉写的这段代码是我的一个小巅峰&#xff0c;发出来让大家看看&#xff0c;新手能学到东西的话是极好的&#xff0c;然后更多的是想让一些老鸟给点建议。这个写代码很枯燥…

利用python3 调用zabbix接口完成批量加聚合图形(screens)

在上一篇博客中&#xff0c;我们完成的利用python3 调用zabbix接口批量增加主机&#xff0c;增加主机的item,增加主机的图形&#xff01; 接下来我们完成批量增加主机的screen 首先我们要增加screen需要哪些参数呢&#xff1f;官方的解释如下&#xff1a; {"jsonrpc"…

轮播切换_javascript基础(一)——轮播图

javascript基础(一)——轮播图1、轮播图的实现原理轮播图的js实现原理其实十分的简单&#xff0c;首先将图片放入一个ul标签中&#xff0c;ul标签的大小要足够将所有图片放入其中。然后再将ul标签放进div中&#xff0c;这个div的大小正好可以显示一整张图片&#xff0c;将其他图…

以太坊挖矿源码:clique算法

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 clique 以太坊的官方共识算法是ethash算法&#xff0c;这在前文已经有了详细的分析&#xff1a; 它是基于POW的共识机制的&#xff0c;矿工需要通…

JS中简单原型的使用

转载于:https://www.cnblogs.com/hwgok/p/6163335.html

vuex+vue-router拦截

干就完了 项目中经常遇到这样一个场景&#xff0c;用户信息或者进行增删改的一些模块&#xff0c;需要根据用户是否登录&#xff0c;进行路由拦截&#xff0c;直接上代码 在store文件夹下的store.js中存放一个默认登录状态 /** store.js* */ import Vue from vue import Vuex …

通关制单机器人_2020关务节|“数字供应链与智能通关”论坛——如何打造云上跨境贸易生态圈...

点击标题下「蓝色微信名」可快速关注 随着跨境贸易的飞速发展&#xff0c;其涉及的有商流、信息流、资金流与物流。其中&#xff0c;物流特别是跨境物流&#xff0c;又是其中较为重要的一个环节。如何解决跨境贸易的物流物流困难&#xff1f;让我们来听听&#xff0c;欧坚集团副…

区块链技术世界

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 2017年发展最火热的技术&#xff0c;我觉得一个人工智能AI&#xff0c;另一个当之无愧的是一个叫区块链东西。最典型的例子是&#xff0c;人类顶…

Python学习心得第一周-03练习2

#5. 求1-23-45 ... 99的所有数的和 res0 count1 while count <100:if count%2 0:res-countelse:rescountcount1 print(res) #6. 用户登陆&#xff08;三次机会重试&#xff09; count0 while count<3:nameinput(name:)passwordinput(password:)if nameztc and passwords…

与MySQL传统复制相比,GTID有哪些独特的复制姿势?

与MySQL传统复制相比&#xff0c;GTID有哪些独特的复制姿势? http://mp.weixin.qq.com/s/IF1Pld-wGW0q2NiBjMXwfg 陈华军&#xff0c;苏宁云商IT总部资深技术经理&#xff0c;从事数据库服务相关的开发和维护工作&#xff0c;之前曾长期从事富士通关系数据库的开发&#xff0c…

方法的运用_企业如何运用论坛做营销,千享科技分享技巧方法

随着互联网的普及&#xff0c;对企业的发展带来了很大的影响&#xff0c;传统的营销已经满足不了企业的发展&#xff0c;需要运用互联网来营销&#xff0c;企业也意识到了互联网营销的重要性&#xff0c;而做互联网营销可以分成几种形式进行&#xff0c;像百度知识营销、论坛营…

区块链开发入门

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链这么火&#xff0c;可是你很快就会发现&#xff0c;想要入门区块链开发&#xff0c;尤其是想要从零开始学习区块链编程&#xff0c;根本都找…

linux怎么创建牡蛎_文件amp;目录小技巧 | Linux后门系列

0x01 Linux 目录技巧我们都知道 Windows 下文件和文件夹命名是有很多规则和限制的&#xff0c;但是可以通过一些程序来绕过限制&#xff0c;今天我们来看看 Linux 有哪些有趣的规则 参考 https://www.pathname.com/fhs/pub/fhs-2.3.pdf当然了&#xff0c;我这种人怎么可能按照官…

php简单算法之冒泡排序

<?php $arr [2,4,1,5,3,11,6,999,88,666,66,44,22,33,776];function getNewArr($arr){$count count($arr);//该层循环控制 需要冒泡的轮数for($i1;$i<$count;$i){//该层循环用来控制每轮 冒出一个数 需要比较的次数for($k0;$k<$count-$i;$k){if($arr[$k]>$arr[…

iOS单个应用程序的最大可用内存是多少?

iOS单个应用程序的最大可用内存是多少&#xff1f; StackOverflow上有人做了一些简单的测试&#xff0c;有限设备下迄今为止测到的结果&#xff1a; iPad1: 127MB/256MB/49% (大致crash临界值 / 总内存 / 占比)iPad2: 275MB/512MB/53%iPad3: 645MB/1024MB/62%iPad4: 585MB/102…

sql 存储过程和函数

最近在学习数据库&#xff0c;上课过程中总是在许多知识点有或多或少的问题&#xff0c;对于这些问题的产生&#xff0c;大概是由于我听课习惯所造成的吧&#xff0c;好啦&#xff0c;废话不多说&#xff0c;开始今天到主题吧。 首先介绍SQL的存储过程&#xff0c;先来给它定义…