【发布时间】:2020-03-31 00:09:08
【问题描述】:
我的目标是在给定大小 n 的情况下构造每个唯一的 Latin Square。 R 命令 rlatin(n) 使用马尔可夫链构造一个大小为 n x n 的随机拉丁方。但是,此命令不仅会构建其大小的所有拉丁方格。
下面是我的代码:
library(magic)
L <- function(n){
size <- factorial(n) * factorial(n-1)
l <- list()
l[[1]] <- rlatin(n)
for(k in 2:size){
new <- rlatin(n)
for(j in 1:(k-1)){
if(new == l[[j]]){
new <- rlatin(n)
}
}
l[[k]] <- new
}
l
}
这不能正常工作,我不明白为什么。有人可以阐明我的错误吗?另外,一旦所有的拉丁方格都构建好了,我有没有办法组织它们,以便在拉丁方格中有一些清晰的内容?
【问题讨论】:
-
首先,这个问题需要更清楚地了解拉丁方的数学 - 为什么你会尝试找到“每一个独特的拉丁方”,当已知即使对于一个小的 n = 10,你会大约有 9,982,437,658,213,039,871,725,064,756,920,320,000 个独特的解决方案,如果将其限制为简化形式,您仍然会有大约 7,580,721,483,160,132,811,489,280 个解决方案。来源en.wikipedia.org/wiki/Latin_square)。您的代码确实适用于 n=3 并且如果您有一台具有足够功率的较新计算机,则适用于 n=4 和 5。因此,很可能是计算能力问题
-
另外,正如上面 [r] 标签明确提到的,使用
library()调用指定所有非基础包。rlatin函数从何而来? -
第8行,要不要:
if(identical(new, l[[j]]))){ -
您只想构建正方形的规范形式,还是每个排列?如果是后者,我建议您为找到的每个正方形生成所有排列,并且只检查任何新正方形的规范形式。会更有效率。
-
@aiatay7n 我真的只会使用这个函数来获得最多 n=5 的每个唯一正方形。出于某种原因,当我使用 n=3 时,上面的代码对我不起作用。它获得了 12 个拉丁方格,但有些是重复的。
标签: r for-loop if-statement