我有一组 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/