在 Minizinc 中随机播放列表

1 minizinc

array[1..6] of var 0..1: Path;
include "alldifferent.mzn";
constraint
forall(j in 1..6)(
alldifferent(i in 1..6)(Path[i])
)
Run Code Online (Sandbox Code Playgroud)

我正在尝试将列表洗入 minizinc 中,但我每次都想要不同的结果,就像 a for all 一样。我该怎么做?打印这个:

Path = array1d(1..6, [5, 4, 3, 2, 1, 0]);
Run Code Online (Sandbox Code Playgroud)

hak*_*ank 5

至少有两种生成随机矩阵的方法,具体取决于您是否想要生成所有可能的变量(下面的第一个模型使用决策值),或者您是否只想要一个“随机”随机矩阵(第二个模型使用内置的- 在随机生成器中)。(第三种方法是编写自己的随机生成器,但这作为练习:-))。

这是一个简单的 MiniZinc 模型,它生成 {0,1} 所有可能的 6x6 矩阵作为决策变量。

int: n = 6;
array[1..n,1..n] of var 0..1: x;
solve :: int_search(array1d(x), first_fail, indomain_random) satisfy;

constraint
  true
;

output
[
   if j = 1 then "\n" else " " endif ++
      show(x[i,j])
   | i,j in 1..n        
];
Run Code Online (Sandbox Code Playgroud)

注意:indomain_random启发式以更“随机”的顺序生成解决方案。

还有另一种方法可以做到这一点,即使用该bernoulli(0.5)函数,该函数在模型创建过程中随机生成 0 或 1,即它不是决策变量:

int: n = 6;
array[1..n,1..n] of int: x = array2d(1..n,1..n,[ bernoulli(0.5) | i,j in 1..n]);

solve satisfy;

constraint
  true
;

output
[
  if j = 1 then "\n" else " " endif ++
    show(x[i,j])
  | i,j in 1..n        
];
Run Code Online (Sandbox Code Playgroud)

这恰好生成了以下矩阵:

1 1 1 0 0 0
1 0 1 1 0 0
0 0 0 0 1 1
0 1 0 0 1 0
1 1 1 1 0 1
0 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是您必须手动为随机生成器播种以生成不同的矩阵。这是(根据https://www.minizinc.org/doc-2.5.1/en/command_line.html?highlight=random#cmdoption-r)使用--random-seed i标志(或-r i)完成的,但这现在不起作用在我的 MiniZinc 版本上。

MiniZinc 有相当多的随机生成器,请在此处查看更多信息: https: //www.minizinc.org/doc-2.5.1/en/lib-stdlib.html ?highlight=random#random-number-generator-builtins 。