我在Q学习中使用Boltzman探索,在每个状态中至少有10个动作。我知道,只有两个动作,玻尔兹曼探索就可以非常简单地应用如下:


使用Boltzman探索方程计算两个动作的pr1和pr2。
产生一个随机数r
假设pr1> pr2。如果r pr1,则采取对应于pr2的措施。


但是,我该如何执行10个动作?在每个决策步骤,我都会更新所有动作的概率。这给了我最佳行动可能性最高的所有行动的概率分布。在这种情况下,如何使用Boltzman探索选择动作?

最佳答案

这是加权随机抽样的绝佳讨论:Darts, Dice, and 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];
    }
}

关于machine-learning - 在Q学习中进行两个以上 Action 的Boltzmann探索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11846387/

10-12 18:51