【问题标题】:Using MATLAB to create a latin square matrix使用 MATLAB 创建拉丁方阵
【发布时间】:2017-05-31 02:09:02
【问题描述】:

我对 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 开始。我正在尝试设计一种自动化方法来完成部分拉丁方格,其中有一些值。

【问题讨论】:

  • 你可能想要if A(i,j) == 0(比较)而不是if A(i,j) = 0(分配)
  • 为什么要暴力破解? toeplitz是你的朋友:latin = toeplitz(1:10, [1 10:-1:2]); newLatin = latin(randperm(10), randperm(10));
  • ...或hankel: latin = hankel(1:10, [10 1:9]); newLatin = latin(randperm(10), randperm(10));
  • 我已经在答案中扩展了@gnovice 的评论,因为它是正确的并且值得一些上下文 :) 顺便说一句,如果您正在考虑复习数学编码技能,我推荐 @ 987654323@ 用于简短的算法挑战,因为 toeplitz 之类的可能不适用于您未来的 Matlab 职业!

标签: matlab latin-square


【解决方案1】:

您描述的方法不够健壮,无法每次都生成一个拉丁方格。例如,假设我们正在计算 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,每行按一个元素排列。这可以在 Matlab 中使用toeplitz 轻松生成:

A = toeplitz([1,n:-1:2],1:n);

现在我们有了一个拉丁方格!您可以通过使行排列随机而不是有序来随机化此过程。之后我们可以这样做,也可以使用来自randperm的随机索引对列进行置换

A = A(randperm(n), randperm(n));

注意,这不会产生所有可能的拉丁方格,因为:

"如果可以通过排列行、列和符号从另一个中获得一个,则两个正方形属于同一同位素类别" Brendan McKay

查看类之间的跳跃将是另一个层次。 n=8 有超过 100 万个类,并且类的数量随着值的增加而迅速爆炸! Wikipedia


由于 n=10 有 9,982,437,658,213,039,871,725,064,756,920,320,000 个拉丁方格(如您的尝试),我认为可以肯定地说,无论是您的蛮力方法还是这种排列方法都不会很快耗尽它们!


披露:此答案基于 gnovice 的评论,值得扩展上下文和链接。

【讨论】:

  • 哈哈谢谢。我很欣赏你提供的方法。我忘了添加这个细节。我之所以有这个 a(i,j)=0 是因为拉丁方格中有一些我不想改变的值。放置非零值是有目的的。
  • 基本上,我不想要任何拉丁方格。但我想要一个基于已经存在的某些值的完整拉丁方。然后,我希望 MATLAB 将 0 翻转为适当的值,然后不理会其余部分。
  • 喜欢解数独游戏?请编辑您的问题以提供示例输入。
  • 不一定是数独。但是假设我们有一个 9x9 的部分拉丁正方形,其中已经完成了 3 个 3x3 块。我想找出一种蛮力完成它的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多