【问题标题】:MiniZinc Assign Different Domain to Each Var in ArrayMiniZinc 为数组中的每个变量分配不同的域
【发布时间】:2017-05-07 15:40:20
【问题描述】:

我有一个数组:array[backpacks] of int: capacity 指定每个背包的容量。

现在我想创建一个约束求解器必须满足的变量数组。我希望每个变量都取域 1..capacity 中的值,其中容量对应于上述数组中指定的值。

类似这样的工作:array[backpacks] of var capacity: bagcaps 吗?

或者我必须这样做:array[backpacks] of var 1..MAX: bagcaps

然后添加约束:constraint forall(i in backpacks) bagcaps[i] <= capacity[i]?

谢谢。

【问题讨论】:

    标签: arrays constraints constraint-programming minizinc


    【解决方案1】:

    没有捷径可以限制数组声明中特定元素的域。传统的版本是你最后写的:

    constraint forall(i in backpacks) bagcaps[i] <= capacity[i]);
    

    但是,您可以将其作为谓词(并将其放在单独的文件中,然后使用include 将其导入模型中)。例如。像这样的东西:

    set of int: backpacks = 1..6;
    array[backpacks] of int: capacity = [10,4,3,7,5,3];
    array[backpacks] of var 1..max(capacity): bagcaps;
    
    solve satisfy;
    
    predicate restrict_domains(array[int] of var int: x, array[int] of int: d) =
            forall(i in index_set(x)) ( x[i] <= d[i] );
    
    constraint
         % forall(i in backpacks) ( bagcaps[i] <= capacity[i] ) % original
         restrict_domains(bagcaps,capacity)
    ;
    
    % output [];
    

    请注意,您仍必须使用restrict_domains 作为约束。我建议您始终尽可能限制声明中的域,即使用 var 1..max(capacity) 而不是 var int 的声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多