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

📄 mopso.cpp~

📁 此程序为多目标粒子群程序
💻 CPP~
字号:
//mopso con epsilon dominance y clusters#include <stdio.h>#include <stdlib.h>#include <iostream>#include <vector>#include <math.h>#include "efile.h"using namespace std;double h(double _f1,double _f2,double _g){  double _sumatoria(0.0),_PI(3.1415927);  _sumatoria=(_f1/(1+_g)*(1+sin(3*_PI*_f1)))+(_f2/(1+_g)*(1+sin(3*_PI*_f2)));  return (3-_sumatoria);}  double g(vector<double> &_x){      double _suma(0.0),_PI(3.1415927);      for(int _i=2;_i<22;_i++)    _suma+=_x[_i];      return 1.0+9.0/20.0*_suma;}MOPSO::~MOPSO(){}MOPSO::MOPSO(int _dims, int _objs,int _parts,int _nclusters,int _gmax,double *_lb,double *_ub ){  srand(time(0));  ndimensions=_dims;  nobjectives=_objs;  nparticles=_parts;  nclusters=_nclusters;  gmax=_gmax;  gen=0;  lb.resize(ndimensions);  ub.resize(ndimensions);  particles.resize(nparticles);  for(int _j(0);_j<ndimensions;_j++){    lb[_j]=_lb[_j];    ub[_j]=_ub[_j];  }  archive.init(ndimensions, nobjectives, nclusters,100);}void MOPSO::initialize(){  C1=2.0;  C2=2.0;  W=0.4;  for(int _i(0);_i<nparticles;_i++){    for(int _j(0);_j<ndimensions;_j++){      particles[_i].vel[_j]=0;      particles[_i].x[_j]=rnd(lb[_j],ub[_j]);      particles[_i].xpbest[_j]=particles[_i].x[_j];    }    function(_i);    for(int _j(0);_j<nobjectives;_j++){      particles[_i].fxpbest[_j]=particles[_i].fx[_j];      }    archive.add(particles[_i],-1);  }}void MOPSO::execute(){  initialize();  for(gen=0;gen<gmax;gen++){    archive.updatematrix=true;    archive.hierarchicalClustering();    flight();  }  archive.output();}  void MOPSO::flight(){  for(int _i(0);_i<nparticles;_i++){    //        W=rnd(0.1,0.5);    //C2=rnd(1.5,2.5);    //C1=rnd(1.5,2.5);            int _whichcluster=(int)_i/(nparticles/nclusters);    int _gbestselected;    _gbestselected=archive.selectClusteredRandomSolution(_whichcluster);    for(int _k(0);_k<5;_k++){      for(int _j(0);_j<ndimensions;_j++){particles[_i].vel[_j]=W*particles[_i].vel[_j]+C1*rnd(0,1)*(archive.solutions[_gbestselected].x[_j]-particles[_i].x[_j])+C2*rnd(0,1)*(particles[_i].xpbest[_j]-particles[_i].x[_j]);//particles[_i].vel[_j]=W*particles[_i].vel[_j]+C1*rnd(0,1)*(archive.solutions[_gbestselected].x[_j]-particles[_i].x[_j]);//+C2*rnd(0,1)*(particles[_i].xpbest[_j]-particles[_i].x[_j]);	//perturbation(_i);		particles[_i].x[_j]+=particles[_i].vel[_j];	if(particles[_i].x[_j]<lb[_j])	  particles[_i].x[_j]=lb[_j];	if(particles[_i].x[_j]>ub[_j])	  particles[_i].x[_j]=ub[_j];      }      function(_i);      int _tmp=archive.domine1(particles[_i].fx,particles[_i].fxpbest);      if(_tmp==11||_tmp==1){	  copy(particles[_i].fxpbest,particles[_i].fx);	  copy(particles[_i].xpbest,particles[_i].x);	  archive.add(particles[_i],(int)_i/(nparticles/nclusters));      }    }	  }}void MOPSO::perturbation(int _whichparticle){  int _dimension=0;  double _lb,_ub,_rango;  double _gt=(double)gen/gmax;  double  _pM=pow(_gt,1.7)-2.0*_gt+1.0;  int _flag(0);  if((rnd(0.0,1.0)>_pM)&&_flag<=ndimensions){      _dimension= (int) rnd(0,ndimensions);      _rango=(ub[_dimension]-lb[_dimension])*_pM/2.0;//totGen      if(particles[_whichparticle].x[_dimension]-_rango<lb[_dimension]) 	_lb=lb[_dimension];       else 	_lb=particles[_whichparticle].x[_dimension]-_rango;      if(particles[_whichparticle].x[_dimension]+_rango>ub[_dimension]) 	_ub=ub[_dimension];       else 	_ub=particles[_whichparticle].x[_dimension]+_rango;	particles[_whichparticle].x[_dimension]=rnd(_lb,_ub);	_flag++;    }}void MOPSO::function(int _w){  /*  double sum1=0.0,sum2=0.0;      for(int i=0;i<ndimensions;i++){    if(i<ndimensions-1)      sum1+=-10.0*exp((-0.2)*sqrt( pow(particles[_w].x[i],2.0)+pow(particles[_w].x[i+1],2.0)));    sum2+=pow(fabs(particles[_w].x[i]),0.8)+5*sin(pow(particles[_w].x[i],3.0));  }  particles[_w].fx[0]=sum1;  particles[_w].fx[1]=sum2;      //*/  //     }  /*    double f;    double g;    double h;    double x1=particles[_w].x[0];    double x2=particles[_w].x[1];    f=x1;    g=11+pow(x2,2)-10*cos(2*3.1415926*x2);    if(f<=g)    h=1-pow((f/g),(double)(1.0/2.0));    else    h=0;     particles[_w].fx[0]=f;    particles[_w].fx[1]=g*h;      //    */  /*dtlz6    double _x[3];    double PI=3.1415927;    _x[0]=particles[_w].x[0];    _x[1]=particles[_w].x[1];        particles[_w].fx[0]=_x[0];    particles[_w].fx[1]=_x[1];    double _g=g(particles[_w].x);    particles[_w].fx[2]=(1+_g)*h(_x[0],_x[1],_g);  */  //*zdt1  double g(0),h(0);  particles[_w].fx[0]=particles[_w].x[0];  for(int _i(1);_i<ndimensions;_i++)    g+=(double)particles[_w].x[_i]/((double)ndimensions-1.0);  g*=9.0;  g+=1.0;  h=1.0-sqrt((double)particles[_w].fx[0]/g);  particles[_w].fx[1]=g*h;  //*/    }double MOPSO::rnd(double _min,double _max){  return((double)(_min + ((double)(_max-_min)*rand()/(double)(RAND_MAX+_min))));}void MOPSO::copyx(vector<double> &_a,vector<double> &_b){  for(int _i(0);_i<ndimensions;_i++){    _a[_i]=_b[_i];  }}void MOPSO::copyfx(vector<double> &_a,vector<double> &_b){  for(int _i(0);_i<nobjectives;_i++){    _a[_i]=_b[_i];  }}void MOPSO::copy(vector<double> &_a,vector<double> &_b){  for(int _i(0);_i<_a.size();_i++){    _a[_i]=_b[_i];  }}int main(){  /*  int _ndims=3;  int _nobjs=2;  int _parts=40;  int _nclusters=4;  int _gmax=40;  double *_lbound=new(double[_ndims]);//=0.1;  double *_ubound=new(double[_ndims]);//=1;  _lbound[0]=-5.0;  _lbound[1]=-5.0;  _lbound[2]=-5.0;  _ubound[0]=5.0;  _ubound[1]=5.0;  _ubound[2]=5.0;  //*/  /*//deb  int _ndims=2;  int _nobjs=2;  int _parts=40;  int _nclusters=4;  int _gmax=40;  double *_lbound=new(double[_ndims]);//=0.1;  double *_ubound=new(double[_ndims]);//=1;    _lbound[0]=0.0;    _lbound[1]=-5.0;    _ubound[0]=1.0;    _ubound[1]=5.0;    //*/  /*//dtlz6  int _ndims=22;  int _nobjs=3;  int _parts=40;  int _nclusters=4;  int _gmax=100;  double *_lbound=new(double[_ndims]);//=0.1;  double *_ubound=new(double[_ndims]);//=1;  for(int _i(0);_i<_ndims;_i++){    _lbound[_i]=0.0;    _ubound[_i]=1.0;  }    //*/  //*//zdt1  int _ndims=30;  int _nobjs=2;  int _parts=40;  int _nclusters=4;  int _gmax=100;  double *_lbound=new(double[_ndims]);//=0.1;  double *_ubound=new(double[_ndims]);//=1;  for(int _i(0);_i<_ndims;_i++){    _lbound[_i]=0.0;    _ubound[_i]=1.0;  }    //*/  MOPSO  pso(_ndims,_nobjs,_parts,_nclusters , _gmax,_lbound,_ubound);  pso.execute();  delete [] _lbound;  delete [] _ubound;}

⌨️ 快捷键说明

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