首页 > 解决方案 > 使用 Pulp 进行线性规划 - 约束分配

问题描述

我正在用 Pulp 库做一个线性编程模型。我有以下输入,它是一个数据框(df):

植物
Zone_1 Plant_1
Zone_1 Plant_2
Zone_1 Plant_3
Zone_2 Plant_4
Zone_2 Plant_5

有了这个输入,我必须编写约束,它们应该如下所示:

Plant_1 + Plant_2 + Plant_3 == Zone_1
Plant_4 + Plant_5 == Zone_2

我想在不为每个方程编写方程的情况下自动执行此操作。我正在做的是:定义 Zone 和 Plant 变量做:

list_zone = df['Zone'].unique().tolist()
zone_variables = [LpVariables(df[list_zone][i], lowBound = 0) for i in range(len(list_zone))]

list_Plant = df['Plant'].unique().tolist()
plant_variables = [LpVariables(df[list_Plant][i], lowBound = 0) for i in range(len(list_Plant))]

然后我想使用 lpSum oject 定义像上面这样的方程,但我不知道如何只对与每个区域关联的 Plant 变量求和。

我在想这样做:

for j in range(len(zone_variables)):
    model += lpSum(plant_variables[i] for i in range(len(plant_variables))]) == zone_variables[j]

但是使用该等式,我无法将植物变量分配给每个区域。

谁能帮我?问候

标签: pythonlinear-programmingpulp

解决方案


假设这些都是 Lpvariables,你可以使用 group by 来做类似的事情(检查语法)

df = pd.DataFrame(
    [
        ['zone_1', 'plant_1'],
        ['zone_1', 'plant_2'],
        ['zone_1', 'plant_3'],
        ['zone_2', 'plant_4'],
        ['zone_2', 'plant_5']        
    ],
    columns=['zone','plant']
)

df['plant_lpvar'] = df['plant'].apply(lambda x: LpVariable(x))

zone_lpvar = LpVariable.dict('zone_lpvar',df['zone'].unique())

groups = df.groupby('zone')
for zone, group in groups:
    model += lpSum(group['plant_lpvar']) == zone_lpvar[zone]

推荐阅读