【问题标题】:How should I code the Gambler's Problem with Q-learning (without any reinforcement learning packages)?我应该如何使用 Q-learning 编写赌徒问题(没有任何强化学习包)?
【发布时间】:2022-01-18 10:56:36
【问题描述】:

我想用 MDP(马尔可夫决策过程)来解决赌徒问题。

赌徒的问题:赌徒有机会对一系列掷硬币的结果下注。如果硬币正面朝上,他赢的钱与他在掷硬币时所投入的金额一样多;如果是反面,他将失去赌注。游戏结束时,赌徒达到他的目标 κ 美元获胜,或者因为钱用完而失败。在每次翻转时,赌徒必须决定下注多少(整数)美元。正面的概率是 p,反面的概率是 1 - p。

我使用完全随机的基础策略实现了无模型 Q 学习方法。但是代码没有像我希望的那样工作,我不知道为什么。 感谢您的任何建议。 :)

import numpy as np
import numpy as np
import matplotlib.pyplot as plt
import random

#data
kappa=100 #goal
p=0.25  #probability of the head, winning
eps=0.1 #0.1, 0.005 epsilon
gamma=0.9 #discount factor
alpha=0.1 # 0.1, 1, 10 learning rate
n=1000 #number of training episodes

#Q-learning with totally random base policy
S = [*range(0,kappa+1)] 
A = [*range(0,kappa+1)]

R=np.zeros((kappa+1,kappa+1))
for i in A:
    R[kappa,i]=1

Q=np.zeros((kappa+1,kappa+1))
optimal_policy=np.zeros(kappa+1)

for sa in range(1,kappa):
    i=0
    while i<n:
        s=sa
        while True:
            #choose a random action
            seged=min(s,kappa-s)
            a=np.random.randint(low=1,high=seged+1) #the maximum of my stake is the coins I own
            #take action, observe the state
            rand=random.uniform(0,1)
            if rand < p: #if I win, I got more coins
                s_next = s + a
            else: #if I loose, I loose the stake
                s_next = s - a
                
            Q[s,a]=Q[s,a]+alpha*(R[s_next,a]+(gamma*max(Q[s_next,b] for b in range(0,s_next+1))-Q[s,a]))
            
            if s_next==0:
                break
            if s_next==kappa:
                i=i+1
                break 
            s = s_next
            
for s in range(1,kappa+1):
    optimal_policy[s]=np.argmax(Q[s,])
Q=np.round(Q,2)
print(Q)
print(optimal_policy)

x = np.array(range(0, kappa+1))
y = optimal_policy
plt.xlabel("Amount available (Current State)")
plt.ylabel('Recommended betting amount')
plt.title("Optimal policy: Random base policy (p=" + str(p)+", \u03B1=" + str(alpha)+")")
plt.scatter(x, y)
plt.show()

【问题讨论】:

  • 不是每个人都知道你所说的“赌徒问题”是什么意思,所以你应该简短地描述它,或者链接它。 (我猜你的意思是 Sutton & Barto “强化学习”一书中的示例 4.3。)
  • 感谢您的评论!我会尽快描述它! :)

标签: python reinforcement-learning q-learning coin-flipping markov-decision-process


【解决方案1】:

问题似乎是您的while i&lt;n 循环永远不会终止。

您似乎不小心等到第一次获胜后才递增i。 (当情节以失败告终时,您忘记增加 i。)为了避免这个错误,我建议将该循环写为 for i in range(n),而不是在每个 break 之前增加 i

第一次获胜永远不会发生,因为以 1 美元和 25% 的获胜概率开始时,(实际上)不可能赢得这场比赛。这也意味着你的前几次迭代(从很少的钱开始)不会学到任何东西,因为他们永远不会赢。 R[] 始终为零,Q[] 表中还没有信号在状态之间传播。

我所做的只是在代码中插入一些像print('i:', i) 这样的语句。

【讨论】:

  • 非常感谢您的回答!我是这样编码的,因为你说程序在最初的几个步骤中从未学习过,我想也许我应该只在我们得到奖励时才计算那些迭代。那么你认为如果我计算所有的迭代次数会更好吗?
  • 就我个人而言,我不确定您为什么要遍历初始状态(以及为什么只循环一次)而不是随机选择它们。你是否“计算”这些迭代并不重要,因为你总是更新Q[]。我玩过这个,但结果只是“可以通过”。 (运行速度很慢,Python 不适合这种循环。使用随机操作无济于事 - epsilon-greedy 策略可能效果更好。或者可能还有另一个错误,但我没有看到。)跨度>
  • 谢谢!我改变了循环,计算了每次迭代,它工作得更快并且仍然收敛!谢谢你:)
  • 好答案,它对你有帮助,你应该批准@maxy答案
猜你喜欢
  • 2019-10-12
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多