Ошибка: Gecode: Float :: linear: Number вне пределов

Я создаю простую модель на Minizinc 2.5.3 (последняя версия) и Gecode 6.3.0, чтобы попытаться организовать производство оружия. При запуске кода появляется следующая ошибка:

Error: Gecode: Float::linear: Number out of limits

Я читал о некоторых ограничениях для переменных с плавающей запятой в Gecode, но я не знаю, связана ли проблема с решателем или с моим кодом (прилагается). Я пробовал изменить все на целочисленные переменные, но требования к ресурсам - это параметры с плавающей запятой. Я также пытался изменить решатель, но ни один из них не работал (нет доступного решателя MIP).

enum WEAPONS; %product
enum RESOURCES; %resources

array [RESOURCES] of float: capacity; %resource constraints
array [WEAPONS] of float: pwr; %profit/objective
array [WEAPONS,RESOURCES] of float: consumption; %consumption of resources for each product unit
array [WEAPONS] of var int: amt; %amount to produce

constraint forall(i in WEAPONS)(amt[i]>=0); %non-negative
constraint forall(r in RESOURCES)(sum(i in WEAPONS)(consumption[i,r]*amt[i])<=capacity[r]); %availability of resources must not be exceeded

solve maximize sum(i in WEAPONS)(pwr[i]*amt[i]);

output ["\(i): \(amt[i])\n" | i in WEAPONS];

Я использую следующий файл данных:

%Product
WEAPONS = {AXE, SWORD, PIKE, SPEAR, CLUB};
%Resoruces
RESOURCES = {IRON, WOOD, BLACKSMITHHR, CARPENTERHR};
%capacity
capacity = [5000, 7500, 4000, 3000];
%consumption: [Product,Resources]
consumption = [| 1.5, 1, 1, 1 
               | 2, 0, 2, 0 
               | 1.5, 0.5, 1, 1 
               | 0.5, 1, 0.9, 1.5 
               | 0.1, 2.5, 0.1, 2.5 |];
%profit
pwr = [11, 18, 15, 17, 11];

person pms0765    schedule 07.12.2020    source источник
comment
Проблема на github: Ошибка: Gecode: Float :: linear: Number out of limits   -  person Tomer Shetah    schedule 10.12.2020


Ответы (1)


Причина вашей проблемы в том, что переменные с плавающей запятой в Gecode ограничены 32 битами. Это означает, что некоторые проблемы, которые могут быть созданы в MiniZinc (который поддерживает 64-битные числа с плавающей запятой), не могут быть решены Gecode.

В вашей проблеме это вызвано

constraint forall(r in RESOURCES)(sum(i in WEAPONS)(consumption[i,r]*amt[i])<=capacity[r]); %availability of resources must not be exceeded

Выражения sum могут быть больше 32 бит двумя способами:

  • Это зависит от цифр потребления, которые потенциально могут быть большими (в приведенном вами примере ввода это не так).
  • Это зависит от домена amt, который в настоящее время не установлен. Это означает, что область суммы также будет охватывать все 64 бита.

Таким образом, способ решить эту проблему в вашей проблеме - установить начальный домен для переменных amt.

person Dekker1    schedule 07.12.2020