首页 > 解决方案 > or-tools:将 BoundIntegerExpression 转换为 IntegerExpression

问题描述

我使用的是Google.OrTools7.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;
}

接下来,我想使用我的ISatConstraintWrapperbut 来最小化/最大化约束。

这是我打算做的一个例子:

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]返回 anIntegerExpression但不是 a BoundIntegerExpression

但是,即使后者代表IntegerExpression域中的 a ,这两个类似乎也不相关,我没有找到将 a 向下转换为 aBoundIntegerExpression的方法IntegerExpression

当然,我可以制作两个不同的接口,但它不会那么方便,例如,如果我想将我的约束包装器存储在一个列表中。


是否可以将a转换为BoundIntegerExpressiona IntegerExpression?如果不是,我该如何修改我的包装器来处理这两种类型的约束?

标签: c#or-toolssat

解决方案



推荐阅读