【问题标题】:MiniZinc global_cardinality function with enums带枚举的 MiniZinc global_cardinality 函数
【发布时间】:2021-04-04 19:26:57
【问题描述】:

根据the docs

枚举类型的一个关键行为是,当它们用于需要整数的位置时,它们会自动强制转换为整数。例如,这允许我们使用定义在整数上的全局约束,例如 global_cardinality_low_up

global_cardinality* 系列有两种形式:谓词和函数。虽然在谓词的情况下,枚举项数组确实强制转换为整数,但强制似乎不起作用。 例如,

include "global_cardinality_closed.mzn";

enum MyEnum = {A, B, C};
array[1..2] of MyEnum: toCount = [A, C];

array[1..100] of var MyEnum: values;

%1
constraint let {
    array[int] of var int: counts = global_cardinality_closed(values, toCount);
} in counts[1] > counts[2];

%2
constraint global_cardinality_closed(values, toCount, [5, 6]);

在 MiniZincIDE 中编译上面的代码 sn-p 结果:

MiniZinc: type error: no function or predicate with this signature found: `global_cardinality_closed(array[int] of var MyEnum,array[int] of MyEnum)'
Cannot use the following functions or predicates with the same identifier:
predicate global_cardinality_closed(array[$_] of var int: x,array[$_] of int: cover,array[$_] of var int: counts);
    (requires 3 arguments, but 2 given)

同时%2之后的代码编译就好了。

我错过了什么还是应该提交错误?

【问题讨论】:

    标签: minizinc


    【解决方案1】:

    要使%1 工作,您可以

    include "global_cardinality_closed_fn.mzn";
    

    或者干脆

    include "globals.mzn";
    

    该功能是利用谓词实现的:

    include "global_cardinality_closed.mzn";
    
    /** @group globals.counting
      Returns an array with number of occurrences of \a cover[\p i] in \a x.
    
      The elements of \a x must take their values from \a cover.
    */
    function array[$Y] of var int: global_cardinality_closed(array[$X] of var int: x,
                                                             array[$Y] of int: cover) :: promise_total =
      let { array[int] of int: cover1d = array1d(cover);
            array[index_set(cover1d)] of var 0..length(x): counts;
            constraint global_cardinality_closed(array1d(x),cover1d,counts); } 
      in arrayXd(cover,counts);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-27
      • 2020-06-20
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多