4

ベクトルから値をサンプリングしてベクトルs<-0:1440を作成uし、sum(u)=xwhile length(u)<k、forgiven k およびx。明らかにk*max(s)>sum(u)

uそのような多数のベクトルをブルートフォースでシミュレートする方法はありますか?(サンプリングのために)確率分布をいじりたくないので、いくつかのuベクトルが破棄されるかどうかは気にしません。

編集: PLapointeのについての素晴らしいコメントについてlength(u)。ベクトルが可変長になるように、をlength(u)固定()しないことが重要です。別のアプローチは、を修正することですが、アルゴリズムはuベクトルにゼロをランダムに挿入(シミュレート)できる必要があります。これにより、ゼロを追加することにより、残りは同じままですが、1つ増加します(まで)。ゼロがランダムに表示されることが重要です(シミュレートされたベクトルの最後だけでなく、を満たすためだけに)length(u)<kulength(u)=ksum(u)length(u)length(u)=klength(u)=k

4

2 に答える 2

3

OK、これがあなたの質問に答えるアルゴです。基本的に、2つのランダムなサンプルを実行しています。length(u)<k制約を満たすakを最初に見つけたもの。その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を超える数値がある場合、sum==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
}
于 2012-05-28T02:16:20.587 に答える
0

length(u)<kMIPなしでブルートフォースで制約を強制することはできないと思います。ただし、数値に固定すると、を使用できますsample

この例では、最初の5行がサンプルであり、合計がマトリックスの最後の行に追加されます。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
于 2012-05-27T18:14:01.060 に答える