本项目提供了SPEA2(Strength Pareto Evolutionary Algorithm 2)算法的C++实现版本。该算法是多目标优化问题中的经典解决方案之一。
个体类声明如下:
```cpp
class individual {
public:
double value[Dimension]; // 每一维 xi 的值
int sp[2 * popsize]; // 支配 i 的集合
int np; // 个体 i 支配的数量
int is_dominated; // 集合 sp 的个数
int rank; // 优先级,Pareto 级别为当前最高级
double fitness; // 个体适应度值
void init(); // 初始化个体
double fvalue[2]; // ZDT1 问题目标函数的值
void f_count(); // 计算 fvalue 的值
};
```
群体类声明如下:
```cpp
class population {
public:
population(); // 类初始化
individual P[popsize];
individual Q[popsize];
individual R[2 * popsize];
void set_p_q(); // 随机产生一个初始父代P,在此基础上采用二元锦标赛选择、交叉和变异操作产生子代Q。P 和 Q 群体规模均为 popsize
// 将 Pt 和 Qt 并入到 Rt 中(初始时 t=0),对 Rt 进行快速非支配解排序,构造其所有不同等级的非支配解集 F1、F2.....
int Rnum; // P, Q, R 中元素的数量
int Pnum;
int Qnum;
void calc_fitness(); // 计算 P 和 Q 群体的适应度
void Q_make_new_pop();
void f_sort(int i); // 对拥挤距快速非支配排序法:重点!!!
// 在这里实现对群体 R 进行快速非支配解排序,构造等级集 F1, F2...
int Q_choice(int a,int b); // 两个个体属于不同等级的非支配解集时优先考虑等级序号较小的
// 若两个个体属于同一等级,则选择拥挤距离较大的
void maincal(); // 主要操作
void choose_best();
void archive_truncation_procedure();
int min_distance(); // 计算最小距离,辅助函数
};
```