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

设计模式相当简单,下面是一个虚拟示例,它将列表中的所有IntVars 设置为相等:

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_ib_i == (F_i(X) = a) 的所有硬约束半具体化,并创建一个由b_is 加权的最小化目标,以便只有最小化约束? 让我回溯一下,你想用 Minimize/Maximize 表达什么?您是否将目标部分(model.Maximize 和 model.Minimize)与 Min/Max 约束(model.AddMinEquality、model.AddMaxEquality)混淆了? 不,我编辑了我的问题并添加了一个具体示例来说明我的目标,抱歉不清楚。 你需要复制API,一个返回约束,一个返回表达式。你最小化一个表达式,而不是一个约束。

以上是关于or-tools:将 BoundIntegerExpression 转换为 IntegerExpression的主要内容,如果未能解决你的问题,请参考以下文章

如何将需求率添加到 Or-Tools vrp

or-tools 基于工作量的员工调度

OR-Tools:有资源限制但没有解决方案的 VRPTW

OR-TOOLS - 如何解决有序分配问题?

使用 OR-tools 解决多参与者分配问题

OR-Tools:获取每一个最优解