切换到宽版
  • 1537阅读
  • 8回复

具有扩展性能的粒子群算法c++类 [复制链接]

上一主题 下一主题
离线jiajialei816
 
发帖
50
财富
893
威望
0
交易币
0
只看楼主 倒序阅读 使用道具 0楼 发表于: 2011-12-03 | 石油求职招聘就上: 阿果石油英才网
  1. /***********************************************************************************
  2. Particle.h - 粒子抽象基类头文件
  3. ************************************************************************************
  4. 类说明:
  5. 该类是单个粒子的一个抽象,是一个抽象基类;
  6. 派生类必须对该类中的成员变量进行内存分配;
  7. 该类包含计算粒子适应度的纯虚函数;
  8. 该类不能直接对象化,必须在其子类对适应度函数进行实现后方能对粒子进行实例化
  9. ************************************************************************************
  10. 作者:贾家磊,jiajialei816@163.com,中国地质大学(北京)地震勘探实验室,2011/11/30
  11. ************************************************************************************/
  12. #ifndef _PARTICLE_H_JIAJIALEI
  13. #define _PARTICLE_H_JIAJIALEI
  14. #include <stdlib.h>
  15. class CParticle
  16. {
  17. public:
  18. ////////////////////
  19. //构造与析构部分
  20. ////////////////////
  21. //粒子类缺省构造函数
  22. CParticle();
  23. //粒子类带参数构造函数
  24. CParticle(int dimension);
  25. //粒子类析构函数
  26. virtual ~CParticle();
  27. //////////////////
  28. //参数设置部分
  29. //////////////////
  30. //设置粒子的位置
  31. virtual void SetPosition(float *position);
  32. //设置粒子的速度
  33. virtual void SetVelocity(float *velocity);
  34. //设置粒子个体的最优解位置
  35. virtual void SetBestPosition(float *bestPosition);
  36. //设置粒子的适应度
  37. virtual void SetFitness(float fitness) { fFitness = fitness; };
  38. //设置粒子个体的最好适应度
  39. virtual void SetBestFitness(float bestFitness) { fBestFitness = bestFitness; };
  40. //设置粒子个体的维度
  41. virtual void SetDimension(int dimension) { nDimension = dimension; };
  42. //////////////////
  43. //参数输出部分
  44. //////////////////
  45. //返回粒子的位置
  46. virtual float* GetPosition() { return pfPosition; };
  47. //返回粒子的速度
  48. virtual float* GetVelocity() { return pfVelocity; };
  49. //返回粒子个体的最优解位置
  50. virtual float* GetBestPosition() { return pfBestPosition; }
  51. //返回粒子的适应度
  52. virtual float GetFitness() { return fFitness; }
  53. //返回粒子个体的最好适应度
  54. virtual float GetBestFitness() { return fBestFitness; };
  55. //返回粒子个体的维度
  56. virtual int GetDimension() { return nDimension; };
  57. //////////////
  58. //计算部分
  59. //////////////
  60. //更新粒子的最好适应度及其位置信息
  61. virtual void UpdateBestPosition();
  62. //计算粒子的适应度值,纯虚函数,必须在其子类定义
  63. virtual void CalculateFitness() = 0;
  64. protected:
  65. //粒子的位置(坐标)
  66. float *pfPosition;
  67. //粒子的速度
  68. float *pfVelocity;
  69. //粒子个体的最优解位置(坐标)
  70. float *pfBestPosition;
  71. //粒子的适应度(误差,其值越小适应度越好)
  72. float fFitness;
  73. //粒子个体的最好适应度(误差,其值越小适应度越好)
  74. float fBestFitness;
  75. //粒子的维度
  76. int nDimension;
  77. };
  78. #endif//_PARTICLE_H_JIAJIALEI
  1. /***********************************************************************************
  2. Particle.cpp - 粒子抽象基类的实现文件
  3. ************************************************************************************
  4. 类说明:
  5. 该类是单个粒子的一个抽象,是一个抽象基类;
  6. 该类包含计算粒子适应度的纯虚函数;
  7. 该类不能直接对象化,必须在其子类对适应度函数进行实现后方能对粒子进行实例化
  8. ************************************************************************************
  9. 作者:贾家磊,jiajialei816@163.com,中国地质大学(北京)地震勘探实验室,2011/11/30
  10. ************************************************************************************/
  11. #include "Particle.h"
  12. /*粒子类缺省构造函数*/
  13. CParticle::CParticle()
  14. {
  15. pfPosition = NULL;
  16. pfVelocity = NULL;
  17. pfBestPosition = NULL;
  18. fFitness = 0;
  19. fBestFitness = 0;
  20. nDimension = 0;
  21. }
  22. /*粒子类带参数构造函数*/
  23. CParticle::CParticle(int dimension)
  24. {
  25. pfPosition = NULL;
  26. pfVelocity = NULL;
  27. pfBestPosition = NULL;
  28. fFitness = 0;
  29. fBestFitness = 0;
  30. nDimension = dimension;
  31. }
  32. /*粒子类析构函数*/
  33. CParticle::~CParticle()
  34. {
  35. }
  36. /*更新粒子的最好适应度及其位置信息*/
  37. void CParticle::UpdateBestPosition()
  38. {
  39. //如果粒子当前计算的适应度小于粒子个体的最好适应度时
  40. if(fFitness<fBestFitness)
  41. {
  42. fBestFitness = fFitness;
  43. for(int i=0; i<nDimension; i++)
  44. pfBestPosition[i] = pfPosition[i];
  45. }
  46. }
  47. /*设置粒子的位置*/
  48. void CParticle::SetPosition(float *position)
  49. {
  50. for(int i=0; i<nDimension; i++)
  51. pfPosition[i] = position[i];
  52. }
  53. /*设置粒子个体的最优解位置*/
  54. void CParticle::SetBestPosition(float *bestPosition)
  55. {
  56. for(int i=0; i<nDimension; i++)
  57. pfBestPosition[i] = bestPosition[i];
  58. }
  59. /*设置粒子的速度*/
  60. void CParticle::SetVelocity(float *velocity)
  61. {
  62. for(int i=0; i<nDimension; i++)
  63. pfVelocity[i] = velocity[i];
  64. }
  1. /***********************************************************************************
  2. ParticleSwarm.h - 粒子群基类头文件
  3. ************************************************************************************
  4. 类说明:
  5. 该类是由多个抽象粒子组成的粒子群基类;
  6. 粒子群派生类必须对粒子群基类中的成员变量进行内存分配
  7. 该类主要包括粒子群随机初始化函数Randomize和粒子群进化一代函数ParticleFly
  8. ************************************************************************************
  9. 作者:贾家磊,jiajialei816@163.com,中国地质大学(北京)地震勘探实验室,2011/11/30
  10. ************************************************************************************/
  11. #ifndef _PARTICLE_SWARM_H_JIAJIALEI
  12. #define _PARTICLE_SWARM_H_JIAJIALEI
  13. #include "Particle.h"
  14. class CParticleSwarm
  15. {
  16. public:
  17. ////////////////////
  18. //构造与析构部分
  19. ////////////////////
  20. //粒子群类缺省构造函数
  21. CParticleSwarm();
  22. //粒子群类带参数构造函数
  23. CParticleSwarm(int dimension, int particleNum);
  24. //粒子类析构函数
  25. virtual ~CParticleSwarm();
  26. //////////////////
  27. //参数设置部分
  28. //////////////////
  29. //设置粒子位置信息的下界
  30. virtual void SetMinPosition(float *minPosition);
  31. //设置粒子位置信息的上界
  32. virtual void SetMaxPosition(float *maxPosition);
  33. //设置粒子的最大速度
  34. virtual void SetMaxVelocity(float percent);
  35. virtual void SetMaxVelocity(float *minVelocity);
  36. //设置粒子的非负惯性权系数
  37. virtual void SetMomentum(float momentum) { fMomentum = momentum; };
  38. //设置线性惯性权系数的范围(线性惯性权系数时使用)
  39. virtual void SetMomentumRange(float minMomentum, float maxMomentum);
  40. //设置量化粒子认知能力的学习因子fC1
  41. virtual void SetC1(float c1) { fC1 = c1; };
  42. //设置量化粒子社会能力的学习因子fC2
  43. virtual void SetC2(float c2) { fC2 = c2; };
  44. //////////////////
  45. //参数输出部分
  46. //////////////////
  47. //返回粒子位置信息的下界
  48. virtual float* GetMinPosition() { return pfMinPosition; };
  49. //返回粒子位置信息的上界
  50. virtual float* GetMaxPosition() { return pfMaxPosition; };
  51. //返回粒子的最大速度
  52. virtual float* GetMaxVelocity() { return pfMaxVelocity; };
  53. //返回粒子的惯性权系数
  54. virtual float GetMomentum() { return fMomentum; };
  55. //返回量化粒子认知能力的学习因子fC1
  56. virtual float GetC1() { return fC1; };
  57. //返回量化粒子社会能力的学习因子fC2
  58. virtual float GetC2() { return fC2; };
  59. //返回粒子群中全局最优粒子的索引号
  60. virtual int GetGroupBestIndex() { return nGroupBestIndex; };
  61. //返回全局最优粒子的位置
  62. virtual void GetGroupBestPosition(float* bestPosition);
  63. //返回全局最优粒子的适应度
  64. virtual float GetGroupBestFitness();
  65. //返回粒子群中各个粒子最优适应度的中位索引号
  66. virtual int GetGroupMedianIndex();
  67. //计算粒子群中各个粒子最优适应度的中位数,然后返回对应粒子的最优位置
  68. virtual void GetGroupMedianPosition(float* midPosition);
  69. //返回粒子群中各个粒子最优位置的平均
  70. virtual void GetGroupAveragePosition(float* avgPosition);
  71. //返回粒子群中各个粒子适应度的平均值
  72. virtual float GetGroupAverageFitness();
  73. //返回粒子群中的粒子数
  74. virtual int GetParticleNum() { return nParticleNum; };
  75. //返回全局最优的粒子
  76. virtual CParticle& GetGroupBestParticle() { return cParticle[nGroupBestIndex]; };
  77. //返回指定的粒子
  78. virtual CParticle& GetParticleFromIndex(int index) { return cParticle[index]; };
  79. //返回粒子群指针
  80. virtual CParticle* GetParticleSwarm() { return cParticle; };
  81. //////////////
  82. //计算部分
  83. //////////////
  84. //粒子群迭代进化(对于不同的实现算法可重载该函数实现)
  85. virtual void RunEpoch(int iteration);//迭代次数控制
  86. virtual void RunEpoch(float fitError);//适应度控制
  87. //随机初始化粒子群(位置和速度信息)
  88. virtual void Randomize();
  89. //生成新一代的粒子群
  90. virtual void ParticleFly();
  91. protected:
  92. //随机初始化粒子的位置信息(对于不同的更新算法可重载该函数实现)
  93. virtual void InitialPosition(int particleIndex, int dimension);
  94. //更新粒子的位置信息(对于不同的更新算法可重载该函数实现)
  95. virtual void UpdatePosition(int particleIndex, int dimension);
  96. //更新粒子群中全局最优粒子的索引号
  97. virtual void UpdateGroupBestIndex();
  98. //检查粒子的速度信息是否越界
  99. virtual void CheckVelocity(float *velocity);
  100. //检查粒子的位置信息是否越界
  101. virtual void CheckPosition(float *position);
  102. protected:
  103. //指向单个粒子的指针
  104. CParticle *cParticle;
  105. //粒子群中的粒子数
  106. int nParticleNum;
  107. //全局最优粒子的索引号(0,1,2,3...)
  108. int nGroupBestIndex;
  109. //粒子的位置信息下界
  110. float *pfMinPosition;
  111. //粒子的位置信息上界
  112. float *pfMaxPosition;
  113. //粒子的最大速度
  114. float *pfMaxVelocity;
  115. //粒子的非负惯性权系数:系数越大,全局寻优能力强;反之,局部寻优能力强
  116. float fMomentum;
  117. //最小非负惯性权系数(线性惯性权系数时使用)
  118. float fMinMomentum;
  119. //最大非负惯性全系数(线性惯性权系数时使用)
  120. float fMaxMomentum;
  121. //量化粒子认知能力的学习因子fC1
  122. float fC1;
  123. //量化粒子社会能力的学习因子fC2
  124. float fC2;
  125. };
  126. #endif//_PARTICLE_SWARM_H_JIAJIALEI
  1. /***********************************************************************************
  2. ParticleSwarm.cpp - 粒子群基类的实现文件
  3. ************************************************************************************
  4. 类说明:
  5. 该类是由多个抽象粒子组成的粒子群基类;
  6. 粒子群派生类必须对粒子群基类中的成员变量进行内存分配
  7. 该类主要包括粒子群随机初始化函数Randomize和粒子群进化一代函数ParticleFly
  8. ************************************************************************************
  9. 作者:贾家磊,jiajialei816@163.com,中国地质大学(北京)地震勘探实验室,2011/11/30
  10. ************************************************************************************/
  11. #include "ParticleSwarm.h"
  12. #include <time.h>
  13. /*粒子群类缺省构造函数*/
  14. CParticleSwarm::CParticleSwarm()
  15. {
  16. cParticle = NULL;
  17. pfMinPosition = NULL;
  18. pfMaxPosition = NULL;
  19. pfMaxVelocity = NULL;
  20. nParticleNum = 0;
  21. nGroupBestIndex = 0;
  22. fMomentum = 0.8f;
  23. fMinMomentum = 0.4f;
  24. fMaxMomentum = 0.9f;
  25. fC1 = 2.0f;
  26. fC2 = 2.0f;
  27. }
  28. /*粒子群类带参数构造函数*/
  29. CParticleSwarm::CParticleSwarm(int dimension, int particleNum)
  30. {
  31. pfMinPosition = NULL;
  32. pfMaxPosition = NULL;
  33. pfMaxVelocity = NULL;
  34. nParticleNum = particleNum;
  35. nGroupBestIndex = 0;
  36. fMomentum = 0.8f;
  37. fMinMomentum = 0.4f;
  38. fMaxMomentum = 0.9f;
  39. fC1 = 2.0f;
  40. fC2 = 2.0f;
  41. }
  42. /*粒子群类析构函数*/
  43. CParticleSwarm::~CParticleSwarm()
  44. {
  45. }
  46. /*设置粒子位置信息的下界*/
  47. void CParticleSwarm::SetMinPosition(float *minPosition)
  48. {
  49. int dimension = cParticle[0].GetDimension();
  50. for(int i=0; i<dimension; i++)
  51. pfMinPosition[i] = minPosition[i];
  52. }
  53. /*设置粒子位置信息的上界*/
  54. void CParticleSwarm::SetMaxPosition(float *maxPosition)
  55. {
  56. int dimension = cParticle[0].GetDimension();
  57. for(int i=0; i<dimension; i++)
  58. pfMaxPosition[i] = maxPosition[i];
  59. }
  60. /*设置粒子的最大速度*/
  61. void CParticleSwarm::SetMaxVelocity(float percent)
  62. {
  63. if(!nParticleNum) return;
  64. int dimension = cParticle[0].GetDimension();
  65. for(int i=0; i<dimension; i++)
  66. pfMaxVelocity[i] = percent*(pfMaxPosition[i]-pfMinPosition[i]);
  67. }
  68. void CParticleSwarm::SetMaxVelocity(float *maxVelocity)
  69. {
  70. int dimension = cParticle[0].GetDimension();
  71. for(int i=0; i<dimension; i++)
  72. pfMaxVelocity[i] = maxVelocity[i];
  73. }
  74. /*设置线性惯性权系数的范围*/
  75. void CParticleSwarm::SetMomentumRange(float minMomentum, float maxMomentum)
  76. {
  77. fMinMomentum = minMomentum;
  78. fMaxMomentum = maxMomentum;
  79. }
  80. /*跟新粒子群中全局最优粒子的索引号*/
  81. void CParticleSwarm::UpdateGroupBestIndex()
  82. {
  83. for(int i=0; i<nParticleNum; i++)
  84. {
  85. if(i!=nGroupBestIndex &&
  86. cParticle[i].GetBestFitness()<cParticle[nGroupBestIndex].GetBestFitness())
  87. nGroupBestIndex = i;
  88. }
  89. }
  90. /*返回粒子群中各个粒子最优位置的平均*/
  91. void CParticleSwarm::GetGroupAveragePosition(float* avgPosition)
  92. {
  93. int i,j;
  94. int dimension = cParticle[0].GetDimension();
  95. float *bestPos;
  96. for(i=0; i<dimension; i++)
  97. avgPosition[i] = 0.0;
  98. for(j=0; j<nParticleNum; j++)
  99. {
  100. bestPos = cParticle[j].GetBestPosition();
  101. for(i=0; i<dimension; i++)
  102. avgPosition[i] += bestPos[i];
  103. }
  104. for(i=0; i<dimension; i++)
  105. avgPosition[i] /= nParticleNum;
  106. }
  107. /*返回粒子群中各个粒子适应度的平均值*/
  108. float CParticleSwarm::GetGroupAverageFitness()
  109. {
  110. float avg = 0.0;
  111. for(int i=0; i<nParticleNum; i++)
  112. avg += cParticle[i].GetBestFitness();
  113. return (avg/nParticleNum);
  114. }
  115. /*返回粒子群中各个粒子最优适应度的中位索引号*/
  116. int CParticleSwarm::GetGroupMedianIndex()
  117. {
  118. int i,j,k,index;
  119. float temp;
  120. float *pfData = new float[nParticleNum];
  121. int* pIndex = new int[nParticleNum];
  122. for(i=0; i<nParticleNum; i++)
  123. {
  124. pfData[i] = cParticle[i].GetBestFitness();
  125. pIndex[i] = i;
  126. }
  127. for(i=0; i<=nParticleNum/2; i++)
  128. {
  129. k = nParticleNum-i;
  130. temp = pfData[0];
  131. index = 0;
  132. //寻找序列中最大值以及其索引号
  133. for(j=1; j<k; j++)
  134. {
  135. if(pfData[j]>temp)
  136. {
  137. temp = pfData[j];
  138. index = j;
  139. }
  140. }
  141. //将序列尾部的值写入到当前序列中最大值处
  142. pfData[index] = pfData[k-1];//将序列中的最大值逐个覆盖
  143. pIndex[index] = k-1;
  144. }
  145. //粒子群中各个粒子最优适应度的中位数
  146. index = pIndex[nParticleNum/2];
  147. delete []pfData;
  148. delete []pIndex;
  149. return index;
  150. }
  151. /*计算粒子群中各个粒子最优适应度的中位数,然后返回对应粒子的最优位置*/
  152. void CParticleSwarm::GetGroupMedianPosition(float* midPosition)
  153. {
  154. int i,j,k,index;
  155. float temp, *pos;
  156. float *pfData = new float[nParticleNum];
  157. int* pIndex = new int[nParticleNum];
  158. for(i=0; i<nParticleNum; i++)
  159. {
  160. pfData[i] = cParticle[i].GetBestFitness();
  161. pIndex[i] = i;
  162. }
  163. for(i=0; i<=nParticleNum/2; i++)
  164. {
  165. k = nParticleNum-i;
  166. temp = pfData[0];
  167. index = 0;
  168. //寻找序列中最大值以及其索引号
  169. for(j=1; j<k; j++)
  170. {
  171. if(pfData[j]>temp)
  172. {
  173. temp = pfData[j];
  174. index = j;
  175. }
  176. }
  177. //将序列尾部的值写入到当前序列中最大值处
  178. pfData[index] = pfData[k-1];//将序列中的最大值逐个覆盖
  179. pIndex[index] = k-1;
  180. }
  181. //粒子群中各个粒子最优适应度的中位数
  182. index = pIndex[nParticleNum/2];
  183. //中位数对应粒子的最优位置
  184. pos = cParticle[index].GetBestPosition();
  185. int dimension = cParticle[index].GetDimension();
  186. for(i=0; i<dimension; i++)
  187. midPosition[i] = pos[i];
  188. delete []pfData;
  189. delete []pIndex;
  190. }
  191. /*返回全局最优粒子的适应度*/
  192. float CParticleSwarm::GetGroupBestFitness()
  193. {
  194. return cParticle[nGroupBestIndex].GetBestFitness();
  195. }
  196. /*返回全局最优粒子的位置*/
  197. void CParticleSwarm::GetGroupBestPosition(float* bestPosition)
  198. {
  199. int dimension = cParticle[nGroupBestIndex].GetDimension();
  200. float *gBestPos;
  201. gBestPos = cParticle[nGroupBestIndex].GetBestPosition();
  202. for(int i=0; i<dimension; i++)
  203. bestPosition[i] = gBestPos[i];
  204. }
  205. /*检查粒子的速度信息是否越界*/
  206. void CParticleSwarm::CheckVelocity(float *velocity)
  207. {
  208. int dimension = cParticle[0].GetDimension();
  209. for(int i=0; i<dimension; i++)
  210. {
  211. //速度越界检查
  212. if(velocity[i]>pfMaxVelocity[i])//速度超过上界
  213. velocity[i] = pfMaxVelocity[i];
  214. if(velocity[i]<-pfMaxVelocity[i])//速度越过下界
  215. velocity[i] = -pfMaxVelocity[i];
  216. }
  217. }
  218. /*检查粒子的位置信息是否越界*/
  219. void CParticleSwarm::CheckPosition(float *position)
  220. {
  221. int dimension = cParticle[0].GetDimension();
  222. for(int i=0; i<dimension; i++)
  223. {
  224. //位置越界检查
  225. if(position[i]>pfMaxPosition[i])//位置超过上界
  226. position[i] = 2*pfMaxPosition[i]-position[i];
  227. if(position[i]<pfMinPosition[i])//位置越过下界
  228. position[i] = 2*pfMinPosition[i]-position[i];
  229. }
  230. }
  231. /*随机初始化粒子群*/
  232. void CParticleSwarm::Randomize()
  233. {
  234. if(!nParticleNum) return;
  235. static int kk=(unsigned)time(NULL);
  236. srand((unsigned)time(NULL)+kk++);
  237. int dimension = cParticle[0].GetDimension();
  238. nGroupBestIndex = 0;
  239. for(int i=0; i<nParticleNum; i++)
  240. {
  241. //初始化粒子的位置信息
  242. InitialPosition(i, dimension);
  243. //计算粒子群的适应度
  244. cParticle[i].CalculateFitness();
  245. //将粒子当前的适应度设置成粒子的最好适应度
  246. cParticle[i].SetBestFitness(cParticle[i].GetFitness());
  247. //查找初始粒子群中的最优粒子
  248. if(cParticle[i].GetFitness()<cParticle[nGroupBestIndex].GetFitness())
  249. nGroupBestIndex = i;
  250. }
  251. }
  252. /*生成新一代的粒子群*/
  253. void CParticleSwarm::ParticleFly()
  254. {
  255. if(!nParticleNum) return;
  256. static int tt=(unsigned)time(NULL);
  257. srand((unsigned)time(NULL)+tt++);
  258. int dimension = cParticle[0].GetDimension();
  259. for(int i=0; i<nParticleNum; i++)
  260. {
  261. //更新第i个粒子的位置信息
  262. UpdatePosition(i, dimension);
  263. //计算新一代粒子群的适应度值
  264. cParticle[i].CalculateFitness();
  265. //更新粒子的最优位置信息
  266. cParticle[i].UpdateBestPosition();
  267. }
  268. //跟新粒子群中全局最优粒子的索引号
  269. UpdateGroupBestIndex();
  270. }
  271. /*粒子群迭代进化(对于不同的实现算法可重载该函数实现)*/
  272. void CParticleSwarm::RunEpoch(int iteration)
  273. {
  274. //初始化粒子群
  275. Randomize();
  276. //粒子种群进化
  277. for(int i=0; i<iteration; i++)
  278. ParticleFly();
  279. }
  280. void CParticleSwarm::RunEpoch(float fitError)
  281. {
  282. //初始化粒子群
  283. Randomize();
  284. //粒子种群进化
  285. for(int i=0; ; i++)
  286. {
  287. ParticleFly();
  288. if(cParticle[nGroupBestIndex].GetBestFitness()<fitError)
  289. break;
  290. }
  291. }
  292. /*随机初始化粒子的位置信息(对于不同的更新算法可重载该函数实现)*/
  293. void CParticleSwarm::InitialPosition(int particleIndex, int dimension)
  294. {
  295. float *pos = new float[dimension];
  296. float *vel = new float[dimension];
  297. for(int i=0; i<dimension; i++)
  298. {
  299. //随机初始化粒子群的位置信息
  300. pos[i] = (float)rand()/(float)RAND_MAX
  301. *(pfMaxPosition[i]-pfMinPosition[i])+pfMinPosition[i];
  302. //随机初始化粒子群的速度信息
  303. vel[i] = (float)rand()/(float)RAND_MAX
  304. *pfMaxVelocity[i]-pfMaxVelocity[i]/2;
  305. }
  306. //设置初始粒子群的位置信息
  307. cParticle[particleIndex].SetPosition(pos);
  308. //设置初始粒子群的最优位置信息
  309. cParticle[particleIndex].SetBestPosition(pos);
  310. //设置初始粒子群的速度信息
  311. cParticle[particleIndex].SetVelocity(vel);
  312. delete []pos;
  313. delete []vel;
  314. }
  315. /*更新粒子的位置信息(对于不同的更新算法只需重载该函数实现即可)*/
  316. void CParticleSwarm::UpdatePosition(int particleIndex, int dimension)
  317. {
  318. float *pos, *bestPos, *gbestPos, *vel;
  319. //获取当前粒子的位置信息
  320. pos = cParticle[particleIndex].GetPosition();
  321. //获取局部最优粒子
  322. bestPos = cParticle[particleIndex].GetBestPosition();
  323. //全局最优粒子
  324. gbestPos = cParticle[nGroupBestIndex].GetBestPosition();
  325. //当前粒子的速度信息
  326. vel = cParticle[particleIndex].GetVelocity();
  327. for(int i=0; i<dimension; i++)
  328. {
  329. //更新粒子速度信息
  330. vel[i] = fMomentum*vel[i]/*惯性项*/
  331. +(float)rand()/(float)RAND_MAX*fC1*(bestPos[i]-pos[i])/*认知项*/
  332. +(float)rand()/(float)RAND_MAX*fC2*(gbestPos[i]-pos[i])/*社会项*/;
  333. }
  334. //检查粒子的速度信息是否越界
  335. CheckVelocity(vel);
  336. //位置信息更新
  337. for(i=0; i<dimension; i++)
  338. pos[i] += vel[i];//position += velocity;
  339. //检查粒子的位置信息是否越界
  340. CheckPosition(pos);
  341. }
  1. /***********************************************************************************
  2. MyParticle.h - 自定义粒子类头文件
  3. ************************************************************************************
  4. 类说明:
  5. 该类派生于粒子抽象基类,提供了一个自定义粒子类派生模式;
  6. 该类对粒子抽象基类中的成员变量进行内存分配;
  7. 该类实现了基类中计算粒子适应度的纯虚函数(针对不同实际问题只需修改该适应度函数);
  8. ************************************************************************************
  9. 作者:贾家磊,jiajialei816@163.com,中国地质大学(北京)地震勘探实验室,2011/11/30
  10. ************************************************************************************/
  11. #ifndef _MY_PARTICLE_H_JIAJIALEI
  12. #define _MY_PARTICLE_H_JIAJIALEI
  13. #include "Particle.h"
  14. class CMyParticle:public CParticle
  15. {
  16. public:
  17. ////////////////////
  18. //构造与析构部分
  19. ////////////////////
  20. //自定义粒子类缺省构造函数
  21. CMyParticle():CParticle() {};
  22. //自定义粒子类带参数构造函数
  23. CMyParticle(int dimension);
  24. //自定义粒子类析构函数
  25. virtual ~CMyParticle();
  26. ////////////////////
  27. //内存分配部分
  28. ////////////////////
  29. //设置自定义粒子维度并进行基类成员变量内存分配
  30. virtual void SetDimension(int dimension);
  31. ////////////////////
  32. //方法实现部分
  33. ////////////////////
  34. //计算自定义粒子的适应度(针对不同实际问题只需修改该函数)
  35. virtual void CalculateFitness();
  36. };
  37. #endif//_MY_PARTICLE_H_JIAJIALEI
  1. /***********************************************************************************
  2. MyParticle.cpp - 自定义粒子类的实现文件
  3. ************************************************************************************
  4. 类说明:
  5. 该类派生于粒子抽象基类,提供了一个自定义粒子类派生模式;
  6. 该类对粒子抽象基类中的成员变量进行内存分配;
  7. 该类实现了基类中计算粒子适应度的纯虚函数(针对不同实际问题只需修改该适应度函数);
  8. ************************************************************************************
  9. 作者:贾家磊,jiajialei816@163.com,中国地质大学(北京)地震勘探实验室,2011/11/30
  10. ************************************************************************************/
  11. #include "MyParticle.h"
  12. /*自定义粒子类带参数构造函数(分配内存空间)*/
  13. CMyParticle::CMyParticle(int dimension):CParticle(dimension)
  14. {
  15. pfPosition = new float[nDimension];
  16. pfVelocity = new float[nDimension];
  17. pfBestPosition = new float[nDimension];
  18. }
  19. /*析构自定义粒子*/
  20. CMyParticle::~CMyParticle()
  21. {
  22. if(nDimension)
  23. {
  24. delete []pfPosition;
  25. delete []pfVelocity;
  26. delete []pfBestPosition;
  27. }
  28. }
  29. /*设置自定义粒子维度并进行基类成员变量内存分配*/
  30. void CMyParticle::SetDimension(int dimension)
  31. {
  32. if(nDimension)
  33. {
  34. delete []pfPosition;
  35. delete []pfVelocity;
  36. delete []pfBestPosition;
  37. }
  38. nDimension = dimension;
  39. pfPosition = new float[nDimension];
  40. pfVelocity = new float[nDimension];
  41. pfBestPosition = new float[nDimension];
  42. }
  43. /*计算自定义粒子的适应度(针对不同实际问题只需修改该函数)*/
  44. #include "math.h"
  45. void CMyParticle::CalculateFitness()
  46. {
  47. //针对实际问题需完成的...
  48. // Particle::fFitness = 1.1f;
  49. }
  1. /***********************************************************************************
  2. PSO.h - 标准粒子群算法类头文件
  3. ************************************************************************************
  4. 类说明:
  5. 该类派生于粒子群基类,提供了一个自定义粒子群类派生模式;
  6. 该类对粒子群基类中的成员变量进行内存分配;
  7. 该类实现了基类的标准粒子群算法
  8. ************************************************************************************
  9. 作者:贾家磊,jiajialei816@163.com,中国地质大学(北京)地震勘探实验室,2011/11/30
  10. ************************************************************************************/
  11. #ifndef _PSO_H_JIAJIALEI
  12. #define _PSO_H_JIAJIALEI
  13. #include "MyParticle.h"
  14. #include "ParticleSwarm.h"
  15. class CPSO : public CParticleSwarm
  16. {
  17. public:
  18. ////////////////////
  19. //构造与析构部分
  20. ////////////////////
  21. //标准粒子群类缺省构造函数
  22. CPSO():CParticleSwarm() {};
  23. //标准粒子群类带参数构造函数
  24. CPSO(int dimension, int particleNum);
  25. //标准粒子群类析构函数
  26. virtual ~CPSO();
  27. };
  28. #endif//_ADAPTIVE_EXTENDED_PSO_H_JIAJIALEI
  1. /***********************************************************************************
  2. PSO.cpp - 标准粒子群算法类的实现文件
  3. ************************************************************************************
  4. 类说明:
  5. 该类派生于粒子群基类,提供了一个自定义粒子群类派生模式;
  6. 该类对粒子群基类中的成员变量进行内存分配;
  7. 该类实现了基类的标准粒子群算法
  8. ************************************************************************************
  9. 作者:贾家磊,jiajialei816@163.com,中国地质大学(北京)地震勘探实验室,2011/11/30
  10. ************************************************************************************/
  11. #include "PSO.h"
  12. /*设置标准粒子群并进行基类成员变量内存分配*/
  13. CPSO::CPSO(int dimension, int particleNum)
  14. :CParticleSwarm(dimension, particleNum)
  15. {
  16. cParticle = new CMyParticle[particleNum];
  17. for(int i=0; i<particleNum; i++)
  18. cParticle[i].SetDimension(dimension);//单个粒子分配内存
  19. pfMinPosition = new float[dimension];
  20. pfMaxPosition = new float[dimension];
  21. pfMaxVelocity = new float[dimension];
  22. }
  23. /*标准粒子群类析构函数*/
  24. CPSO::~CPSO()
  25. {
  26. if(nParticleNum)
  27. delete []cParticle;
  28. if(pfMinPosition != NULL)
  29. delete []pfMinPosition;
  30. if(pfMaxPosition != NULL)
  31. delete []pfMaxPosition;
  32. if(pfMaxVelocity != NULL)
  33. delete []pfMaxVelocity;
  34. }

1条评分财富+30
allex02 财富 +30 优秀文章,支持! 2011-12-06
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线pawaluodi
发帖
1
财富
0
威望
0
交易币
0
只看该作者 1楼 发表于: 2011-12-03 | 石油求职招聘就上: 阿果石油英才网
不错,顶一下,建议把计算后的效果对比分享一下
离线rongloer
发帖
30
财富
22
威望
0
交易币
0
只看该作者 2楼 发表于: 2011-12-03 | 石油求职招聘就上: 阿果石油英才网
支持一下
离线wh200500337
发帖
88
财富
240
威望
3
交易币
0
只看该作者 3楼 发表于: 2011-12-03 | 石油求职招聘就上: 阿果石油英才网
有我在的贴子或许会成为水贴,但没我在的帖子注定成不了神贴!
离线jiajialei816
发帖
50
财富
893
威望
0
交易币
0
只看该作者 4楼 发表于: 2011-12-03 | 石油求职招聘就上: 阿果石油英才网
这些类提供了一个开发粒子群优化算法的一个平台,只要派生自定义粒子群算法类,然后重载里面的几个函数就能实现自己想要的算法,后面将陆续给出实例

内容来自[短消息]
离线lvyang06
发帖
45
财富
142
威望
0
交易币
0
只看该作者 5楼 发表于: 2011-12-04 | 石油求职招聘就上: 阿果石油英才网
神贴。。
离线sdzxxyhpl
发帖
242
财富
912
威望
0
交易币
0
只看该作者 6楼 发表于: 2011-12-05 | 石油求职招聘就上: 阿果石油英才网
真心不懂在说啥。。。
加油加油!!!
离线jiajialei816
发帖
50
财富
893
威望
0
交易币
0
只看该作者 7楼 发表于: 2011-12-08 | 石油求职招聘就上: 阿果石油英才网
利用上述粒子群算法c++类实现的地震波阻抗反演测试,效果图:
离线wh200500337
发帖
88
财富
240
威望
3
交易币
0
只看该作者 8楼 发表于: 2011-12-09 | 石油求职招聘就上: 阿果石油英才网
看懂没大家,反正我是看懂了,预测效果与实际效果一致性高,匹配好

网站事务咨询:QQ:1392013 | 26189883
阿果石油网为免费个人网站,为石油人提供免费的在线即时技术交流场所,拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论和行为!
如有言论或会员共享的资料涉及到您的权益,请立即通知网站管理员,本站将在第一时间给予配合处理,谢谢!