test_pso.cpp
Go to the documentation of this file.
1 /*
2  * reference http://www.cnblogs.com/lyrichu/p/6151272.html
3  * by lyrichu
4  * 2016-12-09
5  */
6 #include<stdio.h>
7 #include<stdlib.h>
8 #include<math.h>
9 #include<time.h>
10 #include<unistd.h>
11 #define c1 1.49445 //加速度因子一般是根据大量实验所得
12 #define c2 1.49445
13 #define maxgen 1001 // 迭代次数
14 #define sizepop 20 // 种群规模
15 #define popmax 5.12 // 个体最大取值
16 #define popmin -5.12 // 个体最小取值
17 #define Vmax 1 // 速度最大值
18 #define Vmin -1 //速度最小值
19 #define dim 2 // 粒子的维数
20 #define PI 3.1415926 //圆周率
21 
22 double pop[sizepop][dim]; // 定义种群数组
23 double V[sizepop][dim]; // 定义种群速度数组
24 double fitness[sizepop]; // 定义种群的适应度数组
25 double result[maxgen]; //定义存放每次迭代种群最优值的数组
26 double pbest[sizepop][dim]; // 个体极值的位置
27 double gbest[dim]; //群体极值的位置
28 double fitnesspbest[sizepop]; //个体极值适应度的值
29 double fitnessgbest; // 群体极值适应度值
30 double genbest[maxgen][dim]; //每一代最优值取值粒子
31 
32 //适应度函数
33 double func(double * arr)
34 {
35  double x = *arr; //x 的值
36  double y = *(arr+1); //y的值
37  double fitness = -(20+x*x+y*y-10*cos(2*PI*x)-10*cos(2*PI*y));
38  return fitness;
39 
40 }
41 // 种群初始化
42 void pop_init(void)
43 {
44  for(int i=0;i<sizepop;i++)
45  {
46  for(int j=0;j<dim;j++)
47  {
48  pop[i][j] = (((double)rand())/RAND_MAX-0.5)*4; //-2到2之间的随机数
49  V[i][j] = ((double)rand())/RAND_MAX-0.5; //-0.5到0.5之间
50  }
51  fitness[i] = func(pop[i]); //计算适应度函数值
52  }
53 }
54 // max()函数定义
55 double * max(double * fit,int size)
56 {
57  int index = 0; // 初始化序号
58  double max = *fit; // 初始化最大值为数组第一个元素
59  static double best_fit_index[2];
60  for(int i=1;i<size;i++)
61  {
62  if(*(fit+i) > max)
63  max = *(fit+i);
64  index = i;
65  }
66  best_fit_index[0] = index;
67  best_fit_index[1] = max;
68  return best_fit_index;
69 
70 }
71 // 迭代寻优
72 void PSO_func(void)
73 {
74  pop_init();
75  double * best_fit_index; // 用于存放群体极值和其位置(序号)
76  best_fit_index = max(fitness,sizepop); //求群体极值
77  int index = (int)(*best_fit_index);
78  // 群体极值位置
79  for(int i=0;i<dim;i++)
80  {
81  gbest[i] = pop[index][i];
82  }
83  // 个体极值位置
84  for(int i=0;i<sizepop;i++)
85  {
86  for(int j=0;j<dim;j++)
87  {
88  pbest[i][j] = pop[i][j];
89  }
90  }
91  // 个体极值适应度值
92  for(int i=0;i<sizepop;i++)
93  {
94  fitnesspbest[i] = fitness[i];
95  }
96  //群体极值适应度值
97  double bestfitness = *(best_fit_index+1);
98  fitnessgbest = bestfitness;
99 
100  //迭代寻优
101  for(int i=0;i<maxgen;i++)
102  {
103  for(int j=0;j<sizepop;j++)
104  {
105  //速度更新及粒子更新
106  for(int k=0;k<dim;k++)
107  {
108  // 速度更新
109  double rand1 = (double)rand()/RAND_MAX; //0到1之间的随机数
110  double rand2 = (double)rand()/RAND_MAX;
111  V[j][k] = V[j][k] + c1*rand1*(pbest[j][k]-pop[j][k]) + c2*rand2*(gbest[k]-pop[j][k]);
112  if(V[j][k] > Vmax)
113  V[j][k] = Vmax;
114  if(V[j][k] < Vmin)
115  V[j][k] = Vmin;
116  // 粒子更新
117  pop[j][k] = pop[j][k] + V[j][k];
118  if(pop[j][k] > popmax)
119  pop[j][k] = popmax;
120  if(pop[j][k] < popmin)
121  pop[j][k] = popmin;
122  }
123  fitness[j] = func(pop[j]); //新粒子的适应度值
124  //printf(cur pos(%lf,%lf).\n",fitness[j],genbest[best_gen_number][0],genbest[best_gen_number][1]);
125  if(j == 0) {
126  printf("%d %lf\n", i, fitnessgbest);
127  }
128  }
129  for(int j=0;j<sizepop;j++)
130  {
131  // 个体极值更新
132  if(fitness[j] > fitnesspbest[j])
133  {
134  for(int k=0;k<dim;k++)
135  {
136  pbest[j][k] = pop[j][k];
137  }
138  fitnesspbest[j] = fitness[j];
139  }
140  // 群体极值更新
141  if(fitness[j] > fitnessgbest)
142  {
143  for(int k=0;k<dim;k++)
144  gbest[k] = pop[j][k];
145  fitnessgbest = fitness[j];
146  }
147  }
148  for(int k=0;k<dim;k++)
149  {
150  genbest[i][k] = gbest[k]; // 每一代最优值取值粒子位置记录
151  }
152  result[i] = fitnessgbest; // 每代的最优值记录到数组
153  //sleep(1);
154  }
155 }
156 
157 // 主函数
158 int main(void)
159 {
160  clock_t start,finish; //程序开始和结束时间
161  start = clock(); //开始计时
162  srand((unsigned)time(NULL)); // 初始化随机数种子
163  PSO_func();
164  double * best_arr;
165  best_arr = max(result,maxgen);
166  int best_gen_number = *best_arr; // 最优值所处的代数
167  double best = *(best_arr+1); //最优值
168  printf("迭代了%d次,在第%d次取到最优值,最优值为:%lf.\n",maxgen,best_gen_number+1,best);
169  printf("取到最优值的位置为(%lf,%lf).\n",genbest[best_gen_number][0],genbest[best_gen_number][1]);
170  finish = clock(); //结束时间
171  double duration = (double)(finish - start)/CLOCKS_PER_SEC; // 程序运行时间
172  printf("程序运行耗时:%lf\n",duration);
173  return 0;
174 }
double gbest[dim]
Definition: test_pso.cpp:27
#define c2
Definition: test_pso.cpp:12
ROSCPP_DECL void start()
double genbest[maxgen][dim]
Definition: test_pso.cpp:30
#define dim
Definition: test_pso.cpp:19
#define popmax
Definition: test_pso.cpp:15
#define maxgen
Definition: test_pso.cpp:13
int main(void)
Definition: test_pso.cpp:158
double fitnessgbest
Definition: test_pso.cpp:29
#define popmin
Definition: test_pso.cpp:16
double fitness[sizepop]
Definition: test_pso.cpp:24
double result[maxgen]
Definition: test_pso.cpp:25
#define Vmin
Definition: test_pso.cpp:18
void pop_init(void)
Definition: test_pso.cpp:42
double pbest[sizepop][dim]
Definition: test_pso.cpp:26
#define Vmax
Definition: test_pso.cpp:17
double func(double *arr)
Definition: test_pso.cpp:33
double * max(double *fit, int size)
Definition: test_pso.cpp:55
#define sizepop
Definition: test_pso.cpp:14
double pop[sizepop][dim]
Definition: test_pso.cpp:22
#define c1
Definition: test_pso.cpp:11
double V[sizepop][dim]
Definition: test_pso.cpp:23
#define PI
Definition: test_pso.cpp:20
double fitnesspbest[sizepop]
Definition: test_pso.cpp:28
void PSO_func(void)
Definition: test_pso.cpp:72


test_statistic
Author(s):
autogenerated on Mon Jun 10 2019 14:02:29