You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正Pandas中帕累托最优解筛选代码的漏判问题

问题分析与代码修正

常见错误原因

  • 预处理顺序错误:先计算帕累托最优再筛选Thermal Discomfort < 2,导致符合条件的记录被提前排除
  • 帕累托判断逻辑偏差:针对双目标最小化的场景,错误使用了最大化的判断逻辑,或者支配条件写反
  • 去重操作未精准针对Costs和Peak Load字段,重复记录干扰了帕累托最优的判定

修正后的完整代码

import pandas as pd

# 读取本地CSV文件(替换为你的文件路径)
df = pd.read_csv("your_data.csv")

# 第一步:先筛选符合Thermal Discomfort要求的记录,再去重(保留Costs和Peak Load唯一的条目)
filtered_df = df[df["Thermal Discomfort"] < 2].drop_duplicates(subset=["Costs", "Peak Load"], keep="first").reset_index(drop=True)

# 第二步:计算双目标(Costs、Peak Load最小化)的帕累托最优解
pareto_mask = []
total_rows = len(filtered_df)

for idx in range(total_rows):
    current_cost = filtered_df.loc[idx, "Costs"]
    current_peak = filtered_df.loc[idx, "Peak Load"]
    
    # 判断当前记录是否被其他记录支配:其他记录同时满足Costs≤当前值、Peak Load≤当前值,且至少一个目标严格更小
    is_dominated = any(
        (filtered_df.loc[j, "Costs"] <= current_cost) &
        (filtered_df.loc[j, "Peak Load"] <= current_peak) &
        ((filtered_df.loc[j, "Costs"] < current_cost) | (filtered_df.loc[j, "Peak Load"] < current_peak))
        for j in range(total_rows) if j != idx
    )
    
    # 不被支配的记录即为帕累托最优
    pareto_mask.append(not is_dominated)

pareto_df = filtered_df[pareto_mask].reset_index(drop=True)

# 输出结果
print(pareto_df)

代码说明

  1. 预处理优化:先过滤Thermal Discomfort < 2的记录,再对Costs和Peak Load去重,减少无效计算量
  2. 精准帕累托判断:针对双目标最小化场景,严格判定「无其他记录在两个目标上都不劣于当前记录,且至少一个目标更优」,确保符合帕累托最优的定义
  3. 测试数据适配:对于id为7、8的记录,经过预处理后会被保留,最终会被判定为帕累托最优解并输出

内容的提问来源于stack exchange,提问作者PeterBe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:17:10