在 R 中将整数转换为带有约束的随机顺序?

问题描述 投票:0回答:2

我想对 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)

我的问题是是否有更好、优化的函数来做到这一点?或者有人知道这个任务有更好的算法吗?

r constraints combinatorics sampling
2个回答
1
投票

检查订单是否遵循约束,如果不遵循则交换位置:

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

0
投票

您的要求不明确。这是一个简单的方法

2
和 ``5` 遵循任何所需的值。

samp <- 1:10
lastones <- c(2,5)
foo <- sample(samp[-lastones])
foo <- c(foo, lastones)
© www.soinside.com 2019 - 2024. All rights reserved.