我在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。我正在尝试设计一种自动化方法来完成部分拉丁方块,这些方块具有一些值。
答案 0 :(得分:0)
您描述的方法不够健壮,无法每次生成拉丁方。例如,假设我们正在计算5x5平方的第二行
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
。这可以使用toeplitz
:
A = toeplitz([1,n:-1:2],1:n);
现在我们有一个拉丁方!您可以通过使行排列随机而非有序来随机化此过程。之后我们可以使用randperm
A = A(randperm(n), randperm(n));
注意,这不会产生所有可能的拉丁方格,因为:
" 如果可以通过置换行,列和符号从另一个中获得一个正方形,则两个正方形属于同一同位素类" Brendan McKay
看着课间的跳跃是另一个层次。对于n = 8,有超过100万个类,并且对于更高的值,类的数量会迅速爆炸! Wikipedia
由于有9,982,437,658,213,039,871,725,064,756,920,320,000拉丁方为n = 10 (正如你的尝试)我认为可以肯定地说,无论你的蛮力方法和这种排列方法都不会很快耗尽它们!
披露:这个答案是基于gnovice的评论,这个评论值得扩展,用于上下文和链接。