1

各状態で少なくとも 10 個のアクションがある Q ラーニングでボルツマン探索を使用しています。たった 2 つのアクションで、ボルツマン探査を次のように非常に簡単に適用できることを私は知っています。

  1. ボルツマン探査方程式を使用して、2 つのアクションの pr1 と pr2 を計算します。
  2. 乱数rを生成する
  3. pr1>pr2 とする。r<=pr1 の場合、確率 pr1 に対応するアクションを実行します。r>pr1 の場合、pr2 に対応するアクションを実行します。

しかし、どうすれば10個のアクションでこれを行うことができますか? 各決定ステップで、すべてのアクションの確率を更新します。これにより、最善のアクションの確率が最も高いすべてのアクションの確率分布が得られます。この場合、ボルツマン探査を使用してアクションを選択するにはどうすればよいですか?

4

2 に答える 2

2

おそらくもっと良い方法がありますが、主なアイデアは次のとおりです。

def weighted_choice(weights):
    r = uniform(0, sum(weights))
    for i, weight in enumerate(weights):
        r -= weight
        if(r < 0):
            return i

ここで、weights は pr1、pr2、.. のリストであり、戻り値は勝利アクションのインデックスです。

于 2012-08-07T14:10:47.190 に答える
0

加重ランダム サンプリングの優れた説明は次のとおりです: Darts、Dice、および Coins

Vose の Alias メソッドの実装は次のとおりです。

class WeightedRandom
{
    private alias : array[int];
    private prob  : array[double];

    private random : Random;

    public this(p : array[double], random : Random)
    {
        this.random = random;

        def n = p.Length;

        alias = array(n);
        prob  = array(n);

        def small = Queue(n);
        def large = Queue(n);

        def p = p.Map(_ * n : double);

        foreach (x in p with i)
            (if (x < 1.0) small else large).Enqueue(i);

        while (!small.IsEmpty && !large.IsEmpty)
        {
            def s = small.Dequeue();
            def l = large.Dequeue();
            prob[s]  = p[s];
            alias[s] = l;
            p[l] = p[l] + p[s] - 1;
            (if (p[l] < 1.0) small else large).Enqueue(l);
        }

        while (!large.IsEmpty)
            prob[large.Dequeue()] = 1.0;

        while (!small.IsEmpty)
            prob[small.Dequeue()] = 1.0;
    }

    public NextIndex() : int
    {
        def i = random.Next(prob.Length);
        if (random.NextDouble() < prob[i])
            i;
        else
            alias[i];
    }
}
于 2012-08-07T20:14:13.930 に答える