如何在CPLEX Python API docplex中创建库存问题三维决策变量?
如何在Docplex中创建三维整数决策变量
嘿,刚上手Docplex的话,确实会发现官方的integer_var_matrix只支持二维,但创建三维变量其实有两种很顺手的方式,我给你一步步讲清楚:
方法一:嵌套列表推导式(适合习惯矩阵索引的场景)
如果还是想保留类似二维矩阵的嵌套结构,你可以用嵌套的列表推导式结合integer_var_list来生成第三维度。举个实际的例子:
from docplex.mp.model import Model # 先初始化模型 m = Model(name='inventory_problem') # 定义你的三个维度集合(这里用示例数据,你可以换成自己的集合) all_origins = ["O1", "O2"] # 下标i的集合 all_destinations = ["D1", "D2", "D3"] # 下标j的集合 all_time_periods = [1, 2, 3, 4] # 下标t的集合 # 创建三维变量x_ij^t:第一层是i,第二层是j,第三层是t x = [ [m.integer_var_list(all_time_periods, name=f"x_{i}_{j}_%s") for j in all_destinations] for i in all_origins ] # 调用变量示例:比如取i=O1、j=D1、t=2的变量 # 如果用索引访问:x[0][0][1](因为all_origins[0]是O1,all_time_periods[1]是2) # 或者按名称查找:m.get_var_by_name("x_O1_D1_2")
方法二:用字典存储(更推荐,直观不易出错)
如果你的维度集合是字符串或者非连续的数值,用字典来存储三维变量会更方便——直接用(i,j,t)元组作为键,访问起来一目了然:
from docplex.mp.model import Model m = Model(name='inventory_problem') all_origins = ["O1", "O2"] all_destinations = ["D1", "D2", "D3"] all_time_periods = [1, 2, 3, 4] # 生成所有(i,j,t)的组合作为变量的键 var_keys = [(i, j, t) for i in all_origins for j in all_destinations for t in all_time_periods] # 创建三维变量字典,每个键对应一个整数变量 x = m.integer_var_dict(var_keys, name="x") # 调用变量示例:直接用元组访问,比如x[("O1", "D1", 2)],完全不用记索引
额外小技巧
如果你的变量有上下界要求(比如库存变量不能为负),可以在创建时加上lb(下界)和ub(上界)参数,比如:
# 创建非负整数变量字典 x = m.integer_var_dict(var_keys, lb=0, name="x")
内容的提问来源于stack exchange,提问作者steph
相关产品推荐
相关产品推荐

