自定义指标
在 FlexDMO 平台中,您可以通过自定义指标来评估和展示算法的性能。本文档将详细介绍如何实现自定义指标,以及如何在平台中使用它们。
1. 找到指标文件metric.py并创建方法
在 FlexDMO 平台中,所有的指标实现都位于 utils/metrics.py 文件中。要创建新的指标,您需要在这个文件中添加新的方法,下面我以计算MIGD指标为例,简短介绍一下如何利用runtime_populations计算所需要的指标。
2. MIGD代码示例
每个指标方法都应该遵循以下基本结构:
python
def calculate_MIGD(runtime_populations):
"""计算平均反向世代距离(MIGD)
Args:
runtime_populations: 运行时种群数据
Returns:
float: MIGD值
"""
time_points = sorted(map(int, runtime_populations.keys()))
time_metric_values = []
for time in time_points:
populations = runtime_populations[time]
last_env = list(populations.values())[-1]
if 'POF' not in last_env or 'population' not in last_env:
continue
pof = np.array(last_env['POF'])
pop_y = np.array([ind.F for ind in last_env['population']])
value = calculate_IGD(pop_y, pof)
time_metric_values.append(value)
return np.mean(time_metric_values) if time_metric_values else 0.0在进行介绍如何实现指标计算前,本文先介绍一下他的输入参数runtime_populations:
2.1 runtime_populations 数据结构
runtime_populations 是一个嵌套字典结构,用于存储算法运行过程中各个环境变化和评估次数的状态数据。其结构如下:
python
runtime_populations = {
"环境变化t": { # 例如:"1", "2" 等,表示环境变化的时刻
"评估次数": { # 例如:"1000", "2000" 等,表示算法运行的评估次数
"population": population, # 种群对象
"POF": [ # Pareto最优前沿
[f1, f2], # 第一个点的目标值
[f1, f2], # 第二个点的目标值
...
],
"POS": [ # Pareto最优解集
[x1, x2, ...], # 第一个点的决策变量
[x1, x2, ...], # 第二个点的决策变量
...
],
"settings": { # 算法设置参数
"param1": value1,
"param2": value2,
...
},
"bound": [ # 决策变量边界
xl, # 下界
xu # 上界
],
"t": float, # 当前环境变化时刻
"evaluate_times": int # 当前评估次数
}
}
}关键字段说明:
| 字段名 | 类型 | 说明 | 用途 |
|---|---|---|---|
| 环境变化t | string | 环境发生变化的时刻,从"1"开始递增 | 标识不同的环境状态 |
| 评估次数 | string | 算法运行的进度,如"1000", "2000"等 | 记录算法运行的不同阶段 |
| population | Population | 当前评估次数下的种群对象 | 存储当前种群的所有信息 |
| POF | array | Pareto最优前沿,二维数组 | 用于计算性能指标 |
| POS | array | Pareto最优解集,二维数组 | 用于分析解的特征 |
| settings | dict | 算法配置参数 | 记录算法运行参数 |
| bound | list | 决策变量的取值范围 [xl, xu] | 定义决策空间边界 |
| t | float | 当前环境变化时刻 | 记录环境变化时间 |
| evaluate_times | int | 当前评估次数 | 记录算法运行进度 |
2.2 关键点说明
时间点处理:
pythontime_points = sorted(map(int, runtime_populations.keys()))- 将时间点转换为整数并排序
- 确保按时间顺序处理数据
环境数据获取:
pythonlast_env = list(populations.values())[-1]- 获取每个时间点的最后一个环境
- 使用
list(populations.values())[-1]获取最新环境
数据提取:
pythonpof = np.array(last_env['POF']) pop_y = np.array([ind.F for ind in last_env['population']])- 将Pareto前沿转换为NumPy数组
- 从种群中提取目标值
指标计算:
pythonvalue = calculate_IGD(pop_y, pof)- 调用具体的指标计算方法
- 确保处理边界情况
结果汇总:
pythonreturn np.mean(time_metric_values) if time_metric_values else 0.0- 计算所有时间点的平均值
- 处理空数据的情况
提示
- 确保正确处理runtime_populations的数据结构
3. 如何实现自定义指标
要实现自定义指标,可以直接复制以下代码进行自定义:
python
def calculate_your_metric(runtime_populations):
"""计算您的指标
Args:
runtime_populations: 运行时种群数据
Returns:
float: 指标值
"""
# 实现您的指标计算逻辑
pass