Python Pulp:在 For 循环中添加约束时出现意外结果

问题描述 投票:0回答:1

我正在 Python 3.11.1 中使用 Pulp 指定线性优化问题。当我尝试在 for 循环中向 Lp 问题添加许多约束时,遇到了意外的结果,但是,我没有收到任何错误消息。

情况如下:我有一个数值(下面的变量 Freq)和 Lp 变量名称(Pos1 和 Pos2)存储在名为 df15 的 Pandas 数据框中,如下所示:

ID                Pos1            Pos2           Freq
28904502    id28904502_PosA                       1
28904503    id28904503_PosB                       2
28904521    id28904521_PosA    id28904521_PosB    1
28904596    id28904596_PosC                       1

Lp 变量之前已指定。他们目前在Lp问题中的状态(后面代码中称为model1)是:

VARIABLES
0 <= id28904502_PosA <= 1 Integer
0 <= id28904503_PosB <= 1 Integer
0 <= id28904521_PosA <= 1 Integer
0 <= id28904521_PosB <= 1 Integer
0 <= id28904596_PosC <= 1 Integer

我需要一般性的约束:

constraint_name: Freq + Pos1 + Pos2 <= maxPer

其中变量 maxPer 是在 df15 之外指定的。

此外,如果 Pos2 为空,则约束应简化为:

constraint_name: Freq + Pos1 <= maxPer

因此,对于 df15 中的 4 个示例行,我需要的约束为:

limit_ID_28904502: 1 + id28904502_PosA <= 2

limit_ID_28904503: 2 + id28904503_PosB <= 2

limit_ID_28904521: 1 + id28904521_PosA + id28904521_PosB <= 2

limit_ID_28904596: 1 + id28904596_PosC <= 2

我的代码是:

maxPer = 2

for n in range(0,df15.shape[0]):
    model1.addConstraint(name=f'limit_ID_{df15.iloc[n,0]}', constraint=lpSum([df15.iloc[n, 3], df15.iloc[n,1], df15.iloc[n, 2]]) <= maxPer)

但是,这就是我得到的:

limit_ID_28904502: id28904502_PosA <= 0

limit_ID_28904503: id28904503_PosB <= 0

limit_ID_28904521: id28904521_PosA + id28904521_PosB <= 0

limit_ID_28904596: id28904596_PosC <= 0

df15.iloc[n, 3] 应该引用 df15 中 Freq 变量的第 n 个值,但它根本没有显示。

maxPer 未解析为所需的值 2。

如有任何帮助,我们将不胜感激。

python optimization linear-programming pulp
1个回答
0
投票

无法重现您的问题。 (见下文。)

我的第一个建议是将数据移出

pandas
,并在使用
pulp
时使用基本的Python类型。它通常更容易,更不容易出错,而且您不需要
pandas
的花里胡哨。

import pandas as pd
import pulp

p1 = pulp.LpVariable('p1')
p2 = pulp.LpVariable('p2')
p3 = pulp.LpVariable('p3')

data = {'ID': [22,45],
        'Pos1': [p1, p2],
        'Pos2': [p3, None],
        'Freq': [2, 1]}

df = pd.DataFrame.from_records(data)[['ID', 'Pos1', 'Pos2', 'Freq']]
print(df)

for i in range(df.shape[0]):
    expr = pulp.lpSum([df.iloc[i, 1], df.iloc[i, 2], df.iloc[i, 3]] )

    print(expr)

输出:

   ID Pos1  Pos2  Freq
0  22   p1    p3     2
1  45   p2  None     1

p1 + p3 + 2
p2 + 1
© www.soinside.com 2019 - 2024. All rights reserved.