c# - or-tools:将 BoundIntegerExpression 转换为 IntegerExpression
问题描述
我使用的是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
but 来最小化/最大化约束。
这是我打算做的一个例子:
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转换为BoundIntegerExpression
a IntegerExpression
?如果不是,我该如何修改我的包装器来处理这两种类型的约束?
解决方案
推荐阅读
- python - 高波动数据优化与预测
- flutter - 无法使用 GetX 显示下拉菜单按钮值
- azure - Quarkus:MDC 未在 Azure Application Insights 中公开
- python - 在 Python 中生成密码的安全问题?
- .net - “IConfigurationSection”不包含“Get”的定义,也没有可访问的扩展
- notifications - 在 Microsoft Teams 聊天中添加自定义通知或消息
- python - pandas:如何将列表存储在 excel 的 sqlite 数据库中
- django - 如何在 Django 中接受和拒绝订单
- sql - 如何同时使用内连接和左外连接?
- angular - 私有标识符仅在面向 ECMAScript 2015 及更高版本(Angular 9)时可用