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)
至少有两种生成随机矩阵的方法,具体取决于您是否想要生成所有可能的变量(下面的第一个模型使用决策值),或者您是否只想要一个“随机”随机矩阵(第二个模型使用内置的- 在随机生成器中)。(第三种方法是编写自己的随机生成器,但这作为练习:-))。
这是一个简单的 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 。
归档时间: |
|
查看次数: |
297 次 |
最近记录: |