1

次の状況で必要なものを取得するための最も簡単で最も構成可能な方法はどれか疑問に思っていました。

  • Xセットの1つを抽出するために使用されるカウンターと呼びましょう
  • それらの間で注文された合計S1, S2, ..と見なすことができる可変数のセットがあります
  • これらのセットをあいまいな方法で混合しX = 0S1、 、たとえば、70% の確率と 30% の確率X = 20を与えるようにします。S1S2
  • 増加Xすると確率がS10% まで減少し、最大 100% まで増加します。その後、減少し始めてチャンスを得始める 新しいしきい値まで、S2常に私を与えるゾーンが存在する可能性があります。S2S2S3

すべてをハードコーディングする方法は知っていますが、微調整が必​​要になるため、所有するセットの数と単一のしきい値 (増加する確率の開始/終了と開始/終了) を簡単に構成できるソリューションを適用したいと考えています。減少確率の)。もちろん、それぞれ2セット以上の交差は必要なく、確率の直線的な増加/減少は問題ありません..良い手がかりはありますか?

前もって感謝します!

4

1 に答える 1

1

確率の分布を割り当てるには、バーンスタイン多項式を使用できます。

http://en.wikipedia.org/wiki/Bernstein_polynomial

これらは、de Casteljau のアルゴリズムを使用して効率的に計算できます (基本的に、明らかな方法で再帰に対して DP を実行します)。

http://en.wikipedia.org/wiki/De_Casteljau's_algorithm _

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html

結果として得られるのは、分布に対する一連の重みです。セットの 1 つを選択するには、[0,1] で一様確率変数を生成し、これらの重みに基づいて着陸するセットを選択します。

これを行うPythonのコードを次に示します。

import random

#Selects one of the n sets with a weight based on x
def pick_a_set(n, x):

    #Compute bernstein polynomials
    weights = [ [ float(i == j)  for j in range(n) ] for i in range(n) ]
    for k in range(n):
        for j in range(n-k-1):
            for i in range(n):
                weights[j][i] = weights[j][i] * (1.0 - x) + weights[j+1][i] * x

    #Select using weights
    u = random.random()
    for k in range(n):
        if u < weights[0][k]:
            return k
        u -= weights[0][k]
    return 0
于 2011-06-25T02:29:06.863 に答える