粒子群算法实验报告Word文件下载.docx
《粒子群算法实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《粒子群算法实验报告Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
2、速度的限制范围对结果很重要,不能过大亦不能过小,这需要根据实际情况进行确定。
3、迭代的代数过多反而会使结果变差。
附:
主程序
//MainFrm.cpp:
implementationoftheCMainFrameclass
//
#include"
stdafx.h"
粒子群算法.h"
math.h"
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()
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"
);
//failtocreate
}
m_wndStatusBar.Create(this)||
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
Failedtocreatestatusbar\n"
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;
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnTRUE;
//CMainFramediagnostics
voidCMainFrame:
AssertValid()const
CFrameWnd:
AssertValid();
Dump(CDumpContext&
dc)const
Dump(dc);
#endif//_DEBUG
//CMainFramemessagehandlers
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;
Vx[i]=a1;
Vy[i]=a2;
//设定速度介于(0,1)之间
Lx[i]=x[i];
Ly[i]=y[i];
//求G
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++)
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];
Vy[i]=(0.9+0.05*t)*Vy[i]+2.05*r2*(Gy-y[i]);
if(Vy[i]>
20)
Vy[i]=10;
elseif(Vy[i]<
-20)
Vy[i]=Ly[i]+Vy[i];
//计算该步的L和G
for(i=0;
Lx[i]=Vx[i];
Ly[i]=Vy[i];
if(Gx*Gx+2*Gx*Gy+3*Gy*Gy+4*Gy+5*Gx+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);