我正在 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。
如有任何帮助,我们将不胜感激。
无法重现您的问题。 (见下文。)
我的第一个建议是将数据移出
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