标签: gecode

在跳过对角线的向量上映射上三角矩阵

我有一个问题,可以归结为找到一种将三角矩阵映射到跳过对角线的向量的方法。

基本上我需要使用 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 代码 …

c++ mapping matrix minizinc gecode

6
推荐指数
1
解决办法
2008
查看次数

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)

满足基数约束,当且仅当布尔变量数组中的真实元素的数量符合指定。布尔值自动映射到整数值01计算总和。

我将自己的基数约束谓词实现为一组计数器切片:

%  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)

constraint-programming minizinc gecode

5
推荐指数
1
解决办法
963
查看次数

如何最大化大于 32 位的 var int?

我正在使用带有内置 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)

optimization minizinc gecode optimathsat

3
推荐指数
1
解决办法
407
查看次数

Minizinc、Gecode,如何通过多解决方案模型跨分布式服务器获得相同的解决方案?

我正在使用 minizinc 和 gecode 以分布式方式解决最小化问题。我有多个分布式服务器,它们使用相同的输入来解决相同的模型,并且我希望所有服务器都能获得相同的解决方案。

问题是模型有多个解决方案,这会定期导致服务器独立地提出不同的解决方案。选择哪种解决方案并不重要,只要所有服务器之间的解决方案都是相同的即可。我还使用“-p”参数和 gecode 来使用多个线程(如果相关)。

有什么办法可以解决这个问题吗?

例如,我正在考虑输出所有解决方案,然后在每台服务器上按字母数字对它们进行排序。

谢谢!

minizinc gecode

2
推荐指数
1
解决办法
212
查看次数

在Gecode中,从评价函数访问家庭/空间变量值

Gecode中,我使用评价函数在分支时选择变量。

为了计算变量 v 的优点,我需要访问一些其他变量值,但看起来在调用优点函数时,空间变量尚未分配任何值:

Exception: IntVar::val: Attempt to access value of unassigned variable.
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?有没有办法访问评价函数中的变量值?

gecode

2
推荐指数
1
解决办法
190
查看次数