如何解决如何使用 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])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。