Gerando permutações com uma restrição de soma
eu tenhon
conjuntos de comprimento variável e gostaria de obter todas as permutações de itens de cada conjunto em que a soma esteja dentro de um determinado intervalo. Por exemplo, emR
nós podemos fazer:
set1 <- c(10, 15, 20)
set2 <- c(8, 9)
set3 <- c(1, 2, 3, 4)
permutations <- expand.grid(set1, set2, set3)
permutations$sum <- rowSums(permutations)
final <- permutations[permutations$sum >= 25 & permutations$sum <= 29, ]
# final:
# Var1 Var2 Var3 sum
# 3 20 8 1 29
# 5 15 9 1 25
# 8 15 8 2 25
# 11 15 9 2 26
# 14 15 8 3 26
# 17 15 9 3 27
# 20 15 8 4 27
# 23 15 9 4 28
Isso é bom para um pequeno número de conjuntos, mas cresce rapidamente (fatorialmente) com um número maior ou maior de conjuntos.
É possível gerar permutações que se encaixam na restrição, sem ter que calcular todas as possibilidades?
Neste exemplo, não há combinações finais contendo os 10 deset1
, pois a soma resultante seria muito pequena, independentemente de outros números escolhidos. Isso pode ser útil para reduzir o escopo do problema. Por exemplo, e, se eu souber dissomin(set1) + max(set2) + max(set3) < 25 == TRUE
, posso garantir que não incluamin(set1)
em quaisquer permutações.
Como posso generalizar isso e usar as restrições para evitar a geração de permutações inválidas?