MiniZinc: ошибка типа: функция или предикат с этой сигнатурой не найдены: `floor (var int) ' - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь запустить следующий код в Mac OS / X с Minizinc IDE 2.2.3 и Geocode 6.1.0 [встроенный]:

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) '

Я видел этот похожий вопрос однако я следую совету в выбранном ответе и использую:

  • переменная решения с плавающей точкой
  • решатель геокодирования

Таким образом, этот вопрос отличается от другого вопроса.

1 Ответ

0 голосов
/ 12 февраля 2019

В документации (v. 2.2.3) говорится, что floor() требует аргумент типа float:

4.1.11.6.Операции принуждения

Округление числа с плавающей точкой в ​​направлении + ∞, −∞ и ближайшего целого числа соответственно.

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

Явное приведение типов от одного типа к другому.

    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
----------
==========
...