粒子群算法C++代码一、问题重述某一灾区有N名受灾群众,现有一批救灾物资要发放给这些受灾者。物资共有M种,每种物资的数量有限;各受灾者的灾情不同,对每种物资的急需程度和需求量不同。你作为一名物资分配者,请制定分配原则并给出合理的分配方法。试给出一个符合题意的数值算例。二、模型假设1、对于每一种物资,它的数量一定,且在分配过程中是以份为单位的;2、灾民对获得一急需度可用某区间内的整型值表示;3、灾民对得到一份某一种物资的满意度等价于获得该份该种物资的急需度。4、灾民对某一物资的需求量用一整数来表示;5、对于每种物资的分配是相对独立的,即只要每种物资的分配达到最优,则总体便最优。三、符号定义
论文
政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载
中使用的符号对应在程序中用的符号表示意义NDim待分配人数n[ij]X[ij]第i个灾民实际分得的第j种物资的量m[ij]Xup[ij]第i个灾民对j种物资的需求量X[ij]Value第i个灾民对j种物资的急需度fj(n[ij])GetFit[j]所有灾民对所获得的第j种物资的满意度函数f(n[ij])所有灾民对所获得的所有物资的满意度函数N[j]GdsCnt第j种物资的数量X表示第i个人得到n[ij]份第j种物资的满意度M物资种数TPNum在粒子群算法中粒子的个数Pbestpso算法中,粒子的个体极值Gbestpso算法中,粒子群的全局极值X[ij][t]第i个人分到第t份第j种物资的的满意度#include"stdafx.h#include
#include#include#includeusingnamespacestd;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]={0};//粒子位置下界数组intValue[Dim];〃初始急需度数组intVmax[Dim];//最大速度数组classPARTICLE;//申明粒子节点voidCheck(PARTICLE&,int);〃约束函数voidInput(ifstream&);//输入变量voidInitial();//初始化相关变量doubleGetFit(PARTICLE&);〃计算适应度voidCalculateFit();//计算适应度voidBirdsFly();//粒子飞翔voidRun(ofstream&,int=2000);//运行函数〃微粒类classPARTICLEpublic:intX[Dim];//微粒的坐标数组intXBest[Dim];//微粒的最好位置数组intV[Dim];//粒子速度数组doubleFit;〃微粒适合度doubleFitBest;//微粒最好位置适合度};PARTICLEParr[PNum];//粒子数组intmain()//主函数//关联输入文件inf>>GdsCnt;〃输入物资总数ofstreamoutf("out.txt");ifstreaminf("data.txt");Input(inf);Initial();Run(outf,100);system("pause");return0;voidCheck(PARTICLE&p,intcount)//参数:p粒子对象,count物资数量srand((unsigned)time(NULL));intsum=0;for(inti=0;iXup[i])p.X[i]=Xup[i];elseif(p.X[i]Vmax[i])p.V[i]=Vmax[i];elseif(p.V[i]<0)p.V[i]=0;sum+=p.X[i];while(sum>count)p.X[rand()%Dim]--;sum=0;for(inti=0;iXup[i])p.X[i]=Xup[i];elseif(p.X[i]Vmax[i])p.V[i]=Vmax[i];elseif(p.V[i]<0)p.V[i]=0;sum+=p.X[i];voidInput(ifstream&inf)//以inf为对象输入数据for(inti=0;i>Xup[i];for(inti=0;i>Value[i];〃初始化数据GBIndex=0;srand((unsigned)time(NULL));//初始化随机函数发生器for(inti=0;iParr[GBIndex].Fit)GBIndex=i;