QPSO Algorithm
QPSO Algorithm
C#语言.NetFramwork4.6.1平台实现(需了解QPSO算法原理,可参考清华大学孙俊教授编写的教材《量子行为粒子群优化原理及其应用》)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Quantum_Behavioral_Particle_Swarm_Algorithm
{public struct Particle //定义粒子的结构体{public double[] x;//粒子当前位置public double[] pbest;//粒子的个体最好位置public double bestfitness;//粒子个体最好位置适应值public double fitness;//粒子的当前最好位置适应值}public class QPSO_Test{//全局变量定义readonly int popsize = 20;//群体规模readonly static int dimension = 30;//问题维数readonly static int runno = 50;//运行次数readonly int Maxiter = 2000;//最大迭代次数double irange_l = 15;//位置初始化下界double irange_r = 30;//位置初始化上界double xmin = -100;//搜索上界double xmax = 100;//搜索下界double[] gbest = new double[dimension];//全局最优解double gbestfitness=0;//全局最优值Random rand = new Random();//随机数产生器public static double[] data = new double[runno];//存储每次运行后的结果public static double[] gdata = new double[runno];//种群迭代结果存储/// <summary>/// 标准测试函数Sphere函数定义/// </summary>/// <param name="x">可行解</param>/// <returns>函数值</returns>double Fsphere(double[] x){int i;double value;value = 0;for (i = 0; i < dimension; i++){value += Math.Pow(x[i], 2);}return value;}/// <summary>/// 标准测试函数Rosenbrock函数的定义/// </summary>/// <param name="x">可行解</param>/// <returns>函数值</returns>double Frosenbrock(double[] x){int i;double value;value = 0;for (i = 0; i < dimension-1; i++){value += 100 * Math.Pow((x[i + 1] - x[i] * x[i]), 2) + Math.Pow((x[i] - 1), 2);}return value;}/// <summary>/// 程序初始化定义/// </summary>/// <param name="population">粒子群种群</param>void Initiate(Particle[] population){int i, j;for (i = 0; i < population.Length; i++){population[i].x = new double[dimension];population[i].pbest = new double[dimension];for (j = 0; j < dimension; j++){//粒子当前位置的初始化population[i].x[j] = rand.NextDouble() * (irange_r - irange_l) + irange_l;//粒子当前最好位置的初始化population[i].pbest[j] = population[i].x[j];}//粒子当前位置的适应值population[i].fitness = Frosenbrock(population[i].x);//粒子个体最好位置的适应值population[i].bestfitness = population[i].fitness;}}/// <summary>/// 更新粒子群全局最好位置/// </summary>/// <param name="population">粒子群</param>/// <returns>最好解索引下标</returns>int Globalbest(Particle[] population){int i, flag;double s = 0;s = population[0].fitness;flag = 0;for (i = 1; i < population.Length; i++){if (population[i].fitness < s){s = population[i].fitness;flag = i;}}return flag;}/// <summary>/// 主程序/// </summary>public void RunAlgorithm(){Particle[] swarm = new Particle[popsize];//定义粒子群//其他变量int i, k, t, g, run;//run:运行次数循环下标 k:维数循环下标 t:迭代次数循环下标 i:种群循环下标 g:最好位置粒子下标 double a, tmp, fi1, fi2, u, v, z, b, p;//a:收缩-扩张系数值 tmp:临时局部变量 p:吸引势量子 fi1、fi2、u、z:随机数 b:特征长度 v:随机对数double[] mbest = new double[dimension];//每维平均位置double[] gbest = new double[dimension];//全局最好粒子//循环迭代寻优for (run = 0; run < runno; run++){Initiate(swarm);//初始化群体//求全局最好位置粒子下标g = Globalbest(swarm);for (k = 0; k < dimension; k++){gbest[k] = swarm[g].pbest[k];}gbestfitness = swarm[g].bestfitness;//初始化最优值的变量//算法迭代开始int j = 0;for (t = 0; t < Maxiter; t++){//计算mbestfor (k = 0; k < dimension; k++){tmp = 0;for (i = 0; i < popsize; i++){tmp += swarm[i].pbest[k];}mbest[k] = 1.0 * tmp / popsize;}//收缩-扩张系数值的计算a = (1.0 - 0.5) * (Maxiter - t) / Maxiter + 0.5;//群体更新for (i = 0; i < popsize; i++){for (k = 0; k < dimension; k++){fi1 = rand.NextDouble();fi2 = rand.NextDouble();p = 1.0 * (fi1 * swarm[i].pbest[k] + fi2 * gbest[k]) / (fi1 + fi2);u = rand.NextDouble();b = a * Math.Abs(mbest[k] - swarm[i].x[k]);v = Math.Log(1.0 / u);z = rand.NextDouble();//更新粒子位置if (z < 0.5)swarm[i].x[k] = p + b * v;elseswarm[i].x[k] = p - b * v;//粒子位置限制在搜索范围内if (swarm[i].x[k] < xmin)swarm[i].x[k] = xmin;if (swarm[i].x[k] > xmax)swarm[i].x[k] = xmax;}swarm[i].fitness = Frosenbrock(swarm[i].x);//粒子当前位置适应值if (swarm[i].fitness < swarm[i].bestfitness)//更新粒子个体最好位置{for (k = 0; k < dimension; k++){swarm[i].pbest[k] = swarm[i].x[k];}swarm[i].bestfitness = swarm[i].fitness;}if (swarm[i].bestfitness < gbestfitness)//更新粒子全局最好位置{for (k = 0; k < dimension; k++){gbest[k] = swarm[i].pbest[k];}gbestfitness = swarm[i].bestfitness;}}if ((t+1) % 40 == 0){gdata[j++] = gbestfitness;}}data[run] = gbestfitness;}}/// <summary>/// 算法运行结果/// </summary>/// <returns>最优值</returns>public double[] Value(){return data;}/// <summary>/// 种群迭代结果/// </summary>/// <returns>迭代值</returns>public double[] GValue(){return gdata;}}
}
运行结果图
运用Chart控件可将方法Value()与方法GValue()中的结果输出,运行过程及结果如下图所示。
QPSO Algorithm相关推荐
- HMM——维特比算法(Viterbi algorithm)
1. 前言 维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给 ...
- 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(五)分水岭算法(watershed algorithm)
8.5 分水岭算法(watershed algorithm) 1.基于拓扑理论的数学形态学的分割方法. 2.基本思想:把图像看作测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局 ...
- C++ algorithm的sort函数总结
sort函数 sort对给定区间进行排序,支持各种数据类型,迭代器,结构体,自定义排序规则 stable_sort 对给定区间进行稳定排序,且可保证相等元素的原本相对次序在排序后保持不变 partia ...
- SLAM之特征匹配(三)————RANSAC------LO-RANSAC Algorithm
matlab 编译loransac,lapack mex ranH.c时一直链接错误. 原来mex在编译多个文件时要把所有的C文件都列出来.命令如下: mex loransacH.mex.c ranH ...
- C++/C++11中头文件algorithm的使用
<algorithm>是C++标准程序库中的一个头文件,定义了C++ STL标准中的基础性的算法(均为函数模板).<algorithm>定义了设计用于元素范围的函数集合.任何对 ...
- 2018/8/27 A Modified PSO Algorithm with Exponential Decay Weight
信息: 2017年 会议 题目: A Modified PSO Algorithm with Exponential Decay Weight 总 ...
- count http://www.cplusplus.com/reference/algorithm/count/
// count algorithm example#include <iostream>#include <algorithm>#include <vector> ...
- 子图同构问题与Ullmann Algorithm 算法(一)
目录索引 目录索引 写在前面的话 子图同构定义 子图同构的映射关系 Reference 写在后面的话 写在前面的话 谨以此片献给 my best love, grandpa. 时光匆匆流逝,我们永远无 ...
- R语言基于遗传算法(Genetic Algorithm)进行特征筛选(feature selection)
R语言基于遗传算法(Genetic Algorithm)进行特征筛选(feature selection) 特征选择的目的 1.简化模型,使模型更易于理解:去除不相关的特征会降低学习任务的难度.并且可 ...
最新文章
- 数学推导+纯Python实现机器学习算法:GBDT
- 综述:神经网络中 Normalization 的发展历程
- 关于make *.img时没有权限的问题
- JQuery 获取节点
- python3.8新特性 逻辑表达式_Python3.8正式发布!新特性解析在这里
- 【NLP】NLP实战篇之tensorflow2.0快速入门
- Linux 系统线程数量上限是多少?
- PHP在线小说txt生成器源码
- les物流执行系统_【精益运营】细化运营 精益求精 将“精准物流”落到实处...
- PHP反序列化字符串溢出
- 重磅 I IT4IT 2.1中文版正式发布特邀专家彭斐推荐
- python缺失数据处理_python 缺失值处理的方法(Imputation)
- 公布C#写的网游外挂源代码
- 在centos上搭建饥荒服务器
- FileNotFoundException(/storage/emulated/0/DCIM/Camera/xx.jpg: open failed: EACCES (Permission denied
- 观后感《没事别看哲学书!》
- VB 操作Excel
- Ubuntu16.04安装kinetic版ROS
- 异构平台运维工作文档
- 修改docker自定义网桥后的默认网卡名称
热门文章
- 【项目实战】Spring Cloud Gateway入门介绍 - 网关过滤器工厂
- 作为产品助理的这一年
- 微软针对“极光”0Day漏洞(KB979352)的临时解决办法
- 国外对国产防火墙的评价(排名)
- 数据库课程设计——某煤气公司送气管理系统(附课设报告)
- 腾讯QQ,msn,百度Hi,淘宝的用户链接及网页在线客服代码
- 相声《我的大学生活》台词
- 迅为恩智浦i.MX8MM开发平台虚拟机安装Ubuntu16.04系统
- webmatrix mysql_WebMatrix PHP MySQL
- SQL 开源替代品,诞生了!