用粒子群算法求解线性约束整数规划的Matlab程序

用粒子群算法求解线性约束整数规划的Matlab程序,第1张

粒子群的约束问题涉及的比较少。这儿摘抄下百度百科的内容:

PSO算法推广到约束优化问题,分为两类:(http://baike.baidu.com/view/1531379.htm)

(1)罚函数法。罚函数的目的是将约束优化问题转化成无约束优化问题。

(2)将粒子群的搜索范围都限制在条件约束簇内,即在可行解范围内寻优。

第一种方法有相关论文,看了下,感觉比较适合等式约束情况,比较类似于在适应度函数中加入拉格朗日乘子的做法,如果论文下不到的话,请留言。

第二种做法倒是用过。大概讲下。

针对你的问题,初始化两维向量,但是由于存在不等式约束,所以考虑先初始化向量的第一维,然后动态算出第二维的范围,随机出第二维变量。然后就是计算适应度值,全局、局部最优。

更新过程一样,先更新第一维变量,然后动态计算第二维的范围,更新第二维,如果更新后超过了边界,则取边界值(或者也可以再次重新更新,直到满足条件,直觉上感觉第一种还好点,第二种可能会出现无法更新的情况),更新完毕后,计算适应度,更新全局、局部最优解。

补充两个链接吧

http://download.csdn.net/detail/yinjian_2004/1567342

论文:基于改进粒子群优化算法的约束多目标优化

从上面的例子我们可以看到应用PSO解决优化问题的过程中有两个重要的步骤: 问题解的编码和适应度函数 不需要像遗传算法一样是二进制编码(或者采用针对实数的遗传 *** 作.例如对于问题 f(x) = x1^2 + x2^2+x3^2 求解, 粒子可以直接编码为 (x1, x2, x3), 而适应度函数就是f(x). 接着我们就可以利用前面的过程去寻优.这个寻优过程是一个叠代过程, 中止条件一般为设置为达到最大循环数或者最小错误

PSO中并没有许多需要调节的参数,下面列出了这些参数以及经验设置

粒子数: 一般取 20 – 40. 其实对于大部分的问题10个粒子已经足够可以取得好的结果, 不过对于比较难的问题或者特定类别的问题, 粒子数可以取到100 或 200

粒子的长度: 这是由优化问题决定, 就是问题解的长度

粒子的范围: 由优化问题决定,每一维可以设定不同的范围

Vmax: 最大速度,决定粒子在一个循环中最大的移动距离,通常设定为粒子的范围宽度,例如上面的例子里,粒子 (x1, x2, x3) x1 属于 [-10, 10], 那么 Vmax 的大小就是 20

学习因子: c1 和 c2 通常等于 2. 不过在文献中也有其他的取值. 但是一般 c1 等于 c2 并且范围在0和4之间

中止条件: 最大循环数以及最小错误要求. 例如, 在上面的神经网络训练例子中, 最小错误可以设定为1个错误分类, 最大循环设定为2000, 这个中止条件由具体的问题确定.

全局PSO和局部PSO: 我们介绍了两种版本的粒子群优化算法: 全局版和局部版. 前者速度快不过有时会陷入局部最优. 后者收敛速度慢一点不过很难陷入局部最优. 在实际应用中, 可以先用全局PSO找到大致的结果,再用局部PSO进行搜索. 代码来自2008年数学建模东北赛区B题, #includestdaf(x).h#include<math.h>#include<time.h>#include<iostream>#include<fstream>usingnamespacestdintc1=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=0for(inti=0i<Dimi++){if(p.X>Xup)p.X=Xupelseif(p.X<Xdown)p.X=Xdownif(p.V>Vmax)p.V=Vmaxelseif(p.V<0)p.V=0sum+=p.X}while(sum>count){p.X[rand()%Dim]--sum=0for(inti=0i<Dimi++){if(p.X>Xup)p.X=Xupelseif(p.X<Xdown)p.X=Xdownif(p.V>Vmax)p.V=Vmaxelseif(p.V<0)p.V=0sum+=p.X}}voidInput(ifstream&inf)//以inf为对象输入数据{for(inti=0i<Dimi++)inf>>Xupfor(inti=0i<Dimi++)inf>>Value}voidInitial()//初始化数据{GBIndex=0srand((unsigned)time(NULL))//初始化随机函数发生器for(inti=0i<Dimi++)Vmax=(int)((Xup-Xdown)*0.035)for(inti=0i{for(intj=0j<Dimj++){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.Fitif(Parr.Fit>Parr[GBIndex].Fit)GBIndex=i}}doubleGetFit(PARTICLE&p)//计算对象适应度{doublesum=0for(inti=0i<Dimi++)for(intj=1j<=p.Xj++)sum+=(1-(j-1)*a/(Xup-b))*Valuereturnsum}voidCalculateFit()//计算数组内各粒子的适应度{for(inti=0i{Parr.Fit=GetFit(Parr)}}voidBirdsFly()//粒子飞行寻找最优解{srand((unsigned)time(NULL))staticintk=10w=Wmax-k*(Wmax-Wmin)/Kmaxk++for(inti=0i{for(intj=0j<Dimj++){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=0j<Dimj++){Parr.X[j]+=Parr.V[j]Check(Parr,GdsCnt)}CalculateFit()for(inti=0i{if(Parr.Fit>=Parr.FitBest){Parr.FitBest=Parr.Fitfor(intj=0j<Dimj++)Parr.XBest[j]=Parr.X[j]}}GBIndex=0for(inti=0i{if(Parr.FitBest>Parr[GBIndex].FitBest&&i!=GBIndex)GBIndex=i}}voidRun(ofstream&outf,intnum)//令粒子以规定次数num飞行{for(inti=0i<numi++){BirdsFly()outf<<(i+1)<<ends<for(intj=0j<Dimj++)outf<outf<<endl}cout<<Done!<<endl}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11961960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存