Существует как минимум два подхода к генерации случайной матрицы в зависимости от того, хотите ли вы сгенерировать все возможные переменные (первая модель ниже с использованием значений решения) или если вам просто нужна случайная случайная матрица (вторая модель, использующая встроенную случайный генератор). (Третий подход - написать собственный генератор случайных чисел, но это оставлено как упражнение :-)).
Вот простая модель MiniZinc, которая генерирует все возможные матрицы 6x6 из {0,1} в качестве переменных решения.
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
];
Примечание. Эвристика 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
];
В результате получается следующая матрица:
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
Недостатком этого является то, что вам придется вручную запускать генератор случайных чисел для генерации различных матриц. Это (согласно 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.
person
hakank
schedule
23.10.2020
all_different(Path)
. - person hakank   schedule 23.10.2020