遍历PuLP嵌套变量以了解特定约束

问题描述

我有以下约束:

sum of (between p = 0 to p = 2) of X_sap <= A_sa

我的课程是:

# s
site_classes = [1,2]
# a
age_classes = [1,2,3]
# p
period_classes = [0,1,2]

age_areas = {1: {'age_range': '0to10',1: 3000,2: 8000},2: {'age_range': '11to20',1: 6000,2: 4000},3: {'age_range': '21to30',1: 9000,2: 7000}}

我的汁液定义如下:

sap = []
for s in site_classes:
    for a in age_classes:
        for p in period_classes:
            sap.append(f'{s}_{a}_{p}')

这是我创建X_sap的方法:

x_vars = lp.LpVariable.dicts("X",sap,lowBound=0,cat='Continuous')

这是我创建区域约束的方式

area_c_dict = {}
for s in site_classes:
    for a in age_classes:
        for p in period_classes:
            area_c_dict[f'{s}_{a}_{p}'] = age_areas[a][s]

我正在努力以这种方式生成约束以输出

X110 + X111 + X112 <= 3,000
X120 + X121 + X122 <= 6,000
X130 + X131 + X132 <= 9,000
X210 + X211 + X212 <= 8,000
X220 + X221 + X222 <= 4,000
X230 + X231 + X232 <= 7,000

我输出的变量是

area_c_dict = {'1_1_0': 3000,'1_1_1': 3000,'1_1_2': 3000,'1_2_0': 6000,'1_2_1': 6000,'1_2_2': 6000,'1_3_0': 9000,'1_3_1': 9000,'1_3_2': 9000,'2_1_0': 8000,'2_1_1': 8000,'2_1_2': 8000,'2_2_0': 4000,'2_2_1': 4000,'2_2_2': 4000,'2_3_0': 7000,'2_3_1': 7000,'2_3_2': 7000}


x_vars = {'1_1_0': X_1_1_0,'1_1_1': X_1_1_1,'1_1_2': X_1_1_2,'1_2_0': X_1_2_0,'1_2_1': X_1_2_1,'1_2_2': X_1_2_2,'1_3_0': X_1_3_0,'1_3_1': X_1_3_1,'1_3_2': X_1_3_2,'2_1_0': X_2_1_0,'2_1_1': X_2_1_1,'2_1_2': X_2_1_2,'2_2_0': X_2_2_0,'2_2_1': X_2_2_1,'2_2_2': X_2_2_2,'2_3_0': X_2_3_0,'2_3_1': X_2_3_1,'2_3_2': X_2_3_2}

对于我如何实现这一目标,我们将不胜感激。我不确定如何遍历我的x_vars而不破坏它

解决方法

首先,创建您的决策变量,如下所示:

x_vars = lp.LpVariable.dicts("X",[(s,a,p) for s in site_classes for a in age_classes for p in period_classes],lowBound=0,cat='Continuous')

然后使用纸浆库中的lpSum函数进行约束:

for s in site_classes:
    for a in age_classes:
        prob += lp.lpSum(x_vars[(s,p)] for p in period_classes) <= age_areas[a][s]

prob变量是LpProblem类的实例


关于如何为其他约束中使用的变量之和定义决策变量的演示

定义一个自由变量

sum_var = lp.LpVariable.dicts("sum_of_variables",a) for s in site_classes for a in age_classes],cat='Continuous')

现在将定义添加到您的自由变量中。

for s in site_classes:
    for a in age_classes:
        prob += lp.lpSum(x_vars[(s,p)] for p in period_classes) == sum_var[(s,a)] 

现在您可以在约束中使用您的自由变量

for s in site_classes:
    for a in age_classes:
        prob += sum_var[(s,a)] <= age_areas[a][s]

这种方法可以提高线性程序的可读性,并且可以更轻松地为模型添加复杂性

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...