r - 如何在R中生成N个最不相似的组合

标签 r cryptography combinations permutation combinatorics

我有一组 6 个颜色代码 (x)、一组 N 个个体,每个个体都需要用唯一的颜色代码进行标记,以及每只动物的四个位置,每个位置可以带有不同的颜色。我有 6 种不同的颜色。

因此,两个人的代码可能是;
1.红、蓝、蓝、白
2.白色,黄色,粉色,黄色

但是,由于每个位置的颜色可能会脱落,我想生成一个冗余标签方案,即使在失去了颜色之后,仍然可以将一个人与其他人区分开来。在一个(甚至两个?)位置上颜色。

尽管 6 种颜色和 4 个位置给出了 1296 种组合,但我发现很难选择 N 个最不相似的组合:

可重现的示例:

library(gtools)
x     <- c("white", "red", "green", "blue", "pink", "yellow")
Perms <- permutations(n=6,r=4,v=x,repeats.allowed=T)
print(nrow(Perms))
head(Perms)

请注意,前 6 个组合的颜色仅在 1 个位置不同 - 超过 1 个个体丢失此代码将意味着它们无法再被区分!

那么,对于N的值在50-150之间,如何选择N个最不相似的组合

谢谢!

最佳答案

我无法最终回答你的问题,但我有一个想法可能对你有帮助。

使用每种颜色的第一个字母构建字符串代码:

library(gtools)
x     <- c("w", "r", "g", "b", "p", "y")
Perms <- permutations(n=6,r=4,v=x,repeats.allowed=T)
m <- apply(Perms, 1, paste, collapse = "")

> head(m)
[1] "bbbb" "bbbg" "bbbp" "bbbr" "bbbw" "bbby"

示例 n 代码:

set.seed(1)
n <- 50
y <- sample(m, n)

创建一个 n*n 矩阵 Levenshtein distances :

library(vwr)
lvmat <- sapply(y, function(x) levenshtein.distance(x, y))

> lvmat[1:5, 1:5]
     grrp pgpg rprr yprw gggp
grrp    0    4    3    3    2
pgpg    4    0    4    4    3
rprr    3    4    0    2    4
yprw    3    4    2    0    4
gggp    2    3    4    4    0

现在您可以最大化 sum(lvmat),也许可以通过引导或任何能让您的船漂浮的方式,以获得最不同组合的样本。

关于r - 如何在R中生成N个最不相似的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50389295/

相关文章:

r - ggplot 中的条隐藏负标签 : geom_bar

r - 如何检查数字序列是否单调递增(或递减)?

algorithm - 为什么 AES 比 DES 更安全?

c# - 引用摘要验证失败

r - r 中二进制值的组合

R: dplyr 如何分组然后根据每组第一行的条件过滤行

r - 从 R 中的 SPSS 文件中提取标签

javascript - 在javascript中保护随机数?

machine-learning - 根据先前数据的概率生成数据组合

c# - 使用 LINQ 获取不同的数字组合