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

