归纳一下这个project里遇到的问题:
- random.random()
choose action函数里有一个要求:
When not learning, choose a random actionWhen learning, choose a random action with ‘epsilon’ probabilityOtherwise, choose an action with the highest Q-value for the current state
即在学习过程中,choose action以epsilon的概率随机选择一个随机action,以1-epsilon的概率选择相应state下Q-value最高的action;
那么怎样以epsilon的概率随机选择一个随机action呢?给出的方法是:
if random.random() < self.epsilon:
action = random.choice(self.valid_actions)
这里要理解为什么 random.random() < self.epsilon 就代表了以epsilon的概率进行选择;简单来说,random.random()返回的随机数是在[0,1)范围内符合均匀分布的,因此返回的值x既是随机数,也是x落在范围[0,x)的概率值,即 ∫x01(1−0)dx=x ;
按照概率论中的理论:
1.连续型随机变量X的概率密度函数为
所以 f(x) = 1。
2.累积分布函数F(x)=P(x < X),表示x < X的概率,为:
所以在(0,1)均匀分布的变量的累计函数为,其中a=0,b=1,可以得到F(X)=X,也就是F(epsilon) = epsilon, 也就是 P(x< epsilon) = epsilon. 也就是 P(random.random() < epsilon) = epsilon
还要注意的一点是,这种写法其实是不对的:
import numpy as np
random_action=random.choice(valid_actions)
action = np.random.choice([random_action, best_action],[epsilon, 1-epsilon])
因为在Q学习里,对模拟退火算法的定义是:以小于epsilon的概率随机选择动作,以大于等于1-epsilon的概率选择最优动作。注意是要小于epsilon,而不是等于epsilon,上面的写法实际上是概率等于epsilon,所以是不对的。