简单二维平面的微粒群算法实现效果如下图所示,上升到多维空间的核心思想类似。

准备工作
新建一个MFC单文档应用程序,具体步骤如下图所示:


新建一个类,如下图所示:

我们用微粒群来求解最优值问题,求解的是一个函数,比如y=x^2。
x给几个初始值,代表初始的鸟群(比如10只鸟),
每只鸟位置是随机的,x=0的位置是最优位置。
通过一定的迭代,把最优位置找到。

首先定义一些需要的变量,以及后面需要用到的成员函数,如下图所示:

1、添加所要求解函数的成员函数,比如这里以f(x) = x0² + x1²为例,如下图所示。

代码如下:

float CWeiLiQun::f(float x[])
{return (x[0])*(x[0]) + (x[1])*(x[1]);//这里以函数f(x) = x0² + x1²为例
}

2、添加运动的成员函数,如下图所示。

3、添加画鸟群的成员函数,如下图所示。


最终变量以及成员函数如下:

// WeiLiQun.h: interface for the CWeiLiQun class.
//
//#if !defined(AFX_WEILIQUN_H__C52936AD_87DC_4442_A966_93B5BB20BCC8__INCLUDED_)
#define AFX_WEILIQUN_H__C52936AD_87DC_4442_A966_93B5BB20BCC8__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#define N 10 //定义N只鸟(这里取10)
typedef struct
{float x[2];//微粒位置float v[2];//微粒速度float p[2];//曾经经历过的最好位置
}SWeiLi;//用结构体表示微粒class CWeiLiQun
{public:void Draw(CDC *pDC);void Move();float f(float x[]);CWeiLiQun();virtual ~CWeiLiQun();SWeiLi m_wl[N];//定义微粒数组float m_pg[2];//全局的最优(不是一个微粒,而是一个位置)float c1,c2;//c1是调节微粒飞向自身最好位置的步长,c2是调节微粒飞向全局最好位置的步长。float r1,r2;//r1,r2~u(0,1)CPoint m_YD;//原点float m_kx,m_ky;//比例尺int m_times;//迭代次数
};#endif // !defined(AFX_WEILIQUN_H__C52936AD_87DC_4442_A966_93B5BB20BCC8__INCLUDED_)

紧接着初始化,代码如下:

CWeiLiQun::CWeiLiQun()
{int i,j;for( i = 0; i < N; i++){for (j = 0; j < 2; j++){m_wl[i].x[j] = rand()%20 -10;//N只鸟的初始位置,-10到10之间的范围m_wl[i].v[j] = rand()%6 -3;  //N只鸟的初始速度,-3到3之间的范围m_wl[i].p[j] = m_wl[i].x[j]; //N只鸟当前的最好位置}}m_pg[0] = m_wl[0].p[0];m_pg[1] = m_wl[0].p[1];//全局的最好位置for( i = 1; i < N; i++){if(f(m_wl[i].p) < f(m_pg)){m_pg[0] = m_wl[i].p[0];m_pg[1] = m_wl[i].p[1];}}c1 = 1.2;c2 = 1.2;r1 = 0.6;r2 = 0.6;//按照经验给定的初始值m_YD.x = 400;m_YD.y = 250;//原点初始值位置m_kx = 10;m_ky = -10;//比例尺放大10倍m_times = 0;
}

最关键的运动代码如下:

void CWeiLiQun::Move()
{int i,j;int vMax = 10;for(i = 0; i < N; i++){for (j = 0; j < 2; j++){m_wl[i].v[j] += c1*r1*(m_wl[i].p[j] - m_wl[i].x[j]) + c2*r2*(m_pg[j] - m_wl[i].x[j]);//给定的公式if( m_wl[i].v[j] > vMax )m_wl[i].v[j] = vMax;if( m_wl[i].v[j] < -vMax)m_wl[i].v[j] = -vMax;//如果不写这个限制条件,若X范围很大,则粒子群震荡得非常厉害m_wl[i].x[j] += m_wl[i].v[j];//给定的公式if(f(m_wl[i].x) < f(m_wl[i].p))//当前位置是否比曾经经历过的最优位置要好{m_wl[i].p[0] = m_wl[i].x[0];m_wl[i].p[1] = m_wl[i].x[1];}         }}for( i = 0; i < N; i++){if(f(m_wl[i].p) < f(m_pg))//和全局最优位置再做比较{m_pg[0] = m_wl[i].p[0];m_pg[1] = m_wl[i].p[1];}}m_times++;//迭代次数
}

再将鸟群画出来,代码如下:

void CWeiLiQun::Draw(CDC *pDC)
{int i,j;int x ,y,r;CString str1,str2;r = 20;//坐标原点半径x = m_YD.x;y = m_YD.y;pDC->Ellipse(x-r,y-r,x+r,y+r);for(i = 0; i < N; i++){x = m_YD.x + m_wl[i].x[0] * m_kx;y = m_YD.y + m_wl[i].x[1] * m_ky;r = 10;pDC->Ellipse(x-r,y-r,x+r,y+r);}str1.Format("迭代次数:%d",m_times);str2.Format("全局最优值位置:(%.2f,%.2f)",m_pg[0],m_pg[1]);pDC->TextOut(600,50,str1);pDC->TextOut(600,100,str2);for(i = 0; i < N; i++){str1.Format("第%d只鸟的当前位置:(%.2f,%.2f);曾经最优值位置:(%.2f,%.2f)",i+1,m_wl[i].x[0],m_wl[i].x[1],m_wl[i].p[0],m_wl[i].p[1]);pDC->TextOut(600,150+50*i,str1);}
}

新建一个菜单,如下图所示:



再添加一个“连续动画”,如下图所示:


添加窗口消息响应句柄,如下图所示:

在CWeiLiQunSuanFaView里引入


代码如下:

void CWeiLiQunSuanFaView::OnMNext()
{m_WeiLiQun.Move();Invalidate(TRUE);
}void CWeiLiQunSuanFaView::OnMDongHua()
{SetTimer(1,100,NULL);
}void CWeiLiQunSuanFaView::OnTimer(UINT nIDEvent)
{m_WeiLiQun.Move();Invalidate(TRUE);CView::OnTimer(nIDEvent);
}


代码如下:

void CWeiLiQunSuanFaView::OnDraw(CDC* pDC)
{CWeiLiQunSuanFaDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herem_WeiLiQun.Draw(pDC);
}

实现效果图:

上述案例只是实现了简单的二维平面的微粒群算法,三维等多维空间的核心思想类似,可自行尝试。

微粒群算法(二、案例实现)相关推荐

  1. 《MATLAB智能算法30个案例》:第10章 基于粒子群算法的多目标搜索算法

    <MATLAB智能算法30个案例>:第10章 基于粒子群算法的多目标搜索算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析& ...

  2. 【CI】CN.一种多尺度协同变异的微粒群优化算法

    [论文标题]一种多尺度协同变异的微粒群优化算法 (2010) [论文作者]陶新民,刘福荣, 刘  玉 , 童智靖 [论文链接]Paper(14-pages // Single column) [摘要] ...

  3. vrp车辆路径问题 php,蚁群算法在车辆路径问题(VRP)中的应用.ppt

    蚁群算法在车辆路径问题(VRP)中的应用 ◆割平面法(Cutting Planes Approach)[6] 割平面法求解VRP问题(A)的基本思想是,在求解相应的不含整数约束的VRP问题(B)上,增 ...

  4. tsp java_蚁群算法java实现以及TSP问题蚁群算法求解

    1. 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为,从而为求解复杂问题 ...

  5. 粒子群算法的寻优算法-非线性函数极值寻优

    粒子群算法的寻优算法-非线性函数极值寻优 1.算法概述 粒子群优化算法(Particle Swarm optimization,PSO)又翻译为粒子群算法.微粒群算法.或微粒群优化算法.是通过模拟鸟群 ...

  6. 群体智能算法之蚁群算法初探(一)

    一.背景 20世纪90年代,意大利学者M.Dorigo,V.Maniezzo,A.Colorni等从生物进化的机制中受到启发,通过穆尼自然界蚂蚁搜索路径的行为,提出来一种新型的模拟进化算法--蚁群算法 ...

  7. 蚁群算法用于航路规划的matlab简单实现

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.蚁群算法 二.背景 三.算法原理 四.算法步骤 五.程序实现 主函数 以下为用到的定义的函数 1.伪随机规则 2. ...

  8. 蚁群算法java实现_蚁群算法java实现以及TSP问题蚁群算法求解

    1. 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为,从而为求解复杂问题 ...

  9. 8.粒子群算法(理论部分)

    本文主要介绍基础粒子群算法的主要理论,并简单介绍自适应权重分配与压缩因子的用法(即速度更新公式的三个系数改进). 实际上粒子群算法经历了数十年发展,衍生出的改进算法多种多样,这里就不再过多介绍.下面开 ...

  10. 蚁群算法(Ant Colony Optimization)

    蚁群算法(Ant Colony Optimization) 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Age ...

最新文章

  1. javascript和jq的事件委托
  2. python安装步骤图解-Python安装-小白图文教程(精)
  3. MAT之PSO:利用PSO算法优化二元函数,寻找最优个体适应度
  4. android d-bus,android EventBus的使用
  5. python文件解除占用_如何使用Python解锁锁定的文件和文件夹(mac)
  6. 玩转 SpringBoot 2 快速整合 Filter
  7. Tensorflow:模型调参
  8. 机器学习算法——神经网络4(RBF神经网络)
  9. 开发一个 app 有多难?
  10. Qt开发经验小技巧176-180
  11. 2021朝阳启声学校高考成绩查询,梦在前方 路在脚下 ———潮阳启声学校2019届高考80天誓师大会...
  12. 愿天下有情人都是失散多年的兄妹 (25 分)
  13. 关于wifi模块连接路由器远程控制的一些问题
  14. python云计算1_python云计算1
  15. 鬼谷八荒仙姿男捏脸数据
  16. 有了它,药物研发将大大提速?
  17. python二元函数如何编写,Nelder_Mead算法的简介和用作求解二维函数最小值的Python实现...
  18. java单书号表示什么_单书号和双书号有何区别?
  19. 北斗导航开始提供全球服务;个人所得税 App 已上线
  20. Terracotta for Spring

热门文章

  1. Linux信号量以及互斥体
  2. mysql8忘记密码后重置密码
  3. lammps数据后处理:Python Ovito 统计键长分布
  4. Java毕业设计-企业员工考勤打卡管理系统
  5. 信号与系统 Matlab 实验 画连续离散系统零极点图 分析连续、离散系统的频率特性 幅频特性曲线 相频特性曲线
  6. LDA算法原理及LDA与PCA的比较
  7. 十二款硬盘数据恢复软件,百分之九十五的人没听过!
  8. java中的杨辉三角形_Java编写杨辉三角
  9. win10 安装dig工具与使用dig命令
  10. ffmpeg php 使用教程_php的ffmpeg - CSDN博客