-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathPSO.h
147 lines (115 loc) · 3.58 KB
/
PSO.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#pragma once
#include <stdlib.h>
#include <iostream>
#include <vector>
// 适应度是越大越好还是越小越好
//#define MINIMIZE_FITNESS
#define MAXIMIZE_FITNESS
struct PSOPara
{
int dim_; // 参数维度(position和velocity的维度)
int particle_num_; // 粒子个数
int max_iter_num_; // 最大迭代次数
double *dt_ = nullptr; // 时间步长
double *wstart_ = nullptr; // 初始权重
double *wend_ = nullptr; // 终止权重
double *C1_ = nullptr; // 加速度因子
double *C2_ = nullptr; // 加速度因子
double *upper_bound_ = nullptr; // position搜索范围上限
double *lower_bound_ = nullptr; // position搜索范围下限
double *range_interval_ = nullptr; // position搜索区间长度
int results_dim_ = 0; // results的维度
PSOPara(){}
PSOPara(int dim, bool hasBound = false)
{
dim_ = dim;
dt_ = new double[dim_];
wstart_ = new double[dim_];
wend_ = new double[dim_];
C1_ = new double[dim_];
C2_ = new double[dim_];
if (hasBound)
{
upper_bound_ = new double[dim_];
lower_bound_ = new double[dim_];
range_interval_ = new double[dim_];
}
}
// 析构函数:释放堆内存
~PSOPara()
{
if (upper_bound_) { delete[]upper_bound_; }
if (lower_bound_) { delete[]lower_bound_; }
if (range_interval_) { delete[]range_interval_; }
if (dt_) { delete[]dt_; }
if (wstart_) { delete[]wstart_; }
if (wend_) { delete[]wend_; }
if (C1_) { delete[]C1_; }
if (C2_) { delete[]C2_; }
}
};
struct Particle
{
int dim_; // 参数维度(position和velocity的维度)
double fitness_;
double *position_ = nullptr;
double *velocity_ = nullptr;
double *best_position_ = nullptr;
double best_fitness_;
double *results_ = nullptr; // 一些需要保存出的结果
int results_dim_ = 0; // results_的维度
Particle(){}
~Particle()
{
if (position_) { delete[]position_; }
if (velocity_) { delete[]velocity_; }
if (best_position_) { delete[]best_position_; }
if (results_) { delete[]results_; }
}
Particle(int dim, double *position, double *velocity, double *best_position, double best_fitness);
};
typedef double(*ComputeFitness)(Particle& particle);
class PSOOptimizer
{
public:
int particle_num_; // 粒子个数
int max_iter_num_; // 最大迭代次数
int curr_iter_; // 当前迭代次数
int dim_; // 参数维度(position和velocity的维度)
Particle *particles_ = nullptr; // 所有粒子
double *upper_bound_ = nullptr; // position搜索范围上限
double *lower_bound_ = nullptr; // position搜索范围下限
double *range_interval_ = nullptr; // position搜索区间长度
double *dt_ = nullptr; // 时间步长
double *wstart_ = nullptr; // 初始权重
double *wend_ = nullptr; // 终止权重
double *w_ = nullptr; // 当前迭代权重
double *C1_ = nullptr; // 加速度因子
double *C2_ = nullptr; // 加速度因子
double all_best_fitness_; // 全局最优粒子的适应度值
double *all_best_position_ = nullptr; // 全局最优粒子的poistion
double *results_ = nullptr; // 一些需要保存出的结果
int results_dim_ = 0; // results的维度
ComputeFitness fitness_fun_ = nullptr; // 适应度函数
public:
// 默认构造函数
PSOOptimizer() {}
// 构造函数
PSOOptimizer(PSOPara* pso_para, ComputeFitness fitness_fun);
// 析构函数
~PSOOptimizer();
// 初始化所有粒子参数
void InitialAllParticles();
// 初始化第i个粒子参数
void InitialParticle(int i);
// 获取双精度随机数(默认精度为0.0001)
double GetDoubleRand(int N = 9999);
// 计算该粒子的适应度值
double GetFitness(Particle& particle);
// 更新所有粒子参数
void UpdateAllParticles();
// 更新第i个粒子
void UpdateParticle(int i);
// 获取当前迭代的权重
void GetInertialWeight();
};