粒子群理论实验报告一、实验目的及要求1、目的通过编写、调试程序采用粒子群理论的方法,计算最小值问题的最优解。2、主要工作(1、编写、调试程序(2、利用编写的程序进行仿真分析,找出规律二、实验结果与数据处理不好意思,教员,我的程序实在是调不了,问了好几个人,调试时也按照您说的在打印环节设置了断点,但执行过后,跟踪的变量值都有,就是打印不出来,请教员帮忙看下。由于程序打印存在问题,故实验数据只能靠自己一步一步调试观察得来,故不能一一列出。这部分将在下面的经验总结中予以体现。三、经验总结通过此次编写粒子群算法的程序,我对粒子群算法有了进一步的认识和熟悉,感觉这个方面还存在很多不足。主要有:1、初值的选取随意性较大,可以事先手算一下,估计出一个较为理想的初值。这样可以减少一部分计算量,而且有利于下步的加速度选取有一定帮助。2、速度的限制范围对结果很重要,不能过大亦不能过小,这需要根据实际情况进行确定。3、迭代的代数过多反而会使结果变差。附:主程序//MainFrm.cpp:implementationoftheCMainFrameclass//#includestdafx.h#include粒子群算法.h#includemath.h#includeMainFrm.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CMainFrameIMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_COMMAND(AFX_ID_PREVIEW_CLOSE,Oncalucate)//}}AFX_MSG_MAPEND_MESSAGE_MAP()staticUINTindicators[]={ID_SEPARATOR,//statuslineindicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,};///////////////////////////////////////////////////////////////////////////////CMainFrameconstruction/destructionCMainFrame::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//bedockablem_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);return0;}BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){if(!CFrameWnd::PreCreateWindow(cs))returnFALSE;//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnTRUE;}///////////////////////////////////////////////////////////////////////////////CMainFramediagnostics#ifdef_DEBUGvoidCMainFrame::AssertValid()const{CFrameWnd::AssertValid();}voidCMainFrame::Dump(CDumpContext&dc)const{CFrameWnd::Dump(dc);}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CMainFramemessagehandlersvoidCMainFrame::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和Gfor(i=0;i20;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];}//求Gfor(i=0;i20;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;i20;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和Gfor(i=0;i20;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);}