python - 来自 DataFrame 的 Google OR Tools 约束
问题描述
我想构建一个 Google OR Tools 模型以linear_solver
用于CBC_MIXED_INTEGER_PROGRAMMING
. 按照谷歌教程,我学会了构建约束,但我有一个问题......是否有必要手写每个约束?
我的意思是,我有以下 DataFrame df_constraint
,其中包含形式为 的约束系数ax+by<=c
。
+---+---+---+
| A | B | C |
+---+---+---+
| 1 | 5 | 7 |
| 2 | 9 | 3 |
| 3 | 0 | 4 |
+---+---+---+
该表可以翻译成以下约束
# 1x+5y<=7
constraint1 = solver.Constraint(-solver.infinity(), 7)
constraint1.SetCoefficient(x, 1)
constraint1.SetCoefficient(y, 5)
# 2x+9y<=3
constraint2 = solver.Constraint(-solver.infinity(), 3)
constraint2.SetCoefficient(x, 2)
constraint2.SetCoefficient(y, 9)
# 3x<=4
constraint3 = solver.Constraint(-solver.infinity(), 4)
constraint3.SetCoefficient(x, 3)
而不是写每一行我想要这样的东西:
for index, row in df.iterrows():
constraint = solver.Constraint(-solver.infinity(), row['C'])
constraint.SetCoefficient(x, row['A'])
constraint.SetCoefficient(y, row['B'])
我的代码段不起作用,因为每个约束都必须有不同的名称(如constraint1
, constraint2
, ...)。
解决方案
这样做,解决你的问题吗?
df_constraints = pd.DataFrame({
'A': pd.Series([1, 2, 3]),
'B': pd.Series([5, 9, 0]),
'C': pd.Series([7, 3, 4]),
})
for row in df_constraints.itertuples():
#print("row {}".format(row))
#print("A {}".format(row[0]))
#print("B {}".format(row[1]))
#print("C {}".format(row[2]))
constraint = solver.Constraint(-solver.infinity(), row[2])
constraint.SetCoefficient(x, row[0])
constraint.SetCoefficient(y, row[1])