📄 pso.cpp
字号:
// PSO.cpp: implementation of the CPSO class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PSODem.h"
#include "PSO.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPSO::CPSO()
{
}
CPSO::~CPSO()
{
}
//适应值函数
double CPSO::Fitness(double* pValue)
{
return pValue[0]*pValue[0];
}
//取随机值
double CPSO::Randval(double dLow, double dHigh)
{
double val;
val = ((double)(rand()%1000)/1000.0)*(dHigh - dLow) + dLow;
return(val);
}
void CPSO::PSOcal(double* solu) //粒子群算法计算函数
{
//TODO: Add your source code here
int i,j,k;
double** x=new double*[N];
double** v=new double*[N];
double** pBest=new double*[N];
int gBestIndex;
double gBestFit,piBestFit,xFit;
for(i=0;i<N;i++)
{
x[i]=new double[D];
v[i]=new double[D];
pBest[i]=new double[D];
}
//粒子群设置初始值
for (i=0;i<N;i++)
{
for(j=0;j<D;j++)
{
pBest[i][j]=x[i][j]=Randval(xMinD,xMaxD);
v[i][j]=Randval(vMinD,vMaxD);
if(Randval(0,1)<0.5)
v[i][j]=-v[i][j];
}
}
gBestIndex=0;
gBestFit=Fitness(pBest[0]);
for(i=1;i<N;i++)
{
piBestFit=Fitness(pBest[i]);
if(piBestFit<gBestFit)
{
gBestIndex=i;
gBestFit=piBestFit;
}
}
//迭代计算
for (k=1;k<=REPETTION;k++)
{
for (i=0;i<N;i++)
{
for(j=0;j<D;j++)
{
v[i][j]=w*v[i][j]+c1*Randval(vMinD,vMaxD)*(pBest[i][j]-x[i][j])+c2*Randval(vMinD,vMaxD)*(pBest[gBestIndex][j]-x[i][j]);
if(v[i][j]>vMaxD)
v[i][j]=vMaxD;
if(v[i][j]<-vMaxD)
v[i][j]=-vMaxD;
x[i][j]=x[i][j]+v[i][j];
if(x[i][j]>xMaxD)
x[i][j]=xMaxD;
if(x[i][j]<xMinD)
x[i][j]=xMinD;
}
xFit=Fitness(x[i]);
if(xFit<Fitness(pBest[i])) //更新局部最优
{
for(j=0;j<D;j++)
pBest[i][j]=x[i][j];
if(xFit<gBestFit) //更新全局最优
{
gBestIndex=i;
gBestFit=xFit;
}
}
}
}//迭代计算结束
for(j=0;j<D;j++)
solu[j]=pBest[gBestIndex][j];
if(x)
{
for(i=0;i<N;i++)
{
if(x[i]!=NULL)
delete[] (x[i]);
}
delete[] x;
}
if(v)
{
for(i=0;i<N;i++)
{
if(v[i]!=NULL)
delete[] (v[i]);
}
delete[] v;
}
if(pBest)
{
for(i=0;i<N;i++)
{
if(pBest[i]!=NULL)
delete[] (pBest[i]);
}
delete[] pBest;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -