如何使用 OR-Tools for python

问题描述

我试图描述一个 MIP,目标是 f(r)=sum of (max(0,U(m,r)-SC(m,r))) for m in set M。约束是对于集合 M 中的 m,对于集合 R,r)

CMR = [[6,40,5,20],[2,10,1,5 ]] 
PR  = [[2,10],[3,2]]
model=cp_model.CpModel()
Map = {}
for m in range(num_machine):
   for p in range(num_process):
       Map[m,p] = model.NewBoolVar('Map')
for m in range(num_machine):
   for r in range(num_resource):
       for p in range(num_process):
           model.Add( sum([Map[m,p] * PR[p][r] for p in range(num_process)]) <= CMR[m][r])
           model.Add( sum([Map[m,p] for p in range(num_process) ]) == 1)
f,f1=[],[]
for r in range(num_resource):
    t=[]
    for m in range(num_machine):
        t.append(sum([Map[m,p] * PR[p][r] for p in range(num_process)])  - CMR[m][r+num_resource])
    f.append(t)
f1=[sum(u) for u in f]
objective_terms = []
for r in range(num_resource):
    objective_terms.append(f1[r]*w1[r])
model.Minimize(sum(objective_terms))
solver = cp_model.cpsolver()

我现在能得到的 obj 是 U(m,r) ,但我真正想要的是 (max(0,r))) ,如果我将 t.append 更改为" t1.append(max(0,(sum([Map[m,p] * PR[p][r] for p in range(num_process)]) - CMR[m][ r + num_resource])))" 我会得到错误:NotImplementedError:不支持将 BoundedLinearExpr 评估为布尔值。 任何熟悉 or-tools 的人都可以帮助修复目标设置中的 (max(0,a value))。

非常感谢

解决方法

您必须为 delta 创建一个新变量 U(m,r)-SC(m,r)(只需使用 model.Add),并为目标中的术语创建另一个变量,我们称之为 excess,然后您只需要使用 AddMaxEquality(excess,[delta,0]) 来设置它的值。

代码类似于此example

model.Add(delta == soft_min - sum_var)
excess = model.NewIntVar(0,7,prefix + ': under_sum')
model.AddMaxEquality(excess,0])