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相关推荐

  1. HMM——维特比算法(Viterbi algorithm)

    1. 前言 维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列: 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列. 也就是说给 ...

  2. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(五)分水岭算法(watershed algorithm)

    8.5 分水岭算法(watershed algorithm) 1.基于拓扑理论的数学形态学的分割方法. 2.基本思想:把图像看作测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局 ...

  3. C++ algorithm的sort函数总结

    sort函数 sort对给定区间进行排序,支持各种数据类型,迭代器,结构体,自定义排序规则 stable_sort 对给定区间进行稳定排序,且可保证相等元素的原本相对次序在排序后保持不变 partia ...

  4. SLAM之特征匹配(三)————RANSAC------LO-RANSAC Algorithm

    matlab 编译loransac,lapack mex ranH.c时一直链接错误. 原来mex在编译多个文件时要把所有的C文件都列出来.命令如下: mex loransacH.mex.c ranH ...

  5. C++/C++11中头文件algorithm的使用

    <algorithm>是C++标准程序库中的一个头文件,定义了C++ STL标准中的基础性的算法(均为函数模板).<algorithm>定义了设计用于元素范围的函数集合.任何对 ...

  6. 2018/8/27 A Modified PSO Algorithm with Exponential Decay Weight

    信息: 2017年                            会议 题目: A Modified PSO Algorithm with Exponential Decay Weight 总 ...

  7. count http://www.cplusplus.com/reference/algorithm/count/

    // count algorithm example#include <iostream>#include <algorithm>#include <vector> ...

  8. 子图同构问题与Ullmann Algorithm 算法(一)

    目录索引 目录索引 写在前面的话 子图同构定义 子图同构的映射关系 Reference 写在后面的话 写在前面的话 谨以此片献给 my best love, grandpa. 时光匆匆流逝,我们永远无 ...

  9. R语言基于遗传算法(Genetic Algorithm)进行特征筛选(feature selection)

    R语言基于遗传算法(Genetic Algorithm)进行特征筛选(feature selection) 特征选择的目的 1.简化模型,使模型更易于理解:去除不相关的特征会降低学习任务的难度.并且可 ...

最新文章

  1. 数学推导+纯Python实现机器学习算法:GBDT
  2. 综述:神经网络中 Normalization 的发展历程
  3. 关于make *.img时没有权限的问题
  4. JQuery 获取节点
  5. python3.8新特性 逻辑表达式_Python3.8正式发布!新特性解析在这里
  6. 【NLP】NLP实战篇之tensorflow2.0快速入门
  7. Linux 系统线程数量上限是多少?
  8. PHP在线小说txt生成器源码
  9. les物流执行系统_【精益运营】细化运营 精益求精 将“精准物流”落到实处...
  10. PHP反序列化字符串溢出
  11. 重磅 I IT4IT 2.1中文版正式发布特邀专家彭斐推荐
  12. python缺失数据处理_python 缺失值处理的方法(Imputation)
  13. 公布C#写的网游外挂源代码
  14. 在centos上搭建饥荒服务器
  15. FileNotFoundException(/storage/emulated/0/DCIM/Camera/xx.jpg: open failed: EACCES (Permission denied
  16. 观后感《没事别看哲学书!》
  17. VB 操作Excel
  18. Ubuntu16.04安装kinetic版ROS
  19. 异构平台运维工作文档
  20. 修改docker自定义网桥后的默认网卡名称

热门文章

  1. 【项目实战】Spring Cloud Gateway入门介绍 - 网关过滤器工厂
  2. 作为产品助理的这一年
  3. 微软针对“极光”0Day漏洞(KB979352)的临时解决办法
  4. 国外对国产防火墙的评价(排名)
  5. 数据库课程设计——某煤气公司送气管理系统(附课设报告)
  6. 腾讯QQ,msn,百度Hi,淘宝的用户链接及网页在线客服代码
  7. 相声《我的大学生活》台词
  8. 迅为恩智浦i.MX8MM开发平台虚拟机安装Ubuntu16.04系统
  9. webmatrix mysql_WebMatrix PHP MySQL
  10. SQL 开源替代品,诞生了!