我想对 R 中的整数进行采样,但也设置约束,例如“3 始终在 2 之前”和“8 始终在 5 之前”。
没有任何限制,人们可以直接写:
sample(1:10)
...就是这样,但现在我们需要更多的东西。我喜欢用表格或矩阵来思考,所以描述与矩阵的关系是我解决这个问题的方法,即
# Create constraint matrix
constraint_matrix <- matrix(0, nrow = 10, ncol = 10)
# Set constraints
constraint_matrix[3, 2] <- 1 # 3 comes before 2
constraint_matrix[8, 5] <- 1 # 8 comes before 5
# Check, if generated output satisfies set constraints
check_constraints <- function(numbers, constraint_matrix) {
for (i in 1:(length(numbers) - 1)) {
if (constraint_matrix[numbers[i+1], numbers[i]] == 1) {
return(FALSE) # A constraint NOT satisfied
}
}
return(TRUE) # All constraints are satisfied
}
# Generate random order and check if constraints are satisfies
set.seed(123)
numbers <- sample(1:10)
while (!check_constraints(numbers, contstraint_matrix)) {
numbers <- sample(1:10)
}
print(numbers)
我的问题是是否有更好、优化的函数来做到这一点?或者有人知道这个任务有更好的算法吗?
检查订单是否遵循约束,如果不遵循则交换位置:
set.seed(1); x <- sample(1:10)
x
# [1] 9 4 7 1 2 5 3 10 6 8
#"3 comes always before 2" and "8 comes always before 5".
cons <- list(c(3, 2), c(8, 5))
for(i in seq_along(cons)){
ix <- match(cons[[ i ]], x)
if(ix[ 1 ] > ix[ 2 ]) x[ rev(ix) ] <- cons[[ i ]]
}
x
# [1] 9 4 7 1 3 8 2 10 6 5
您的要求不明确。这是一个简单的方法
2
和 ``5` 遵循任何所需的值。
samp <- 1:10
lastones <- c(2,5)
foo <- sample(samp[-lastones])
foo <- c(foo, lastones)