#include "pso.h"
#include "float.h"
#define PI 3.1415926358979323846
float minFitness = DBL_MAX;
void PSO::InitPSO(float vmax,float pmax, float pmin){
MyPso = new Particle[Particles];
Pmax = pmax;
Pmin = pmin;
Vmax = vmax;
srand((unsigned)time(NULL));
for (int i = 0; i < Particles; i++)
{
MyPso[i].Fitness = 0.0;
//MyPso[i].Position[0] = 0.0;
//MyPso[i].Position[1] = 0.0;
//MyPso[i].Pbest[0] = 0.0;
//MyPso[i].Pbest[1] = 0.0;
}
for (int i = 0; i < Particles; i++)
{
for (int j = 0; j < Dimesions; j++)
{
MyPso[i].Position[j] = rand()/float(RAND_MAX)*(Pmax-Pmin)+Pmin;
MyPso[i].Pbest[j] = MyPso[i].Position[j];
MyPso[i].V[j] = rand() / float(RAND_MAX) *2.0*Vmax-Vmax;
}
MyPso[i].BestFit = DBL_MAX;
PSOFitness(MyPso[i]);
}
GetGbest();
}
void PSO::PSOFitness(Particle &mypso){
mypso.Fitness = 10 * Dimesions;
//mypso.Fitness = 0.0;
for (int i = 0; i < Dimesions; i++)
{
mypso.Fitness = mypso.Fitness + mypso.Position[i] * mypso.Position[i] - 10 * cos(2 * PI*mypso.Position[i]);
// mypso.Fitness = mypso.Fitness + mypso.Position[i] * mypso.Position[i];
}
}
void PSO::Print(){
//for (int i = 0; i < Particles; i++)
//{
// for (int j = 0; j < Dimesions; j++)
// {
// cout << MyPso[i].Position[j] <<" "<<MyPso[i].BestP[j]<<" ";
// }
// cout <<MyPso[i].BestFit<< " ---"<<MyPso[i].Fitness << endl;
//}
cout << "最优位置" << Gbestp[0] << " " << Gbestp[1] << " 最优适应度: " << minFitness << endl;;
}
void PSO::PSOProcess(int cc1,int cc2,int iteration){
c1 = cc1;
c2 = cc2;
Iteration = iteration;
for (int i = 0; i < Iteration; i++)
{
for (int j = 0; j < Particles; j++)
{
for (int k = 0; k < Dimesions; k++)
{
MyPso[j].V[k] =0.5* MyPso[j].V[k] + c1*rand_01*(MyPso[j].BestP[k] - MyPso[j].Position[k]) + c2*rand_01*(Gbestp[k] - MyPso[j].Position[k]);
MyPso[j].V[k] = min(max(MyPso[j].V[k],-Vmax),Vmax);
MyPso[j].Position[k] = min(max(MyPso[j].Position[k] + MyPso[j].V[k],Pmin),Pmax);
}
PSOFitness(MyPso[j]);
}
GetGbest();
GetPbest();
Print();
}
}
void PSO::GetGbest()
{
for (int i = 0; i < Particles; i++)
{
if (MyPso[i].Fitness < minFitness)
{
//得到当前全局最优的粒子位置,和最优适应度
minFitness = MyPso[i].Fitness;
for (int j = 0; j < Dimesions; j++)
{
Gbestp[j] = MyPso[i].Position[j];
}
}
}
}
void PSO::GetPbest()
{
//更新各个粒子历史最佳位置和适应度
for (int k = 0; k < Particles; k++)
{
if (MyPso[k].Fitness < MyPso[k].BestFit)
{
MyPso[k].BestFit = MyPso[k].Fitness;
for (int t = 0; t < Dimesions; t++)
{
MyPso[k].BestP[t] = MyPso[k].Position[t];
}
}
}
}
PSO::PSO(){}
PSO::~PSO(){
delete MyPso;
}
////typedef void (*FitnessFunc)(float X[numofparticles][numofdims], float fitnesses[numofparticles]);
//
//void fitnessfunc(float X[numofparticles][numofdims], float fitnesses[numofparticles])
//{
// memset(fitnesses, 0, sizeof (float)* numofparticles);
// for (int i = 0; i < numofparticles; i++)
// {
// for (int j = 0; j < numofdims; j++)
// {
// fitnesses[i] += X[i][j] * X[i][j]; //(pow(X[i][j], 2));
// }
// }
//}
//
//void rosenBroekFunc(float X[numofparticles][numofdims], float fitnesses[numofparticles])
//{
// float x1, x2, t1, t2;
// memset(fitnesses, 0, sizeof (float)* numofparticles);
// for (int i = 0; i < numofparticles; i++)
// for (int j = 0; j < numofdims - 1; j++)
// {
// x1 = X[i][j];
// x2 = X[i][j + 1];
// t1 = (x2 - x1 * x1);
// t1 *= t1;
// t1 *= 100;
// t2 = x1 - 1;
// t2 *= t2;
// fitnesses[i] = t1 + t2;
// }
//}
//
//float mean(float inputval[], int vallength)
//{
// float addvalue = 0;
// for (int i = 0; i < vallength; i++)
// {
// addvalue += inputval[i];
// }
// return addvalue / vallength;
//}
//
//void PSO(int numofiterations, float c1, float c2,
// float Xmin[numofdims], float Xmax[numofdims], float initialpop[numofparticles][numofdims],
// float worsts[], float meanfits[], float bests[], float *gbestfit, float gbest[numofdims])
//{
// float V[numofparticles][numofdims] = { 0 };
// float X[numofparticles][numofdims];
// float Vmax[numofdims];
// float Vmin[numofdims];
// float pbests[numofparticles][numofdims];
// float pbestfits[numofparticles];
// float fitnesses[numofparticles];
// float w;
// float minfit;
// int minfitidx;
//
// memcpy(X, initialpop, sizeof(float)* numofparticles * numofdims);
// fitnessfunc(X, fitnesses);
// for (int i=0; i < numofparticles; i++)
// {
//cout << fitnesses[i] << endl;
// }
//
//
// //rosenBroekFunc(X, fitnesses);
//
// // fp(X, fitnesses);
// minfit = *min_element(fitnesses, fitnesses + numofparticles);
// cout << minfit << endl;
// minfitidx = min_element(fitnesses, fitnesses + numofparticles) - fitnesses;
// cout << minfitidx << endl;
// *gbestfit = minfit;
// memcpy(gbest, X[minfitidx], sizeof(float)* numofdims);
//
// //设置速度极限
// for (int i = 0; i < numofdims; i++)
// {
// Vmax[i] = 0.2 * (Xmax[i] - Xmin[i]);
// Vmin[i] = -Vmax[i];
// }
//
// for (int t = 0; t < 1000; t++)
// {
// w = 0.9 - 0.7 * t / numofiterations;
//
// //计算个体历史极小值
// for (int i = 0; i < numofparticles; i++)
// {
// if (fitnesses[i] < pbestfits[i])
// {
// pbestfits[i] = fitnesses[i]; //pbestfits初始化尚未赋值
// memcpy(pbests[i], X[i], sizeof(float)* numofdims);
// cout << "what?"<< endl;
// }
// }
// for (int i = 0; i < numofparticles; i++)
// {
// for (int j = 0; j < numofdims; j++)
// {
// V[i][j] = min(max((w * V[i][j] + rand_01 * c1 * (pbests[i][j] - X[i][j])
// + rand_01 * c2 * (gbest[j] - X[i][j])), Vmin[j]), Vmax[j]);
// X[i][j] = min(max((X[i][j] + V[i][j]), Xmin[j]), Xmax[j]);
// }
// }
//
// fitnessfunc(X, fitnesses);
// //rosenBroekFunc(X, fitnesses);
// minfit = *min_element(fitnesses, fitnesses + numofparticles);
// minfitidx = min_element(fitnesses, fitnesses + numofparticles) - fitnesses;
// if (minfit < *gbestfit)
// {
// *gbestfit = minfit;
// //cout << "It=" << t << "->" << minfit << endl;
// memcpy(gbest, X[minfitidx], sizeof(float)* numofdims);
// }
//
// worsts[t] = *max_element(fitnesses, fitnesses + numofparticles);
// bests[t] = *gbestfit;
// meanfits[t] = mean(fitnesses, numofparticles);
// }
//
//
//}
//
//int main()
//{
// time_t t;
// srand((unsigned)time(&t));
//
// float xmin[2], xmax[2];
// float initpop[50][2];
// float worsts[1000], bests[1000];
// float meanfits[1000];
// float gbestfit;
// float gbest[2];
// for (int i = 0; i < 2; i++)
// {
// xmax[i] = 5;
// xmin[i] = -5;
// }
// for (int i = 0; i < 50; i++)
// for (int j = 0; j < 2; j++)
// {
// initpop[i][j] = rand() % (5 + 5 + 1) - 5;
// }
//
// PSO(1000, 2, 2, xmin, xmax, initpop, worsts, meanfits, bests, &gbestfit, gbest);
//
// cout << "fitness: " << gbestfit << endl;
// for (int i = 0; i < 2; i++)
// cout << gbest[i] << ", ";
// cout << endl;
// getchar();
// return 0;
//}