首页 > 解决方案 > 了解 Minizinc 中的一个关键概念 - 声明一组变量,然后使用它来声明一个值数组

问题描述

我正在学习 Coursera 上的 Minizink 简介课程,并找到了一个我真的希望能更直观地理解的例子。

本视频中的模型https://www.coursera.org/learn/basic-modeling/lecture/PZO1B/1-1-7-global-constraints声明了以下参数

set of int: DIGIT = 1..9;
array[DIGIT] of int: rods = [1,2,3,4,5,2,3,4,5];  

有了这些限制之后

constraint rods[M1] + rods[M2] + rods[M3] +  
           rods[M4] + rods[M5] = 12;

constraint 2303 + M1 * 10 + 980 + M2 * 1000 + M3 
           = 301 + M4 * 1000 + M5 * 10; 

我正在努力想象这里发生了什么。{1,...,9}为了检查,一个名为DIGIT的集合被声明为由数字 1 到 9 组成,这也可以被视为[],由相应的索引匹配。相反,声明var 1..9: DIGIT将创建 DIGIT 可以采用的一系列值,而不是数组或集合。

事实上,当我写这篇文章时,我实际上记得我是如何理解课程中前面的例子的,但我会完成这个姿势,也许可以进一步了解它,或者看看我是否还遗漏了什么。

例如,假设您有一个枚举集FRUIT = {apple,orange,banana},您可以使用例如关联一个整数数组array[FRUIT] of int: whatever = [4,9834,-42]。然后,通过声明来使用枚举的可能性var FRUIT: Opt1;,因此Opt1可以取苹果、橙子或香蕉的值,具体取决于所使用的约束类型,而whatever[Opt1]在约束内使用将取值 4、9834 或 -42,取决于目前正在“测试”的水果Opt1

因此,通常情况下,向某人解释某事实际上可以帮助您自己更好地理解它,所以我想我明白了,但我想知道我如何解释 Minizinc 的这一方面的工作方式是否有什么不妥或遗漏?

标签: arrayssetminizinc

解决方案


推荐阅读