【问题标题】:At least one Var equals to X within a Var array using Choco Solver使用 Choco Solver 在 Var 数组中至少有一个 Var 等于 X
【发布时间】:2023-04-07 14:36:01
【问题描述】:

我正在使用 Choco Solver 并给定一个 int var 数组,我想要一个约束来检查数组中的至少一个 var 是否等于静态值...

类似于IntConstraintFactory#count 但带有以下文档:

/**
 * Let N be the number of variables of the VARIABLES collection assigned to value VALUE;
 * Enforce condition N >= LIMIT to hold.
 * <p>
 *
 * @param VALUE an int
 * @param VARS  a vector of variables
 * @param LIMIT a variable
 */
public static Constraint at_least(int VALUE, IntVar[] VARS, IntVar LIMIT) {
    return new Constraint("At least", /* help here ? */);
}

有人知道它是否存在或我如何有效地实现它吗?

【问题讨论】:

  • 一种适用于大多数优化原语(SAT、MIP、CP)的通用方法:引入指标约束,标记变量hits 是否为目标值。然后添加一种可能的可用基数方法(或者在你的情况下只是一个OR)。
  • 这个约束在 CP 社区的一个通用名称是 GCC(全局基数约束),也许这会帮助你找到答案(我对 choco 不太熟悉)

标签: constraint-programming choco


【解决方案1】:

如果您想在Choco Solver 中发布约束atLeast(VALUE,VARS, LIMIT),您可以简单地发布count(VALUE,VARS,X),使用X 初始域[0,VARS.length] 的IntVar,然后发布arithm(X,"&gt;=",LIMIT)。这将完成这项工作。不需要为此实施特定的约束。

如果您想检查VARS 中的至少一个变量是否等于VALUE,则更简单,只需发布​​count(VALUE, VARS, X) 并以[1,VARS.length] 作为X 的初始域。因此,VALUE 的最小出现次数至少为1。无需创建第二个变量和算术约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2013-06-24
    • 1970-01-01
    • 2016-07-07
    • 2023-03-27
    • 2021-08-04
    • 2015-12-17
    相关资源
    最近更新 更多