【问题标题】:Optional parameter with missing value in MiniZincMiniZinc 中缺失值的可选参数
【发布时间】:2017-11-30 16:59:42
【问题描述】:

我正在尝试模拟类似于作业车间问题的东西。有多个工作,可以通过多种方式完成,它们使用不同数量的任务来完成工作。

我已经设置了这个数据结构来表示该信息:

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]存在,则它是工作j的选项o的indexth任务。如果缺少,则该作业的该选项不会使用最大任务数,这是空槽之一。

我看不到如何初始化这个数组。如果是二维数组,我可以这样做

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,因为&lt;&gt; 是@ 类型987654333@.

我最初尝试做类似的事情

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

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

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

【问题讨论】:

    标签: arrays minizinc


    【解决方案1】:

    更新:问题已在 MiniZinc 编译器的 develop 分支上得到解决。在下一个版本&gt;2.1.6 中,应该可以将array3d 函数用于可选参数类型。


    opt 参数的array3d 函数是编译器当前缺少的功能。我建议在 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

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2011-08-05
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多