用粒子群演算法優化一個問題,繼承了https://github.com/AlieYu/Particle-Swarm-Optimization-PSO-_C----
的PSO類,按演算法的原理,應該每次運行優化出的結果是一樣的,但是隨著運行次數的增多,偏差增大。
觸發函式
void MainWindow::calButtonClicked()
{
prodData.listVectorData=https://bbs.csdn.net/topics/ui->prodData->getListVectorData();
injData.listVectorData=https://bbs.csdn.net/topics/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=https://bbs.csdn.net/topics/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;
}
則正常,不知道是哪出問題了,求大神指點
uj5u.com熱心網友回復:
PSO演算法是一種隨機搜索演算法,每次運行結果不一樣是正常的啊。簡單問題因為維數少,解分布簡單(就如曲面上只有一個高峰),所有很容易收斂到最優解上。 如果是復雜的問題的話,維數多,解高低分布復雜,PSO經常會收斂到區域優解上。
uj5u.com熱心網友回復:
運用粒子群演算法做引數辨識,由于每次運行的亂數不一樣導致每次結果不同,該怎樣在MATLAB中設定亂數uj5u.com熱心網友回復:
@qq_40429293設定同一個亂數種子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/50688.html
標籤:基礎類
