Использование MATLAB для создания латинской квадратной матрицы
Я довольно ржавый в MATLAB и пытаюсь решить некоторые проблемы, связанные с латинскими квадратами. Код, над которым я работаю, выглядит следующим образом:
counter=1;
for i=1:10
for j=1:10
if A(i,j)=0
A(i,j)=[This is where I'm stuck];
end
counter=counter+1;
end
end
Я хотел бы, чтобы этот код проверял значения в A(i,j)
определить, является ли значение из [1,...,n]
уже присутствует в i-й строке, а затем выбрать случайное значение из
[1,...,n] excluding [values already present].
По сути, я просто пытаюсь грубой силой завершить частичные латинские квадраты.
Редактировать:
Я не пытаюсь генерировать случайные латинские квадраты, а скорее с определенными свойствами на месте. Например, предположим, что у нас есть следующая настройка:
A=[X,0,0,0,Y,0,0,0,Z]
Где 0,X,Y,Z - все подматрицы 3x3, а X, Y, Z имеют значения от 1,...,9 в них. Я пытаюсь разработать автоматизированный подход к заполнению частичных латинских квадратов, которые имеют некоторые значения на месте.
1 ответ
Метод, который вы описываете, недостаточно надежен, чтобы каждый раз генерировать латинский квадрат. Например, представьте, что мы вычисляем 2-й ряд квадрата 5х5
1 2 3 4 5
2 4 1 3 ?
Первые 4 столбца подчинялись правилам, выбирая случайные значения в каждом столбце, что не приводит к конфликту строк / столбцов. Тогда последнее значение должно быть 5, что не допускается. Вы можете добавить еще одну стадию, которая будет проходить через столкновения и делать перестановки, но это может быть бесконечным, если не тщательно продумано!
Гораздо более простым способом было бы построить "простой" латинский квадрат размером n
со следующей формой:
A = [1 2 3 ... n-1 n
n 1 2 ... n-2 n-1
n-1 n 1 ... n-3 n-2
... ... ... ... ... ...
3 4 5 ... 1 2
2 3 4 ... n 1 ]
Каждая строка - это вектор 1:n
переставляется по одному элементу в каждой строке. Это можно легко сгенерировать в Matlab, используя toeplitz
:
A = toeplitz([1,n:-1:2],1:n);
Теперь у нас есть латинский квадрат! Вы можете рандомизировать этот процесс, делая перестановки строк случайными, а не упорядоченными. Мы можем сделать это потом и переставить столбцы, используя случайные индексы из randperm
A = A(randperm(n), randperm(n));
Обратите внимание, что это не даст все возможные латинские квадраты, так как:
" Два квадрата принадлежат одному классу изотопий, если один можно получить из другого, переставляя строки, столбцы и символы ", - Брендан Маккей
Глядя на прыжки между классами было бы другим уровнем. Существует более 1 миллиона классов для n=8, и число классов быстро растет при больших значениях! Википедия
Поскольку существует 9 982 437 658 213 039 871 725 064 756 920 320000 латинских квадратов для n = 10 (как в вашей попытке), я думаю, можно с уверенностью сказать, что ни ваш метод грубой силы, ни этот метод перестановки в любом случае не исчерпают их быстро!
Раскрытие: этот ответ был основан на комментарии gnovice, которые стоило расширить для контекста и ссылок.