如何在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
相关产品推荐
相关产品推荐

