微粒群算法(二、案例实现)
简单二维平面的微粒群算法实现效果如下图所示,上升到多维空间的核心思想类似。
准备工作
新建一个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);
}
实现效果图:
上述案例只是实现了简单的二维平面的微粒群算法,三维等多维空间的核心思想类似,可自行尝试。
微粒群算法(二、案例实现)相关推荐
- 《MATLAB智能算法30个案例》:第10章 基于粒子群算法的多目标搜索算法
<MATLAB智能算法30个案例>:第10章 基于粒子群算法的多目标搜索算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析& ...
- 【CI】CN.一种多尺度协同变异的微粒群优化算法
[论文标题]一种多尺度协同变异的微粒群优化算法 (2010) [论文作者]陶新民,刘福荣, 刘 玉 , 童智靖 [论文链接]Paper(14-pages // Single column) [摘要] ...
- vrp车辆路径问题 php,蚁群算法在车辆路径问题(VRP)中的应用.ppt
蚁群算法在车辆路径问题(VRP)中的应用 ◆割平面法(Cutting Planes Approach)[6] 割平面法求解VRP问题(A)的基本思想是,在求解相应的不含整数约束的VRP问题(B)上,增 ...
- tsp java_蚁群算法java实现以及TSP问题蚁群算法求解
1. 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为,从而为求解复杂问题 ...
- 粒子群算法的寻优算法-非线性函数极值寻优
粒子群算法的寻优算法-非线性函数极值寻优 1.算法概述 粒子群优化算法(Particle Swarm optimization,PSO)又翻译为粒子群算法.微粒群算法.或微粒群优化算法.是通过模拟鸟群 ...
- 群体智能算法之蚁群算法初探(一)
一.背景 20世纪90年代,意大利学者M.Dorigo,V.Maniezzo,A.Colorni等从生物进化的机制中受到启发,通过穆尼自然界蚂蚁搜索路径的行为,提出来一种新型的模拟进化算法--蚁群算法 ...
- 蚁群算法用于航路规划的matlab简单实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.蚁群算法 二.背景 三.算法原理 四.算法步骤 五.程序实现 主函数 以下为用到的定义的函数 1.伪随机规则 2. ...
- 蚁群算法java实现_蚁群算法java实现以及TSP问题蚁群算法求解
1. 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为,从而为求解复杂问题 ...
- 8.粒子群算法(理论部分)
本文主要介绍基础粒子群算法的主要理论,并简单介绍自适应权重分配与压缩因子的用法(即速度更新公式的三个系数改进). 实际上粒子群算法经历了数十年发展,衍生出的改进算法多种多样,这里就不再过多介绍.下面开 ...
- 蚁群算法(Ant Colony Optimization)
蚁群算法(Ant Colony Optimization) 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Age ...
最新文章
- javascript和jq的事件委托
- python安装步骤图解-Python安装-小白图文教程(精)
- MAT之PSO:利用PSO算法优化二元函数,寻找最优个体适应度
- android d-bus,android EventBus的使用
- python文件解除占用_如何使用Python解锁锁定的文件和文件夹(mac)
- 玩转 SpringBoot 2 快速整合 Filter
- Tensorflow:模型调参
- 机器学习算法——神经网络4(RBF神经网络)
- 开发一个 app 有多难?
- Qt开发经验小技巧176-180
- 2021朝阳启声学校高考成绩查询,梦在前方 路在脚下 ———潮阳启声学校2019届高考80天誓师大会...
- 愿天下有情人都是失散多年的兄妹 (25 分)
- 关于wifi模块连接路由器远程控制的一些问题
- python云计算1_python云计算1
- 鬼谷八荒仙姿男捏脸数据
- 有了它,药物研发将大大提速?
- python二元函数如何编写,Nelder_Mead算法的简介和用作求解二维函数最小值的Python实现...
- java单书号表示什么_单书号和双书号有何区别?
- 北斗导航开始提供全球服务;个人所得税 App 已上线
- Terracotta for Spring