【问题标题】:MiniZinc: type error: no function or predicate with this signature found: `floor(var int)'MiniZinc:类型错误:找不到具有此签名的函数或谓词:`floor(var int)'
【发布时间】:2019-02-12 08:20:45
【问题描述】:

我正在尝试使用 Minizinc IDE 2.2.3 和 Geocode 6.1.0 [内置] 在 Mac OS/X 上运行以下代码:

var 1..10: x;
var float: y = x div 4;

constraint y == floor(y);

solve minimize( (x - 7)^2 );

output ["\(x) \(y)"]

我收到的错误是:

MiniZinc:类型错误:找不到具有此签名的函数或谓词:`floor(var float)'

我已经看到了这个similar question,但是,我正在遵循selected answer 中的建议并使用:

  • 浮动决策变量
  • 地理编码求解器

因此,这个问题与其他问题不同。

【问题讨论】:

    标签: minizinc


    【解决方案1】:

    documentation (v. 2.2.3) 表示floor() 需要float 类型的参数:

    4.1.11.6。强制操作

    将浮点数分别向 +∞、-∞ 和最接近的整数舍入。

    int: ceil (float)
    int: floor(float)
    int: round(float)
    

    从一个 type-in​​st 到另一个 type-in​​st 的显式转换。

        int:          bool2int(    bool)
    var int:          bool2int(var bool)
        float:        int2float(    int)
    var float:        int2float(var int)
    array[int] of $T: set2array(set of $T)
    

    在您的模型中,您将var float 而不是float 传递给函数floor,因此您会收到类型错误


    话虽如此,在您的示例中,floor() 函数似乎没有必要。即使您将y 声明为var float,也只能为其分配一些整数 值,因为整数除法 的结果始终是整数

    function var int: 'div'(var int: x, var int: y)
    

    因此,我的建议是完全放弃floor()

    示例

    var 1..10: x;
    var float: y = x div 4;
    
    constraint 1.5 <= y;
    
    solve minimize( (x - 7)^2 );
    
    output ["\(x) \(y)"]
    

    产量

    ~$ minizinc t.mzn 
    8 2.0
    ----------
    ==========
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2011-05-21
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      相关资源
      最近更新 更多