Использование 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, которые стоило расширить для контекста и ссылок.

Другие вопросы по тегам