⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pso1.cpp

📁 C++编的pso程序。该程序可以用于优化各种系统
💻 CPP
字号:
// 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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -