Skip to content

自定义指标

在 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 # 当前评估次数
        }
    }
}

关键字段说明:

字段名类型说明用途
环境变化tstring环境发生变化的时刻,从"1"开始递增标识不同的环境状态
评估次数string算法运行的进度,如"1000", "2000"等记录算法运行的不同阶段
populationPopulation当前评估次数下的种群对象存储当前种群的所有信息
POFarrayPareto最优前沿,二维数组用于计算性能指标
POSarrayPareto最优解集,二维数组用于分析解的特征
settingsdict算法配置参数记录算法运行参数
boundlist决策变量的取值范围 [xl, xu]定义决策空间边界
tfloat当前环境变化时刻记录环境变化时间
evaluate_timesint当前评估次数记录算法运行进度

2.2 关键点说明

  1. 时间点处理:

    python
    time_points = sorted(map(int, runtime_populations.keys()))
    • 将时间点转换为整数并排序
    • 确保按时间顺序处理数据
  2. 环境数据获取:

    python
    last_env = list(populations.values())[-1]
    • 获取每个时间点的最后一个环境
    • 使用 list(populations.values())[-1] 获取最新环境
  3. 数据提取:

    python
    pof = np.array(last_env['POF'])
    pop_y = np.array([ind.F for ind in last_env['population']])
    • 将Pareto前沿转换为NumPy数组
    • 从种群中提取目标值
  4. 指标计算:

    python
    value = calculate_IGD(pop_y, pof)
    • 调用具体的指标计算方法
    • 确保处理边界情况
  5. 结果汇总:

    python
    return 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