粒子群算法实验报告.docx
《粒子群算法实验报告.docx》由会员分享,可在线阅读,更多相关《粒子群算法实验报告.docx(8页珍藏版)》请在冰豆网上搜索。
粒子群算法实验报告
粒子群理论
实验报告
一、实验目的及要求
1、目的
通过编写、调试程序采用粒子群理论的方法,计算最小值问题的最优解。
2、主要工作
(1、编写、调试程序
(2、利用编写的程序进行仿真分析,找出规律
二、实验结果与数据处理
不好意思,教员,我的程序实在是调不了,问了好几个人,调试时也按照您说的在打印环节设置了断点,但执行过后,跟踪的变量值都有,就是打印不出来,请教员帮忙看下。
由于程序打印存在问题,故实验数据只能靠自己一步一步调试观察得来,故不能一一列出。
这部分将在下面的经验总结中予以体现。
三、经验总结
通过此次编写粒子群算法的程序,我对粒子群算法有了进一步的认识和熟悉,感觉这个方面还存在很多不足。
主要有:
1、初值的选取随意性较大,可以事先手算一下,估计出一个较为理想的初值。
这样可以减少一部分计算量,而且有利于下步的加速度选取有一定帮助。
2、速度的限制范围对结果很重要,不能过大亦不能过小,这需要根据实际情况进行确定。
3、迭代的代数过多反而会使结果变差。
附:
主程序
//MainFrm.cpp:
implementationoftheCMainFrameclass
//
#include"stdafx.h"
#include"粒子群算法.h"
#include"math.h"
#include"MainFrm.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(AFX_ID_PREVIEW_CLOSE,Oncalucate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
staticUINTindicators[]=
{
ID_SEPARATOR,//statuslineindicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
//CMainFrameconstruction/destruction
CMainFrame:
:
CMainFrame()
{
//TODO:
addmemberinitializationcodehere
}
CMainFrame:
:
~CMainFrame()
{
}
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
if(!
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate
}
if(!
m_wndStatusBar.Create(this)||
!
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failedtocreatestatusbar\n");
return-1;//failtocreate
}
//TODO:
Deletethesethreelinesifyoudon'twantthetoolbarto
//bedockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return0;
}
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreateWindow(cs))
returnFALSE;
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnTRUE;
}
/////////////////////////////////////////////////////////////////////////////
//CMainFramediagnostics
#ifdef_DEBUG
voidCMainFrame:
:
AssertValid()const
{
CFrameWnd:
:
AssertValid();
}
voidCMainFrame:
:
Dump(CDumpContext&dc)const
{
CFrameWnd:
:
Dump(dc);
}
#endif//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//CMainFramemessagehandlers
voidCMainFrame:
:
Oncalucate()//粒子群算法主程序入口
{
FILE*m_fp;//打开和关闭结果文件所用的指针
doubleGx,Gy;//最佳位置
doublex[20],y[20];//粒子的位置(x[0],y[0]表示第一个粒子的位置)
doubleLx[20],Ly[20];//当前步的所有粒子发现的最优位置,暨粒子本身的位置(L[0]为第一个粒子计算得到的函数值,计算出所有的函数值后选出最小的付给G)
doubleVx[20],Vy[20];//粒子的速度
inti,t;//循环用变量i为第i个粒子,t为迭代计算的次数
doubler1,r2;//为0,1之间的随机数,计算速度公式涉及的系数
doublehanshuzhi;//最小函数值
Gx=Gy=10000000;//给G赋初值,便于以后的比较
//创建结果文件
m_fp=fopen("result.txt","w");
//fprintf(m_fp,"迭代次数(t)位置(x)位置(y)最优函数值(G)\n");
//产生初始位置和速度更新L和G
for(i=0;i<20;i++)//粒子数为20
{
doublea1,a2;
//产生0-1均匀分布的随机数
a1=rand()/double(RAND_MAX);
a2=rand()/double(RAND_MAX);
x[i]=a1;y[i]=a2;
a1=rand()/double(RAND_MAX);
a2=rand()/double(RAND_MAX);
Vx[i]=a1;Vy[i]=a2;//设定速度介于(0,1)之间
Lx[i]=x[i];Ly[i]=y[i];
}
//求G
for(i=0;i<20;i++)
{
if(Gx*Gx+2*Gx*Gy+3*Gy*Gy+4*Gy+5*Gx+6>=Lx[i]*Lx[i]+2*Lx[i]*Ly[i]+3*Ly[i]*Ly[i]+4*Ly[i]+5*Lx[i]+6)//求最小值
{
Gx=Lx[i];
Gy=Ly[i];
}
}
//计算以后每一步粒子的速度,t为迭代次数,总共迭代10次
for(t=1;t<=10;t++)
{
for(i=0;i<20;i++)//分别计算20个粒子的速度及位置
{
r1=rand()/double(RAND_MAX);
r2=rand()/double(RAND_MAX);
Vx[i]=(0.9+0.05*t)*Vx[i]+2.05*r2*(Gx-x[i]);//P77这里按照要求ws为0.9,wt为0.5,tmax=10,c1=c2=2.05,简化后的该式
//速度控制
if(Vx[i]>10)
{
Vx[i]=10;
}
elseif(Vx[i]<-1)
{
Vx[i]=-1;
}
Vx[i]=Lx[i]+Vx[i];
r1=rand()/double(RAND_MAX);
r2=rand()/double(RAND_MAX);
Vy[i]=(0.9+0.05*t)*Vy[i]+2.05*r2*(Gy-y[i]);//P77这里按照要求ws为0.9,wt为0.5,tmax=10,c1=c2=2.05,简化后的该式
//速度控制
if(Vy[i]>20)
{
Vy[i]=10;
}
elseif(Vy[i]<-20)
{
Vy[i]=10;
}
Vy[i]=Ly[i]+Vy[i];
}
//计算该步的L和G
for(i=0;i<20;i++)
{
Lx[i]=Vx[i];Ly[i]=Vy[i];
if(Gx*Gx+2*Gx*Gy+3*Gy*Gy+4*Gy+5*Gx+6>=Lx[i]*Lx[i]+2*Lx[i]*Ly[i]+3*Ly[i]*Ly[i]+4*Ly[i]+5*Lx[i]+6)//求最小值
{
Gx=Lx[i];
Gy=Ly[i];
}
}
hanshuzhi=Gx*Gx+2*Gx*Gy+3*Gy*Gy+4*Gy+5*Gx+6;
fprintf(m_fp,"t=%lfGx=%lfGy=%lf函数值=%lf\n",t,Gx,Gy,hanshuzhi);//t每增加1,打印一次
}
fclose(m_fp);
}