Необязательный параметр с отсутствующим значением в MiniZinc

Я пытаюсь смоделировать что-то похожее на проблему в магазине. Существует несколько заданий, которые можно выполнять разными способами, в которых используется различное количество задач для выполнения задания.

Я настроил эту структуру данных для представления этой информации:

enum Job;
enum Option;
int: maxTasks;
set of int: TaskIndex = 1..maxTasks;

enum Task;

array[Job, Option, TaskIndex] of opt Task: jobOptions;

Если jobOptions[j, o, index] существует, это index-я задача опции o задания j. Если он отсутствует, эта опция для этой работы не использует максимальное количество задач, и это один из пустых слотов.

Я не вижу, как я могу инициализировать этот массив. Если бы это был двумерный массив, я мог бы сделать

jobOptions = [|
    T1, T2 |
    T3, <>
   |];

Поскольку это 3D, хочу сделать что-то вроде

jobOptions = array3d(Job, Option, TaskIndex, [
    % Job 1
    T1, T2, % Option 1
    T3, <>, % Option 2
    % Job 2
    T2, T4, % Option 1
    <>, <>, % No second option
   |];

Однако это не удается, потому что есть три версии array3d, которые принимают массивы (par) int, var int и var opt int.. Мне нужна четвертая версия, принимающая (par) opt int, поскольку <> имеет тип var opt int.

Сначала я пытался сделать что-то вроде

array[Job] of array[int] of array[int]: jobOptions

сделать "неквадратный" массив, но если это возможно, я не смог понять правильный синтаксис.

Есть ли способ инициализировать массив 3D-параметров с отсутствующими необязательными элементами? В качестве альтернативы, есть ли лучший способ представить эти данные?


person Troy Daniels    schedule 30.11.2017    source источник


Ответы (1)


ОБНОВЛЕНИЕ: проблема решена в ветке develop компилятора MiniZinc. В следующем выпуске, >2.1.6, должна быть возможность использовать функцию array3d для необязательных типов параметров.


Функция array3d для opt параметров — это функция, которая в настоящее время отсутствует в компиляторе. Я бы предложил создать задачу в репозитории GitHub: https://github.com/MiniZinc/libminizinc/issues

Обычно я бы предложил изменить тип на его переменный аналог в качестве альтернативы (array[Job, Option, TaskIndex] of var opt Task: jobOptions;). Хотя это не идеально для проверки типов, его все же можно назначить как версию параметра (и он будет работать с текущей версией array3d). Кроме того, назначенные переменные будут вести себя как параметры в компиляторе. Если у вас возникнут проблемы с проверкой типов, вы всегда можете вызвать встроенную функцию fix, чтобы связать ее с параметром.

Однако, когда я попробовал это локально, кажется, что я столкнулся с ошибкой сегментации в компиляторе. Я бы посоветовал вам попробовать то же самое, и если вы столкнетесь с той же проблемой, снова сообщите о проблеме в репозиторий GitHub: https://github.com/MiniZinc/libminizinc/issues

person Dekker1    schedule 30.11.2017