minizinc - 找到总和为 n 的最小全差数组

标签 minizinc

这看起来是个简单的问题,但我找不到在 MiniZinc 中表示它的简单方法。

include "globals.mzn";

int: target;
int: max_length;

var 1..max_length: length;

array[1..length] of int: t;

constraint sum(t) = target;
constraint alldifferent(t);

solve minimize length;

此程序错误: MiniZinc:类型错误:type-in​​st 必须是 par set 但它是 ``var set of int'

在 MiniZinc 中是否有一种干净/简单的方法来表示这个问题?

最佳答案

MiniZinc 中的数组具有固定大小。因此,编译器说 array[1..length] of int: t不允许,因为 length是一个变量。

MiniZinc 提供的替代方案是具有可选 类型的数组,这些是可能存在的值。这意味着当你写类似 [t | t in 1..length] 的东西时, 它实际上会给你一个 1..maxlength 的数组, 但有些元素可以标记为 absent/<> .

对于这个特殊问题,您还忽略了一个事实 t本身应该是一个变量数组。 t 的值在编译时还不知道。因此,表述此问题的更好方法是允许 t 的值成为0当它们超出选择的长度时:

include "globals.mzn";

int: target;
int: max_length;

var 1..max_length: length;

array[1..max_length] of var int: t;

constraint sum(t) = target;
constraint alldifferent_except_0(t);
constraint forall(i in length+1..max_length) (t[i] = 0);

solve minimize length;

改进模型的下一步是确保 t 的初始域是有道理的,而不是完全不同,强制排序将是等效的,但消除了可能解决方案中的一些对称性。

关于minizinc - 找到总和为 n 的最小全差数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62828484/

相关文章:

python - 五位五元素排列的最长子集,只有一个元素位置是共同的

minizinc - MiniZinc 中的 channel 是什么?你能提供一个简单的例子来解释 channel 吗?最后,什么是逆?

c++ - 在跳过对角线的 vector 上映射上三角矩阵

python - 通过Win10中的原生界面在Python中运行MiniZinc

minizinc - 为什么picat说模型不满足?

minizinc - 半具体化谓词是否被视为标准的一部分?

MiniZinc:类型错误:预期 `array[int] of int' ,实际 `array[int] of var opt int

linear-programming - 如何在研究中展示 MiniZinc 的效率