粒子群算法C++版.docx
《粒子群算法C++版.docx》由会员分享,可在线阅读,更多相关《粒子群算法C++版.docx(11页珍藏版)》请在冰豆网上搜索。
![粒子群算法C++版.docx](https://file1.bdocx.com/fileroot1/2022-11/20/84debd57-34db-4c76-9e1d-a3015ad7d990/84debd57-34db-4c76-9e1d-a3015ad7d9901.gif)
粒子群算法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];///种群适应度,表示种群中各个个体的适应度
vectorlistV[MAX_SCALE];///每科粒子的初始交换序列
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;ifor(intj=0;jdist[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;ifitness[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;ifitness[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[],vectorv)///
{
intvn=v.size();
for(inti=0;i{
intx=v[i].x,y=v[i].y;
swap(a[x],a[y]);
}
}
vectorminus(inta[],intb[])///
{
intc[MAX_CITY],d[MAX_CITY];
for(inti=0;ifor(inti=0;ivectorv;
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&v,vectora,intvn)
{
for(inti=0;iv.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;
vectorv;
v.clear();
intlvn=w*listV[is].size();
addTo(v,listV[is],lvn);
vectora=minus(Pd[is],oPop[is]);
intan=randomD()*a.size();
addTo(v,a,an);
vectorb=minus(Pgd,oPop[is]);
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]);
}