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

如何在PULP中创建便于分类求和的三维LpVariable矩阵?

在PULP中构建结构化LpVariable嵌套列表的最优方法

需求回顾

需要创建符合以下规则的LpVariable嵌套结构:

  • 外层列表元素对应单个type
  • 内层为subcat×number维度的变量集合,每个type/subcat固定对应2个number(1和2)

示例目标结构(变量名示意):

vars = [["1A1", "1A2", "1B1", "1B2"],
        ["2A1", "2A2"]]

你之前的循环写法会生成分散的变量,无法直接按维度聚合操作,以下是最优实现方案:

实现方案

前提准备

先整理好type与对应subcat的映射关系(如果不同type对应不同subcat),比如:

# 示例映射:键为type标识,值为该type下的subcat列表
type_subcats = {
    '1': ['A', 'B'],
    '2': ['A']
}

方法1:嵌套循环构建结构化列表

这种方式逻辑清晰,便于调试和扩展:

from pulp import LpVariable

vars_structured = []

for type_id in type_subcats:
    type_vars = []
    for subcat in type_subcats[type_id]:
        # 为当前type/subcat创建两个number对应的变量
        var1 = LpVariable(f"{type_id}{subcat}1", cat='Binary')
        var2 = LpVariable(f"{type_id}{subcat}2", cat='Binary')
        type_vars.extend([var1, var2])
    vars_structured.append(type_vars)

方法2:列表推导式简化写法

如果逻辑确定,可使用更简洁的嵌套列表推导:

vars_structured = [
    [
        LpVariable(f"{t}{s}{n}", cat='Binary')
        for s in type_subcats[t]
        for n in [1, 2]
    ]
    for t in type_subcats
]

便捷的聚合操作示例

有了结构化列表后,按维度求和非常方便:

  • 对整个type的所有变量求和:sum(vars_structured[0])(对应示例中的type1)
  • 对type下特定subcat的两个变量求和:比如type1的subcat A,取sum(vars_structured[0][0:2]);subcat B取sum(vars_structured[0][2:4])

如果需要更灵活的索引(比如通过type/subcat/number直接定位变量),可以同时维护一个字典映射:

var_map = {}
for t in type_subcats:
    for s in type_subcats[t]:
        for n in [1, 2]:
            var = LpVariable(f"{t}{s}{n}", cat='Binary')
            var_map[(t, s, n)] = var

# 求和示例:type1下subcat A的两个变量
sum(var_map[('1', 'A', n)] for n in [1,2])

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:05:23