首页 > 解决方案 > 来自 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, ...)。

标签: pythonpython-3.xpandasconstraintsor-tools

解决方案


这样做,解决你的问题吗?

 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])

推荐阅读