粒子群算法实验报告.docx

上传人:b****5 文档编号:8206606 上传时间:2023-01-29 格式:DOCX 页数:8 大小:16.85KB
下载 相关 举报
粒子群算法实验报告.docx_第1页
第1页 / 共8页
粒子群算法实验报告.docx_第2页
第2页 / 共8页
粒子群算法实验报告.docx_第3页
第3页 / 共8页
粒子群算法实验报告.docx_第4页
第4页 / 共8页
粒子群算法实验报告.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

粒子群算法实验报告.docx

《粒子群算法实验报告.docx》由会员分享,可在线阅读,更多相关《粒子群算法实验报告.docx(8页珍藏版)》请在冰豆网上搜索。

粒子群算法实验报告.docx

粒子群算法实验报告

 

粒子群理论

实验报告

一、实验目的及要求

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);

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 自我管理与提升

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1