粒子群优化算法,每次运行结果不一样。

yicheng751 2016-06-12 06:46:23
用粒子群算法优化一个问题,继承了https://github.com/AlieYu/Particle-Swarm-Optimization-PSO-_C----
的PSO类,按算法的原理,应该每次运行优化出的结果是一样的,但是随着运行次数的增多,偏差增大。

触发函数
void MainWindow::calButtonClicked()
{
prodData.listVectorData=ui->prodData->getListVectorData();
injData.listVectorData=ui->injData->getListVectorData();
QVectorConvertEigen q1;
ArrayXd tnP0=q1.QVectorToVectorXd(prodData.listVectorData.at(0)).array();
ArrayXd prodDataArray=q1.QVectorToVectorXd(prodData.listVectorData.at(1)).array();
ArrayXXd injDataArray=q1.ListVectorToMatrix(injData.listVectorData).array();
CmpModel cmp;
cmp.setData(tnP0,injDataArray,prodDataArray);
cmp.setFitParams(600,100);
cmp.Run(100);
cmp.printResult();
CmpModel cmp1;
cmp1.setData(tnP0,injDataArray,prodDataArray);
cmp1.setFitParams(600,50);
cmp1.Run(50);
cmp1.printResult();
}

继承PSO类 修改的适应度函数
double CmpModel::GetFit(PARTICLE &particle)
{
int injNums=injDataMatrix.cols();
MatrixXd prodInjMatrix=getProdInjMatrix(timeList,particle.X[injNums+1],injDataMatrix,prodDataVector);
int cols=prodInjMatrix.cols();
int rows=prodInjMatrix.rows();
ArrayXd prodData=prodDataVector.tail(rows);
MatrixXd injMatrix=prodInjMatrix.leftCols(cols-1);
VectorXd resVector(injNums+1);
for (int i=0;i<injNums+1;i++)
{
resVector(i)=particle.X[i];
}
ArrayXd prodObs=(injMatrix*resVector).array();//计算出的产量
double qoj=prodData.mean()-prodObs.mean();//注采不平衡系数
prodObs+=qoj;
double err=-(prodData-prodObs).pow(2).sum()/rows;//相对误差
// double err=particle.X[0]*sin(particle.X[0]*3.1415926*10)+2;
return err;
}

添加的设置参数函数
//设置计算适应度参数
void CmpModel::setFitParams(int pNum,int maxIter)
{
int injNums=injDataMatrix.cols();
SetDimN(injNums+2,pNum);
double xDown[injNums+2],xUp[injNums+2];
for (int i=0;i<injNums;i++)
{
xDown[i]=0;
xUp[i]=1;
}
xDown[injNums]=0;
xUp[injNums]=2;
xDown[injNums+1]=0.01;
xUp[injNums+1]=100;
SetXdown(xDown);
SetXup(xUp);
SetVmax(0.125);
SetIteorMax(maxIter);
}
void CmpModel::printResult()
{
int injNums=injDataMatrix.cols();
double result[injNums+2];
double gBestFit=GetBest(result);
qDebug()<<"gBestFit:"<<gBestFit;
for (int i=0;i<injNums+2;i++)
{
qDebug()<<result[i];
}
}

运行结果:
第1次触发
初始化所有粒子的个体
gBestFit: -0.0106852
0.124679
0.129975
0.118851
0.0695183
0.0621348
1.11824
7.1922
初始化所有粒子的个体
gBestFit: -0.0163799
0.125802
0.123954
0.110999
0.0605069
0.0627186
0.939009
10.7074
第2次触发
初始化所有粒子的个体
gBestFit: -0.00572
0.123246
0.127932
0.117957
0.0668491
0.0630871
1.10139
9.26076
初始化所有粒子的个体
gBestFit: -1.56042
0.0482683
0.211839
0.187464
0.047509
0.177201
1.57394
57.4806
第3次触发
初始化所有粒子的个体
gBestFit: -0.133401
0.102157
0.159354
0.14124
0.0888743
0.0896266
1.65061
12.747
初始化所有粒子的个体
gBestFit: -3.4611
0.155183
0.243381
0.172704
0.135338
0.111841
1.81003
72.7145
第4次触发
初始化所有粒子的个体
gBestFit: -1.27257
0.073802
0.169055
0.160619
0.018564
0.161117
1.26562
72.6809
初始化所有粒子的个体
gBestFit: -6.41726
0.20154
0.226871
0.0451014
0.0630959
0.153779
1.34195
59.6622
第5次触发
初始化所有粒子的个体
gBestFit: -1.66646
0.063878
0.214967
0.173773
0.00151516
0.164087
1.34985
76.219
初始化所有粒子的个体
gBestFit: -6.02889
0.0983612
0.0824
0.0578501
0.206366
0.14068
1.25472
89.2219
但是优化简单的问题
double CmpModel::GetFit(PARTICLE &particle)
{
double err=particle.X[0]*sin(particle.X[0]*3.1415926*10)+2;
return err;
}

则正常,不知道是哪出问题了,求大神指点
...全文
4412 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2018-01-25
  • 打赏
  • 举报
回复
@qq_40429293 设置同一个随机数种子。
阳光怪兽 2018-01-25
  • 打赏
  • 举报
回复
运用粒子群算法做参数辨识,由于每次运行的随机数不一样导致每次结果不同,该怎样在MATLAB中设置随机数
Waiting4you 2016-06-23
  • 打赏
  • 举报
回复 3
PSO算法是一种随机搜索算法,每次运行结果不一样是正常的啊。 简单问题因为维数少,解分布简单(就如曲面上只有一个高峰),所有很容易收敛到最优解上。 如果是复杂的问题的话,维数多,解高低分布复杂,PSO经常会收敛到局部优解上。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧