我正在尝试模拟类似于工作车间问题的东西。有多个工作,可以通过多种方式完成,这些工作使用不同数量的任务来完成工作。
我已设置此数据结构来表示该信息:
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) int
和var int
的数组我需要第四个版本,取var opt int.
,由于(par) opt int
的类型为<>
。
我最初尝试做类似
的事情var opt int
制作一个“非正方形”数组,但如果可行的话,我无法弄清楚正确的语法。
有没有办法初始化缺少可选元素的3d参数数组?或者,是否有更好的方式来呈现这些数据?
答案 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