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

如何在Pymoo中存储混合变量问题的全部最优决策变量

解决Pymoo混合变量模型导出全部决策变量的问题

在Pymoo的混合变量(MixedVariable)优化中,res.X返回的每个Pareto解是一个字典,键是你定义的变量组名称,值是该组下所有变量的数组(长度对应你定义变量时的size参数)。你觉得只能拿到单个值,大概率是没正确提取数组里的元素,或者对变量组的结构理解有误。

下面是具体的处理方法,结合代码示例说明:

1. 先明确变量组的结构

假设你的问题定义是这样的(对应多变量逻辑):

from pymoo.core.variable import Integer, Real
from pymoo.core.mixed import MixedVariableProblem

class MyMixedProblem(MixedVariableProblem):
    def __init__(self):
        # 定义变量组:y是3个整数变量,z是5个实数变量,w是2个整数变量
        variables = {
            "y": Integer(bounds=(0, 10), size=3),
            "z": Real(bounds=(0, 1), size=5),
            "w": Integer(bounds=(1, 5), size=2)
        }
        super().__init__(vars=variables, n_obj=2)
    
    def _evaluate(self, X, out, *args, **kwargs):
        # X是字典,每个键对应该组的变量数组
        y_vals = X["y"]  # 长度为3的数组
        z_vals = X["z"]  # 长度为5的数组
        w_vals = X["w"]  # 长度为2的数组
        # 目标函数计算逻辑...
        out["F"] = [sum(y_vals) + sum(z_vals), max(w_vals)]

优化完成后,res.X里的每个元素是类似这样的字典:

{"y": array([2, 5, 7]), "z": array([0.1, 0.3, 0.5, 0.7, 0.9]), "w": array([3,4])}

2. 提取所有决策变量的方法

方法1:展开成一维数组

如果需要把单个解的所有变量拼成一个一维数组:

import numpy as np

# 遍历所有Pareto解
for i, sol in enumerate(res.X):
    # 按变量组顺序拼接所有变量
    all_vars = np.concatenate([sol[key] for key in sol.keys()])
    print(f"第{i+1}个Pareto解的全部变量:{all_vars}")

方法2:拆分到单个变量

如果要把每个组的变量单独提取(比如y组的3个变量分别命名):

# 取第一个Pareto解
first_sol = res.X[0]
y1, y2, y3 = first_sol["y"]
z1, z2, z3, z4, z5 = first_sol["z"]
w1, w2 = first_sol["w"]

# 可以直接使用这些单个变量,或者存入列表
all_single_vars = [y1, y2, y3, z1, z2, z3, z4, z5, w1, w2]

方法3:保存为表格(CSV/Excel)

如果需要把所有Pareto解的变量整理成结构化表格,用Pandas更方便:

import pandas as pd

solutions_data = []
for sol in res.X:
    row = {}
    # 遍历每个变量组,拆分单个变量并命名
    for var_group, vals in sol.items():
        for idx, val in enumerate(vals, 1):
            row[f"{var_group}_{idx}"] = val
    solutions_data.append(row)

# 转成DataFrame
df = pd.DataFrame(solutions_data)
# 保存到CSV文件
df.to_csv("pareto_decisions.csv", index=False)

关键提醒

  • 定义变量组时,size参数一定要设对,比如你需要3个整数变量,就写Integer(..., size=3),否则默认是1个变量。
  • res.X里的字典值本身就是该组所有变量的集合,不是单个值,直接提取数组元素就能拿到每个变量的具体值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:32:47