此问题与另一个问题R:sample()密切相关。我想在R中找到一种方式来列出所有k个数的排列,其和为k,其中每个数从0:k中选择。如果k = 7,我可以从0,1,...,7中选择7个数字。一个可行的解决方案是0,1,2,3,1,0,0另一个是1,1,1,1,1,1,1。我不想生成所有的排列,因为如果k只是比7大,这个爆炸。列出k个数字的所有排列,取自0:k,表示总和为k
当然在第k = 7实施例我可以使用以下:
perms7<-matrix(numeric(7*1716),ncol=7)
count=0
for(i in 0:7)
for(j in 0:(7-i))
for(k in 0:(7-i-j))
for(l in 0:(7-i-j-k))
for(n in 0:(7-i-j-k-l))
for(m in 0:(7-i-j-k-l-n)){
res<-7-i-j-k-l-n-m
count<-count+1
perms7[count,]<-c(i,j,k,l,n,m,res)
}
head(perms7,10)
但是我怎样可以概括这种方法考虑到任意k,而无需编写(K-1)环路? 我试图想出一个递推方案:
perms7<-matrix(numeric(7*1716),ncol=7) #store solutions (adjustable size later)
k<-7 #size of interest
d<-0 #depth
count=0 #count of permutations
rec<-function(j,d,a){
a<-a-j #max loop
d<-d+1 #depth (posistion)
for(i in 0:a) {
if(d<(k-1)) rec(i,d,a)
count<<-count+1
perms7[count,d]<<-i
perms7[count,k]<<-k-sum(perms7[count,-k])
}
}
rec(0,0,k)
但卡住了,我不太确定这是正确的道路要走。不知道是否有任何“魔术”R函数对于这个(虽然非常具体)的问题或者只是其中的一部分而言是整齐的。
在K = 7的情况下,所有的2.097.152置换和1.716该总和为k = 7可以通过找到:
library(gtools)
k=7
perms <- permutations(k+1, k, 0:k, repeats.allowed=T) #all permutations
perms.k <- perms[rowSums(perms) == k,] #permutations which sums to k
对于k = 8有43.046.721排列,但我只想列出6.435。 任何帮助,非常感谢!
我相信这是有关汉诺塔的问题。包'fun'和'ref'有解决这个问题的功能。 – James 2014-09-25 09:17:54
我不明白这与河内塔问题有何关系,请您详细说明一下?基本上我只需要计算Z^k中超平面的基数。 – 2014-09-25 09:46:41
这是k-tile,k-peg ToH所有可能状态的空间。 ToH的最佳解决方案显然不会试图遍历所有状态,但如果您寻找最佳次优解决方案,您应该得到答案。 – James 2014-09-25 09:53:02