// Pso1.cpp: implementation of the CPso class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Pso1.h"
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*CPatical::CPatical(float Xmin, float Xmax, float Vmax)
{
}
*/
CPatical::~CPatical()
{
}
void CPatical::LocalBest()
{
int i;
if(mBestFitness > mCurrentFitness)
{
for(i = 0; i < PATICAL_DIMENTION; i++)
mLBestPosition[i] = mPaticalPosition[i];
mBestFitness = mCurrentFitness;
}
}
void CPatical::Speed(float Vmax, float Gbest[], float c1, float c2, float r1, float r2, float w)
{
int i;
for(i = 0; i < PATICAL_DIMENTION; i++)
{
mSpeed[i] = w * mSpeed[i]+ c1 * r1 * (mLBestPosition[i] - mPaticalPosition[i]) + c2 * r2 * (Gbest[i] - mPaticalPosition[i]);
if(mSpeed[i] > Vmax)
mSpeed[i] = Vmax;
else if(mSpeed[i] < 0.0)
mSpeed[i] = 0.0;
}
}
void CPatical::Position(float Xmin, float Xmax)
{
int i;
for(i = 0; i < PATICAL_DIMENTION; i++)
{
mPaticalPosition[i] += mSpeed[i];
if(mPaticalPosition[i] > Xmax)
mPaticalPosition[i] = Xmax;
else if(mPaticalPosition[i] < Xmin)
mPaticalPosition[i] = Xmin;
}
}
void CPatical::InitPatical(float Xmin, float Xmax, float Vmax)
{
int i;
for(i = 0; i < PATICAL_DIMENTION; i++)
{
mPaticalPosition[i] = (float)((double)(rand()/(double)RAND_MAX) * (Xmax - Xmin) + Xmin);
mSpeed[i] = (float)((double)(rand()/(double)RAND_MAX) * Xmax);
}
mCurrentFitness = Fitness();
for(i = 0; i < PATICAL_DIMENTION; i++)
{
mBestFitness = mCurrentFitness;
mLBestPosition[i] = mPaticalPosition[i];
}
}
float CPatical::Fitness()
{
float s,h,x;
/* s = (mPaticalPosition[0] + mPaticalPosition[1] + 1.0);
s *= s;
h = 19.0 -14.0*mPaticalPosition[0] + 3.0 * mPaticalPosition[0]*mPaticalPosition[0] - 14.0 * mPaticalPosition[1] + 6.0 *mPaticalPosition[0]*mPaticalPosition[1] + 3.0 *mPaticalPosition[1]*mPaticalPosition[1];
s = s*h + 1.0;
h = 2.0 * mPaticalPosition[0] - 3.0 * mPaticalPosition[1];
h *= h;
x = 18.0 -32.0*mPaticalPosition[0]+12.0*mPaticalPosition[0]*mPaticalPosition[0]+48.0*mPaticalPosition[1]-36.0*mPaticalPosition[0]*mPaticalPosition[1]+27.0*mPaticalPosition[1]*mPaticalPosition[1];
h = x*h +30.0;
return s*h;*/
s = mPaticalPosition[0] * mPaticalPosition[0] + mPaticalPosition[1] * mPaticalPosition[1]+mPaticalPosition[2]*mPaticalPosition[2];
return s;
}
CPSO::CPSO(float c1, float c2, float r1, float r2, float w, float Xmin, float Xmax, float Vmax): mC1(c1), mC2(c2), mR1(r1), mR2(r2), mW(w)
{
int i;
mMaxGen = MAX_GENERATION;
mWuCha = 10e-6;
srand(time(0));
mXmin = Xmin;
mXmax = Xmax;
mVmax = Vmax;
for(i = 0; i < PATICAL_NUMBER; i++)
mPatical[i].InitPatical(Xmin, Xmax, Vmax);
mGBestFitness = mPatical[0].GetLocalBest();
for(int j = 0; j < PATICAL_DIMENTION; j++)
{
mGBestPosition[j] = mPatical[i].GetPaticalDemention(j);
}
GlobalBest();
}
CPSO::~CPSO()
{
}
void CPSO::GlobalBest()
{
int i,j;
for(i = 0; i < PATICAL_NUMBER; i++)
{
if(mGBestFitness > mPatical[i].GetLocalBest())
{
for(j = 0; j < PATICAL_DIMENTION; j++)
{
mGBestPosition[j] = mPatical[i].GetPaticalDemention(j);
}
mGBestFitness = mPatical[i].GetLocalBest();
}
}
}
void CPSO::Pso()
{
int k = 1,i;
float best;
while(k < mMaxGen)
{
for(i = 0; i < PATICAL_NUMBER; i++)
{
mPatical[i].ChangeSpeedAndPosition(mXmin,mXmax,mVmax,mGBestPosition,mC1,mC2,mR1,mR2);
mPatical[i].LocalBest();
}
best = mGBestFitness;
GlobalBest();
if(fabs(best - mGBestFitness) <= mWuCha)
break;
k++;
}
}
void CPSO::Print()
{
printf("%f,%f,%f,%f\n",mGBestPosition[0],mGBestPosition[1],mGBestPosition[2],mGBestFitness);
}