如何在Python中自动生成指定维度的pulp.LpVariable并存储为嵌套字典
PuLP多维度线性规划变量自动生成函数
实现方案
针对动态生成多维度嵌套字典存储PuLP变量的需求,我们可以通过递归方式构建嵌套结构,自动生成符合命名规则的LpVariable实例。
基础实现代码
import pulp def generate_nested_variables(dimension_number, dimension_ranges): # 校验输入参数合法性 if len(dimension_ranges) != dimension_number: raise ValueError("维度范围列表长度必须与维度数量匹配") # 生成各维度的1-based索引序列 index_ranges = [list(range(1, r + 1)) for r in dimension_ranges] def build_nested(indices, remaining_dims): if not remaining_dims: # 拼接变量名并创建LpVariable(默认非负连续变量) var_name = f"x{''.join(map(str, indices))}" return pulp.LpVariable(var_name, lowBound=0) # 递归构建下一层字典 current_dim = remaining_dims[0] return { idx: build_nested(indices + [idx], remaining_dims[1:]) for idx in current_dim } return build_nested([], index_ranges)
代码说明
- 输入校验:确保维度范围列表的长度与指定维度数量一致,避免参数错误。
- 索引生成:将每个维度的范围转换为从1开始的索引序列(匹配示例中的
x11、x35命名规则)。 - 递归构建:通过内部递归函数逐层生成嵌套字典,当所有维度遍历完成时,拼接索引得到变量名并创建
LpVariable实例。
使用示例
# 生成二维变量(x11至x35) two_d_vars = generate_nested_variables(2, [3, 5]) print(two_d_vars[1][1]) # 输出: x11 print(two_d_vars[3][5]) # 输出: x35 # 生成四维变量(x1111至x2222) four_d_vars = generate_nested_variables(4, [2, 2, 2, 2]) print(four_d_vars[1][2][1][2]) # 输出: x1212
扩展版本(支持自定义变量参数)
如果需要指定变量的上下界、类型(如整数变量),可以扩展函数参数:
def generate_nested_variables(dimension_number, dimension_ranges, lowBound=None, upBound=None, cat='Continuous'): if len(dimension_ranges) != dimension_number: raise ValueError("维度范围列表长度必须与维度数量匹配") index_ranges = [list(range(1, r + 1)) for r in dimension_ranges] def build_nested(indices, remaining_dims): if not remaining_dims: var_name = f"x{''.join(map(str, indices))}" return pulp.LpVariable(var_name, lowBound=lowBound, upBound=upBound, cat=cat) current_dim = remaining_dims[0] return { idx: build_nested(indices + [idx], remaining_dims[1:]) for idx in current_dim } return build_nested([], index_ranges)
扩展版本使用示例
# 生成二维整数变量 int_vars = generate_nested_variables(2, [3, 5], cat='Integer') print(int_vars[2][3]) # 输出: x23(整数类型变量) # 生成有上界的连续变量 bounded_vars = generate_nested_variables(2, [2, 2], upBound=10) print(bounded_vars[1][2]) # 输出: x12(上界为10)
内容的提问来源于stack exchange,提问作者Ali E
相关产品推荐
相关产品推荐

