粒子群优化算法/C

#include"stdafx.h"
#include<math.h>
#include<time.h>
#include<iostream>
#include<fstream>
usingnamespacestd;
intc1=2;//加速因子
intc2=2;//加速因子
doublew=1;//惯性权重
doubleWmax=1;//最大惯性权重
doubleWmin=0.6;//最小惯性权重
intKmax=110;//迭代次数
intGdsCnt;//物资总数
intconstDim=10;//粒子维数
intconstPNum=50;//粒子个数
intGBIndex=0;//最优粒子索引
doublea=0.6;//适应度调整因子
doubleb=0.5;//适应度调整因子
intXup[Dim];//粒子位置上界数组
intXdown[Dim]=;//粒子位置下界数组
intValue[Dim];//初始急需度数组
intVmax[Dim];//最大速度数组
classPARTICLE;//申明粒子节点
voidCheck(PARTICLE&,int);//约束函数
voidInput(ifstream&);//输入变量
voidInitial();//初始化相关变量
doubleGetFit(PARTICLE&);//计算适应度
voidCalculateFit();//计算适应度
voidBirdsFly();//粒子飞翔
voidRun(ofstream&,int=2000);//运行函数
classPARTICLE//微粒类
{
public:
intX[Dim];//微粒的坐标数组
intXBest[Dim];//微粒的最好位置数组
intV[Dim];//粒子速度数组
doubleFit;//微粒适合度
doubleFitBest;//微粒最好位置适合度
};PARTICLEParr[PNum];//粒子数组
intmain()//主函数
{
ofstreamoutf("out.txt");
ifstreaminf("data.txt");//关联输入文件
inf>>GdsCnt;//输入物资总数
Input(inf);
Initial();
Run(outf,100);
system("pause");
return0;
}
voidCheck(PARTICLE&p,intcount)//参数:p粒子对象,count物资数量
{
srand((unsigned)time(NULL));
intsum=0;
for(inti=0;i<Dim;i++)
{
if(p.X>Xup)
p.X=Xup;
elseif(p.X<Xdown)
p.X=Xdown;
if(p.V>Vmax)
p.V=Vmax;
elseif(p.V<0)
p.V=0;
sum+=p.X;
}
while(sum>count)
{
p.X[rand()%Dim]--;
sum=0;
for(inti=0;i<Dim;i++)
{
if(p.X>Xup)
p.X=Xup;
elseif(p.X<Xdown)
p.X=Xdown;
if(p.V>Vmax)
p.V=Vmax;
elseif(p.V<0)
p.V=0;
sum+=p.X;
}
}
voidInput(ifstream&inf)//以inf为对象输入数据
{
for(inti=0;i<Dim;i++)
inf>>Xup;
for(inti=0;i<Dim;i++)
inf>>Value;
}
voidInitial()//初始化数据
{
GBIndex=0;
srand((unsigned)time(NULL));//初始化随机函数发生器
for(inti=0;i<Dim;i++)
Vmax=(int)((Xup-Xdown)*0.035);
for(inti=0;i{
for(intj=0;j<Dim;j++)
{
Parr.X[j]=(int)(rand()/(double)RAND_MAX*(Xup[j]-Xdown[j])-Xdown[j]+0.5);
Parr.XBest[j]=Parr.X[j];
Parr.V[j]=(int)(rand()/(double)RAND_MAX*(Vmax[j]-Vmax[j]/2));
}
Parr.Fit=GetFit(Parr);
Parr.FitBest=Parr.Fit;
if(Parr.Fit>Parr[GBIndex].Fit)
GBIndex=i;
}
}
doubleGetFit(PARTICLE&p)//计算对象适应度
{
doublesum=0;
for(inti=0;i<Dim;i++)
for(intj=1;j<=p.X;j++)
sum+=(1-(j-1)*a/(Xup-b))*Value;
returnsum;
}
voidCalculateFit()//计算数组内各粒子的适应度
{
for(inti=0;i{
Parr.Fit=GetFit(Parr);
}
}
voidBirdsFly()//粒子飞行寻找最优解
{
srand((unsigned)time(NULL));
staticintk=10;
w=Wmax-k*(Wmax-Wmin)/Kmax;
k++;
for(inti=0;i{
for(intj=0;j<Dim;j++)
{
Parr.V[j]=(int)(w*Parr.V[j]);
Parr.V[j]+=(int)(c1*rand()/(double)RAND_MAX*(Parr.XBest[j]-Parr.X[j]);
Parr.V[j]+=c2*rand()/(double)RAND_MAX*(Parr[GBIndex].XBest[j]-Parr.X[j]));
}
}
Check(Parr,GdsCnt);
for(intj=0;j<Dim;j++)
{
Parr.X[j]+=Parr.V[j];
Check(Parr,GdsCnt);
}
CalculateFit();
for(inti=0;i{
if(Parr.Fit>=Parr.FitBest)
{
Parr.FitBest=Parr.Fit;
for(intj=0;j<Dim;j++)
Parr.XBest[j]=Parr.X[j];
}
}
GBIndex=0;
for(inti=0;i{
if(Parr.FitBest>Parr[GBIndex].FitBest&&i!=GBIndex)
GBIndex=i;
}
}
voidRun(ofstream&outf,intnum)//令粒子以规定次数num飞行
{
for(inti=0;i<num;i++)
{
BirdsFly();
outf<<(i+1)<<ends<for(intj=0;j<Dim;j++)outf<
outf<<endl;
}
cout<<"Done!"<<endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值