我有一个问题,可以归结为找到一种将三角矩阵映射到跳过对角线的向量的方法。
基本上我需要使用 Gecode 库来翻译这个 C++ 代码
// implied constraints
for (int k=0, i=0; i<n-1; i++)
for (int j=i+1; j<n; j++, k++)
rel(*this, d[k], IRT_GQ, (j-i)*(j-i+1)/2);
Run Code Online (Sandbox Code Playgroud)
进入这个 MiniZinc(功能)代码
constraint
forall ( i in 1..m-1 , j in i+1..m )
( (differences[?]) >= (floor(int2float(( j-i )*( j-i+1 )) / int2float(2)) ));
Run Code Online (Sandbox Code Playgroud)
我需要找出differences[?].
MiniZinc 是一种函数/数学语言,没有合适的 for 循环。所以我必须映射那些接触上三角矩阵的所有单元格的索引 i 和 j,跳过其对角线,将这些单元格从 0 编号到任意值。
如果这是一个普通的三角矩阵(它不是),解决这样会做
index = x + (y+1)*y/2
Run Code Online (Sandbox Code Playgroud)
我正在处理的矩阵是一个n*n方阵,索引从 0 到 n-1,但最好为n*m矩阵提供更通用的解决方案。
这是完整的 Minizinc 代码 …
该MiniZinc约束求解器允许表达基数约束很容易使用内置的sum()功能:
% This predicate is true, iff 2 of the array
% elements are true
predicate exactly_two_sum(array[int] of var bool: x) =
(sum(x) == 2);
Run Code Online (Sandbox Code Playgroud)
满足基数约束,当且仅当布尔变量数组中的真实元素的数量符合指定。布尔值自动映射到整数值0并1计算总和。
我将自己的基数约束谓词实现为一组计数器切片:
% This predicate is true, iff 2 of the array
% elements are true
predicate exactly_two_serial(array[int] of var bool: x) =
let
{
int: lb = min(index_set(x));
int: ub = max(index_set(x));
int: len = length(x);
}
in
if len < 2 then
false …Run Code Online (Sandbox Code Playgroud) 我正在使用带有内置 Gecode 6.1.1 的 minizinc,并且我希望最大化目标函数,其值远大于最大 int 32。32 位整数的最大值是 2147483646。虽然似乎没有太多信息与minizinc 参考文献中整数的最大值相关。然而,以下测试表明 Minizinc 使用 32 位整数。
测试非常简单,它只是尝试最大化 var int。
var int: maxInt;
constraint maxInt>0;
solve maximize maxInt;
output ["maxInt = \(maxInt)"];
Run Code Online (Sandbox Code Playgroud)
结果是
最大整数 = 2147483646
结果接近最大 int32 值,而且 miniZinc 似乎无法进一步“最大化”它。以下示例返回一个奇怪的错误。
var int: maxInt;
constraint maxInt>2147483646;
solve maximize maxInt;
output ["maxInt = \(maxInt)"];
Run Code Online (Sandbox Code Playgroud)
错误消息如下。该错误消息信息不多,但在尝试使用大于 2147483646 的数字时会显示。
错误:第 1 行中的整数文字无效。2 错误:语法错误,第 1 行出现意外的“,” 2 进程以非零退出代码 1 结束
我的问题如下:我可以在 minizinc 中使用 int64 位整数或任何其他大整数表示形式吗?如果可以,如何使用?(使用浮动不是一种选择)理想情况下,我想举一些例子来说明如何最大化某些东西
constraint maxLargeInt>2147483647;
Run Code Online (Sandbox Code Playgroud) 我正在使用 minizinc 和 gecode 以分布式方式解决最小化问题。我有多个分布式服务器,它们使用相同的输入来解决相同的模型,并且我希望所有服务器都能获得相同的解决方案。
问题是模型有多个解决方案,这会定期导致服务器独立地提出不同的解决方案。选择哪种解决方案并不重要,只要所有服务器之间的解决方案都是相同的即可。我还使用“-p”参数和 gecode 来使用多个线程(如果相关)。
有什么办法可以解决这个问题吗?
例如,我正在考虑输出所有解决方案,然后在每台服务器上按字母数字对它们进行排序。
谢谢!
在Gecode中,我使用评价函数在分支时选择变量。
为了计算变量 v 的优点,我需要访问一些其他变量值,但看起来在调用优点函数时,空间变量尚未分配任何值:
Exception: IntVar::val: Attempt to access value of unassigned variable.
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?有没有办法访问评价函数中的变量值?