MiniZinc

时间:2017-11-30 16:59:43

标签: arrays 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的{​​{1}}任务。如果丢失,该作业的该选项不使用最大任务数,这是空插槽之一。

我没有看到如何初始化这个数组。如果它是一个二维数组,我可以做

j

因为它是3d,所以想做类似

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

然而,这失败了,因为有三个版本的array3d,它们采用jobOptions = array3d(Job, Option, TaskIndex, [ % Job 1 T1, T2, % Option 1 T3, <>, % Option 2 % Job 2 T2, T4, % Option 1 <>, <>, % No second option |]; (par) intvar int的数组我需要第四个版本,取var opt int.,由于(par) opt int的类型为<>

我最初尝试做类似

的事情
var opt int

制作一个“非正方形”数组,但如果可行的话,我无法弄清楚正确的语法。

有没有办法初始化缺少可选元素的3d参数数组?或者,是否有更好的方式来呈现这些数据?

1 个答案:

答案 0 :(得分:1)

更新:问题已在MiniZinc编译器的develop分支上解决。在下一版本>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