粒子群算法C++版.docx
- 文档编号:3236223
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:11
- 大小:16.31KB
粒子群算法C++版.docx
《粒子群算法C++版.docx》由会员分享,可在线阅读,更多相关《粒子群算法C++版.docx(11页珍藏版)》请在冰豆网上搜索。
粒子群算法C++版
//#pragmawarning(disable:
4786)
//#pragmacomment(linker,"/STACK:
16777216")
//HEAD
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
typedeflonglongLL;
constdoubleMAX_VAL=(double)1e18;
constintMAX_GEN=30;///最大迭代次数
constintMAX_SCALE=3000;///最大种群规模
constintMAX_CITY=20+2;///最大城市数
constdoubleW_VAL=0.729;///
structSO{
intx,y;
SO(){}
SO(intx,inty):
x(x),y(y){}
};
structPoint{
doublex,y;
Point(){}
Point(intx,inty):
x(x),y(y){};
voidread()
{
scanf("%lf%lf",&x,&y);
}
};
inlineintrandomI(intx){returnrand()%x;}
inlinedoublerandomD(){return(double)rand()/RAND_MAX;}
inlinedoublegetDist(Pointa,Pointb)
{
returnsqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
structPSO{
doublew;
intscale;
intcityNum;
intnowGen;///当前代数
intmaxGen;///迭代次数
intbestNum;
intbestGen;///最佳出现代数
doubledist[MAX_CITY][MAX_CITY];
intoPop[MAX_SCALE][MAX_CITY];///粒子群
doublefitness[MAX_SCALE];///种群适应度,表示种群中各个个体的适应度
vector
intPd[MAX_SCALE][MAX_CITY];///一颗粒子历代中出现最好的解,
doublevPd[MAX_SCALE];///解的评价值
intPgd[MAX_CITY];///整个粒子群经历过的的最好的解,每个粒子都能记住自己搜索到的最好解
doublevPgd;///最好的解的评价值
PSO(){}
PSO(ints,intc,intmG,doubleww,doubled[MAX_CITY][MAX_CITY])
{
scale=s;
cityNum=c;
maxGen=mG;
w=ww;
for(inti=0;i for(intj=0;j dist[i][j]=d[i][j]; } voidcopyArray(doublea[],doubleb[],intn) { for(inti=0;i } voidcopyArray(inta[],intb[],intn) { for(inti=0;i } voidinit() { nowGen=0; for(inti=0;i { for(intj=0;j { intx=randomI(cityNum); intr; for(r=0;r { if(x==oPop[i][r])break; } if(r==j) { oPop[i][j]=x; //cout< j++; } } //cout< } for(inti=0;i { //cout< "< intvn=randomI(cityNum)+1; for(intj=0;j { intx=randomI(cityNum); inty=randomI(cityNum); while(x==y)y=randomI(cityNum); SOso(x,y); listV[i].push_back(so); //cout< } //cout< } getFitness(); for(inti=0;i { vPd[i]=fitness[i]; copyArray(Pd[i],oPop[i],cityNum); } bestNum=0; vPgd=fitness[0]; bestGen=0; for(inti=0;i { vPgd=fitness[i]; bestNum=i; } copyArray(Pgd,oPop[bestNum],cityNum); } doublegetVal(intx) { doubleret=0; for(inti=0;i { intxx=oPop[x][i%cityNum]; intyy=oPop[x][(i+1)%cityNum]; ret+=dist[xx][yy]; } returnret; } voidgetFitness() { for(inti=0;i fitness[i]=getVal(i); } voidUpdateVal() { intj=0; doublevj=fitness[0]; for(inti=0;i { if(vPd[i]>fitness[i]) { vPd[i]=fitness[i]; copyArray(Pd[i],oPop[i],cityNum);///? ? ? } if(vj>fitness[i]) { vj=fitness[i]; j=i; } } if(vj { bestGen=nowGen;/// bestNum=j;/// vPgd=vj; copyArray(Pgd,oPop[j],cityNum); } } voidchangeTo(inta[],vector { intvn=v.size(); for(inti=0;i { intx=v[i].x,y=v[i].y; swap(a[x],a[y]); } } vector { intc[MAX_CITY],d[MAX_CITY]; for(inti=0;i for(inti=0;i vector SOs; for(inti=0;i { if(d[i]! =a[i]) { s.x=i,s.y=c[a[i]]; swap(d[s.x],d[s.y]); v.push_back(s); } } returnv; } voidaddTo(vector { for(inti=0;i v.push_back(a[i]); } ///Vii=wVi+ra(Pid-Xid)+rb(Pgd-Xid) voidevolution() { for(intig=0;ig { nowGen=ig+1;///nowGen for(intis=0;is { if(is==bestNum)continue; vector v.clear(); intlvn=w*listV[is].size(); addTo(v,listV[is],lvn); vector intan=randomD()*a.size(); addTo(v,a,an); vector intbn=randomD()*b.size(); addTo(v,b,bn); listV[is]=v; changeTo(oPop[is],listV[is]); //cout< } getFitness(); UpdateVal(); } } voidsolve() { init(); evolution(); printf("answer%lf: \n",vPgd); printf("solution\n"); for(inti=0;i { if(i)printf(""); printf("%d\n",Pgd[i]); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 粒子 算法 C+