minizinc学习记录
借鉴 minizinc
MiniZinc中,基本的数据类型有6种:
整数(int),浮点数(float),布尔类型(bool),字符串(string),向量(array)和集合(set)
参数用关键词par
标识,但是如果给出了数据类型,那么par
可以省略,也就是说par int: k
和int: k
是等价的。
变量用关键词var
标识,eg:var set of ITEMS: knapsack;
生成了一个名为knapsack的变量,其类型为set of ITEMS
,也就是ITEMS的一个集合。对于决策变量我们无法预先为它赋值,只有等到求解之后我们才能知道它可以取什么值。但通常对于决策变量,我们需要给定其值域(domain)来帮助求解器进行搜索,这里我们给出的domain是set of ITEMS
也就是ITEMS
中任意选取的一个集合。
参数和变量的声明和赋值可以放在一起,也可以分开,例如var int: x = y + 10;
和var int: x; x = y + 10;
是等价的。注意:对每个参数/变量只能赋值一次,多次赋值会引起错误。
变量名称可以由大小写字母和下划线组合而成,其他字符和miniZinc的保留关键字、操作符不能作为变量名(和C/C++类似)。
约束用constraint
关键词标识。约束中给定的是一系列的布尔类型表达式(Boolean expression),来对模型中变量的取值进行限制。
MiniZinc支持的关系操作符有:
- 等于:
=
或者==
- 不等:
!=
- 小于和小于等于:
<
和<=
- 大于和大于等于:
>
和>=
当然MiniZinc也支持一系列的逻辑关系,例如蕴含(->
)、合取(/\
)、析取(\/
)等
逻辑联结词(Logical Connectives)
在数理逻辑中,常用的联结词有5个,下面一一介绍在MiniZinc中的对应形式
- 合取(Conjunction):MiniZinc中用
/\
表示,a /\ b
用自然语言描述就是a and b
- 析取(Disjunction):MiniZinc中用
\/
表示,a \/ b
用自然语言描述就是a or b
- 等价(Biconditional):MiniZinc中用
<->
表示,a <-> b
用自然语言表示就是a if and only if b
- 蕴含(Material implication):MiniZinc中用
->
表示,a -> b
用自然语言表示就是if a then b
- 否定(Negation):MiniZinc中用
not
表示,not a
意义就等同于自然语言表示了
注意:MiniZinc中并不支持连续不等式,所以0<=a<=2
是不合法的,而应该写成0<=a /\ a<=2
%--------------------------
% 结果输出
output ["Picked Items: \(knapsack)\nTotal weight: \(total_wt)\nTotal value: \(total_val)\n"];
----------
表示上面给出的解是问题的一个可行解。
==========
表示上面的解是最优解。
默认情况下,minizinc在求解优化问题时只会输出最优解。如果加上参数-a
,则表示输出所有可行解。如果使用IDE,可以在configuration editor中进行设置。
数组的声明
数组可以是一维或者多维的,在声明时使用如下格式:
array[index_set1, index_set2,...] of <type>
数组下标的集合可以是枚举类型或者是某个集合表达式。
数组内的元素可以是除了数组以外的任何内置类型,也就是说MiniZinc不支持数组嵌套。
数组的初始化
一维数组
对于一维数组,我们可以用列表的方式进行初始化,这和大多数其他语言一样,比如下面这些例子:
profit = [100, 200, 300];
cost = [0.2, 0.3, 0.5];
二维数组
MiniZinc中二维数组的初始化有特定的语法:
- 起始于符号
[|
- 用
|
来分割行 - 结束于符号
|]
一个例子就是我们上面定义的二维数组:
consumption = [|2.5, 0.5, 1.0, 3.7|0.4, 4.2, 5.1, 1.2|3.5, 4.5, 7.0, 2.7|];
特别需要注意结尾,不要忘记|
符号。
内置函数初始化任意维度数组
对于任何维度k
不大于6的数组,我们都可以用内置函数arraykd
来进行初始化,例如:
profit = array1d(1..3, [100, 200, 300]);
consumption = array2d(1..3, 1..4,[2.5, 0.5, 1.0, 3.7,0.4, 4.2, 5.1, 1.2,3.5, 4.5, 7.0, 2.7]);
分别等价于我们上面的一维和二维数组初始化方式。