?? pso for c++ .txt
字號:
pso程序的源代碼
pso程序的源代碼-粒子群優化算法源程序
作者:FashionXu
一個pso程序的源代碼。在vc.net2003下面通過。
建議:看代碼之前,請先弄明白pso是怎么回事。然后請對應著來:程序中用Agent代表一只鳥,PSO代表鳥群。閱讀源代碼,不要順著看,先看main(),然后按照出現的東西的順序,一個一個得來,呵呵,純粹是建議。
// PSO.cpp : 定義控制臺應用程序的入口點。
//粒子群優化算法基本程序
//你可以使用本代碼,如果感到對你有用的話,請通知作者,作者會很高興。
//通訊地址:fashionxu@163.com
//by FashionXu
//本程序在vc++.net 2003下面通過,你如果要在vc6.0下面使用,請查閱相關資料修改,或者聯系作者
#include "stdafx.h"
#include "iostream"
#define _USE_MATH_DEFINES
#include "math.h"
#include
const int iAgentDim=20;//優化函數的維數
const double iRangL=-30;//函數的取值范圍
const double iRangR=30;
const int iPSONum=20;//粒子數
int iStep=10000;//跌代次數
//下面的值,要具體程序中具體的修改,根據你優化的函數來修改
double w=0.9;//慣性系數
const double delta1=1;//1.494;//加速度
const double delta2=1;//1.494;
#define rnd(low,uper)((rand()/(double)RAND_MAX)*((uper)-(low))+(low))//這個東西,返回low ,uper之間的一個值
double gbest[iAgentDim];//global best fitness保留全局最優值的坐標
using namespace std;
class Agent//這個類表示單個的粒子,也就是一只鳥 :)
{
public:
double dpos[iAgentDim]; //位置,也就是各個維數的值
double dpbest[iAgentDim]; //維護一個“自己”找到的最優值的解
double dv[iAgentDim]; //速度
double m_dFitness;//agent's fitness 當前算出的一個值
double m_dBestfitness;//agent's best fitness 自己已經找到的最好值
Agent()//初始化
{
srand( (unsigned)(time( NULL )+rand()) );
int i=0;
for(;i {
dpos[i]=rnd(iRangL,iRangR);
dv[i]=dpbest[i]=dpos[i];
}
}
void UpdateFitness()
/*calculate the fitness and find out the best fitness,record*/
{
double sum1=0;
double sum2=0;
/*Ackley Funtion*/
for (int i=0;i {
sum1+=(dpos [i]*dpos [i]);
sum2+=cos(2*M_PI*dpos [i]);
}
m_dFitness=(-20*exp(-0.2*(sqrt((1.0/(double)iAgentDim *sum1))))-exp((1.0/(double)iAgentDim )*sum2)+20+M_E);
//The Rastrigin function
//int i=0;
//for (;i //{
// sum1+=(dpos [i]*dpos [i])-3.0*cos(2*M_PI*dpos [i]);
//}
//m_dFitness=3.0*iAgentDim+sum1;
//找到一個更好的值后,更新 m_dBestfitness
if (m_dFitness {
m_dBestfitness=m_dFitness;
int i=0;
for(;i {
dpbest[i]=dpos[i];
}
}
}
void UpdatePos()//agent moving
{
int i=0;
for(;i {
// basi pso
dv[i]=w*dv[i]+delta1*rnd(0,1)*(dpbest[i]-dpos[i])+delta2*rnd(0,1)*(gbest[i]-dpos[i]);
dpos[i]+=dv[i];
}
}
};
class PSO//這是粒子群,也就是鳥群了
{
private:
Agent agents[iPSONum];
double m_dBestFitness;//鳥群找到的最優值
int m_iTempPos;
public:
void Init();
void Search();
};
void PSO::Search()
{
int k=0;
while( k {
m_iTempPos=999;
int i;
for(i=0;i {//此處是找找鳥群中有沒有更好的解,如果有,記錄下來
if (m_dBestFitness>agents[i].m_dBestfitness )
{
m_dBestFitness=agents[i].m_dBestfitness;
m_iTempPos=i;//找到到的最好解的位置
}
}
if (m_iTempPos!=999)
{
int j;
for(j=0;j {
gbest[j]=agents[m_iTempPos].dpos[j];//記錄全局最優解的各個坐標
}
}
//printf("The best is %f \n",m_dBestFitness);
//下一次跌代
for(i=0;i {
agents[i].UpdatePos();
agents[i].UpdateFitness ();
}
k++;
}
printf("The best result is: %2.15f after %d step. \n",m_dBestFitness,k);
{
for (int i=0;i printf(" %2.15f ",gbest[i]);
}
}
void PSO::Init()//初始化,
{
int i=0;
m_dBestFitness=100000;
srand( (unsigned)(time( NULL )+rand()) );
for(;i {
agents[i].m_dBestfitness =100000;//將m_dBestfitness賦值為一個大的值,目的是找最小值,
agents[i].UpdateFitness();
}
}
int main(int argc, char* argv[])
{
PSO pso;
pso.Init ();
pso.Search();
printf("\n");
char c;
scanf("%c",&c);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -