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

三目标优化中Pareto最优解与支配解的识别及可视化求助

解决方案:从Excel数据识别Pareto最优点并3D可视化

核心逻辑

Pareto最优点(非支配点)的判定规则:若某个点不存在其他点在所有目标维度上都优于它(最小化场景下所有目标值更小,最大化则更大),且至少有一个维度严格更优,那么该点即为Pareto最优。

以下是适配Excel数据的完整Python代码,涵盖数据读取、Pareto筛选和3D可视化:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 1. 读取Excel数据(确保目标列名为z1、z2、z3)
df = pd.read_excel('你的数据文件.xlsx')
# 提取三目标数值数组
objectives = df[['z1', 'z2', 'z3']].values

# 2. 定义Pareto最优判断函数
def is_pareto_efficient(costs, minimize=True):
    costs = np.array(costs)
    is_efficient = np.ones(costs.shape[0], dtype=bool)
    for i, c in enumerate(costs):
        if is_efficient[i]:
            if minimize:
                # 最小化场景:筛选出所有维度<=当前点,且至少一个维度<当前点的点
                dominated = np.all(costs[is_efficient] <= c, axis=1) & np.any(costs[is_efficient] < c, axis=1)
            else:
                # 最大化场景:筛选出所有维度>=当前点,且至少一个维度>当前点的点
                dominated = np.all(costs[is_efficient] >= c, axis=1) & np.any(costs[is_efficient] > c, axis=1)
            # 标记被支配的点
            is_efficient[is_efficient] = ~dominated
    return is_efficient

# 3. 筛选Pareto最优点与支配点
pareto_mask = is_pareto_efficient(objectives, minimize=True)  # 根据优化方向调整minimize参数
pareto_points = objectives[pareto_mask]
dominated_points = objectives[~pareto_mask]

# 4. 3D可视化区分两类点
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制支配点(灰色低透明度,避免遮挡)
ax.scatter(dominated_points[:, 0], dominated_points[:, 1], dominated_points[:, 2], 
           color='gray', alpha=0.3, label='支配点')
# 绘制Pareto最优点(红色高亮)
ax.scatter(pareto_points[:, 0], pareto_points[:, 1], pareto_points[:, 2], 
           color='red', s=50, label='Pareto最优点')

ax.set_xlabel('z1')
ax.set_ylabel('z2')
ax.set_zlabel('z3')
ax.set_title('三目标优化Pareto前沿可视化')
ax.legend()
plt.show()

# 可选:将标记后的结果保存回Excel
df['is_pareto'] = pareto_mask
df.to_excel('带Pareto标记的数据.xlsx', index=False)

使用说明

  1. 依赖安装:先执行命令安装所需库:
    pip install pandas numpy matplotlib openpyxl
    
    (openpyxl用于读取xlsx格式文件)
  2. 数据适配:将代码中的你的数据文件.xlsx替换为实际文件路径,若Excel中目标列名不是z1/z2/z3,修改df[['z1', 'z2', 'z3']]中的列名即可。
  3. 优化方向调整:如果目标是最大化,调用is_pareto_efficient时传入minimize=False。
  4. GAMS pareto.py适配说明:GAMS提供的pareto.py多针对其专属输出格式(如.dat/.gms),上述代码直接读取Excel,更适配你的场景,无需额外修改。

细节提示

  • 针对6050行数据,当前逐点判断的逻辑计算效率足够,无需额外优化。
  • 可视化时支配点用灰色低透明度,可避免遮挡Pareto最优点,便于观察前沿形状。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:10:46