or-tools:将 BoundIntegerExpression 转换为 IntegerExpression
Posted
技术标签:
【中文标题】or-tools:将 BoundIntegerExpression 转换为 IntegerExpression【英文标题】:or-tools: Convert a BoundIntegerExpression to an IntegerExpression 【发布时间】:2019-04-12 10:18:45 【问题描述】:我使用的是Google.OrTools
7.0 版。
我已经构建了一个小接口,以便为CpModel
添加约束:
public interface ISatConstraintWrapper
IEnumerable<BoundIntegerExpression> GenerateConstraints();
void BindToModel(CpModel model);
设计模式相当简单,下面是一个虚拟示例,它将列表中的所有IntVar
s 设置为相等:
class MakeAllVarsEqual : ISatConstraintWrapper
public MakeAllVarsEqual(List<IntVar> vars)
_vars = vars;
public IEnumerable<BoundIntegerExpression> GenerateConstraints()
for (var i = 0; i < _vars.Count - 1; i++)
yield return _vars[i] == _vars[i+1];
public void BindToModel(CpModel model)
foreach (var constraint in GenerateConstraints())
model.Add(constraint);
private readonly List<IntVar> _vars;
接下来,我想使用我的ISatConstraintWrapper
,但用于最小化/最大化约束。
这是我打算做的一个例子:
class MinimizeIntExpression : ISatConstraintWrapper
public MinimizeIntExpression(List<IntVar> vars, List<int> coeffs)
_vars = vars;
_coeffs = coeffs;
public IEnumerable<BoundIntegerExpression> GenerateConstraints()
for (var i = 0; i < _vars.Count; i++)
yield return _vars[i]*_coeffs[i];
public void BindToModel(CpModel model)
model.Minimize(new SumArray(GenerateConstraints()));
private readonly List<IntVar> _vars;
private readonly List<int> _coeffs;
但我不能,因为 _vars[i]*_coeffs[i]
返回 IntegerExpression
而不是 BoundIntegerExpression
。
但是,即使后者代表域中的 IntegerExpression
,这两个类似乎也不相关,我没有找到将 BoundIntegerExpression
向下转换为 IntegerExpression
的方法。
当然,我可以制作两个不同的接口,但它不会那么方便,例如,如果我想将我的约束包装器存储在一个列表中。
是否可以将BoundIntegerExpression
转换为IntegerExpression
?如果没有,我该如何修改我的包装器来处理这两种类型的约束?
【问题讨论】:
【参考方案1】:你不能。
我建议你阅读:
https://github.com/google/or-tools/blob/stable/ortools/sat/doc/channeling.md
【讨论】:
我不确定通灵对我有什么帮助。您是否建议将我从F_i(X) = a_i
到b_i == (F_i(X) = a)
的所有硬约束半具体化,并创建一个由b_i
s 加权的最小化目标,以便只有最小化约束?
让我回溯一下,你想用 Minimize/Maximize 表达什么?您是否将目标部分(model.Maximize 和 model.Minimize)与 Min/Max 约束(model.AddMinEquality、model.AddMaxEquality)混淆了?
不,我编辑了我的问题并添加了一个具体示例来说明我的目标,抱歉不清楚。
你需要复制API,一个返回约束,一个返回表达式。你最小化一个表达式,而不是一个约束。以上是关于or-tools:将 BoundIntegerExpression 转换为 IntegerExpression的主要内容,如果未能解决你的问题,请参考以下文章