我想从向量s<-0:1440
中抽取值来创建向量u
,以便sum(u)=x
和length(u)<k
同时为k
和x
k*max(s)>sum(u)
。显然是u
。
有没有办法蛮力模拟许多这样的u
向量?我想避免弄乱概率分布(对于抽样),我不在乎是否会丢弃一些length(u)
向量。
编辑:关于P Lapointe对length(u)
的好评。重要的是length(u)<k
不应该被修复(u
),以便向量length(u)=k
具有可变长度。另一种方法是修复sum(u)
,但算法应该能够在u向量中随机插入(模拟)零。这将导致通过添加零,length(u)
保持不变,但length(u)=k
增加一(直到length(u)=k
)。重要的是零随机出现(不仅仅是在模拟向量的末尾,只是为了满足{{1}})
答案 0 :(得分:2)
好的,这是一个回答你问题的算法。基本上,我们正在做两个随机样本。第一个找到满足length(u)<k
约束的k。使用该k,我们然后使用另一个样本来查找k-1
个数字。这在算法中称为initial
。当我们找到低于k-1
的样本x
时,我们会添加x-sum(initial)
之差来完成系列。
#Inputs
x <-2500 # desired sum
s1<-0:min(1440,x) #universe
max.k <-10
k <-sample(3:(max.k-1),1) #length(u)<k, starts at 3 because low k can be problematic
#with current inputs
initial <-x+1 #deliberately above limit to initialize the while
u <-s1+1 #deliberately above limit to initialize the while
while (sum(initial)>x | max(u)>max(s1)) {
initial <-sample(s1,k-1,replace=TRUE) #Find k-1 samples
u <-c(initial,x-sum(initial)) #add number that makes sum == x
}
#example
> k
[1] 4
> x
[1] 2500
> u
[1] 282 1337 876 5
> sum(u)
[1] 2500
此外,如果你有一个很大的max.k
,添加一个概率向量可能是一件好事,它会给样本中的低数字提供更多概率。否则,在当前示例中,如果您有多个数字超过1000,则很难获得总和== 2500。
prob1 <-1/((s1+1)*max.k ) #gives more probality to low numbers
while (sum(initial)>x | max(u)>max(s1)) {
initial <-sample(s1,k-1,replace=TRUE,prob=prob1) #Find k-1 samples
u <-c(initial,x-sum(initial)) #add number that makes sum == x
}
答案 1 :(得分:0)
我不认为你可以在没有MIP的情况下强行执行length(u)<k
约束。但如果您将其修改为数字,则可以使用sample
。
在此示例中,前五行是样本,总和将添加到矩阵的最后一行。如果找不到匹配项,您可以增加replicate
(目前为20000)的大小。您还应该检查range(all[k+1,])
,看看您希望总和(x
)是否在采样总和中。
set.seed(1)
s<-0:1440 #universe
k <-5 #fixed number of items in sample
x <-2500 # desired sum
all <-replicate(20000, sample(s,k,replace=TRUE))
all <-rbind(all,colSums(all))
all[,all[k+1,]==x,drop=FALSE] #gives two possible samples
[,1] [,2]
[1,] 410 241
[2,] 189 687
[3,] 988 401
[4,] 897 983
[5,] 16 188
[6,] 2500 2500