选择按概率加权的随机状态

问题描述 投票:1回答:1

我正在尝试为自定义RL算法创建随机环境,此代码的目的是获取有序字典(例如:OrderedDict([(0,1),(1,0),(2,0),( 3,0)])元组中的第一个数字是indx,第二个是概率)并且按照有序字典中定义的状态发生的概率随机加权返回新状态(在上面的例子中有100%的可能性)进入状态0)

我遇到的问题是,由于某种原因,当indx为0时(对于上面的示例输入),概率也是0.我预期概率为1。

在同样的情况下,pcloud [0] == 1这就是我想要的。这意味着我在如何使用枚举方面存在一些错误,但我不知道它是什么。

def collapse(pcloud): 
        randomnum  = Random.uniform(0,1)
        threshold = 0

        for indx , probability in enumerate(pcloud):
            threshold += probability
            if randomnum <= threshold:                    
                return indx
        raise ValueError("For some reason the probabilities can't be compared with the <= operator.")
        #it should never get here.
        return

运行代码创建一个有序字典。

from collections import OrderedDict
import random as Random
#all probabilities should sum to 1
pcloud = OrderedDict()
pcloud[0] = 1
pcloud[1] = 0
pcloud[2] = 0
pcloud[3] = 0

#then run the function
print collapse(pcloud)
python enumerate reinforcement-learning
1个回答
0
投票

你不应该仅仅因为涉及索引而使用enumerate。索引已作为OrderedDict的键出现。你需要迭代你的OrderedDict的键值对,所以你应该在Python 2上迭代它的items()iteritems()(因为items()在Python 2上构建了一个不必要的列表):

for index, probability in pcloud.items():
    ...
© www.soinside.com 2019 - 2024. All rights reserved.