AI导论实验之网格游戏(马尔可夫决策)

问题1:价值迭代

问题描述

实验来源于伯克利CS188
项目已将问题形式化为马尔可夫决策过程(Markov decision process,MDP),即MDP
在 valueIterationAgents.py 中,ValueIterationAgent 类构造方法接收MDP(无折扣因子)及折扣因子
我们需要做的是实现以下方法包括:

  • runValueIteration: 执行价值迭代
  • computeActionFromValues(state):根据self.values给出的值函数计算最佳行动
  • computeQValueFromValues(state, action):返回根据self.values给出的值函数给出的(状态, 动作)对的Q值

原理介绍

马尔可夫决策过程由五元组 < S , A , P , r , γ > <S,A,P,r,γ> <S,A,P,r,γ>构成,项目的MDP已经提供了以下接口:

  • mdp.getStates():获取MDP的所有状态
  • mdp.getPossibleActions(state):当状态确定时,可能发生的所有动作
  • mdp.getTransitionStatesAndProbs(state, action):当状态和动作确定时,所有可能的下一状态及其发生的概率
  • mdp.getReward(state, action, nextState):当状态,动作及下一状态确定时,得到的即时回报
  • mdp.isTerminal(state):判断状态是否为终止状态

价值迭代算法
对每个状态 s s s, 找到动作 a a a使动作价值最大为 Q m Q_m Qm, 更新s对应的状态价值 V = Q m V=Q_m V=Qm及对应的策略为 a a a

代码实现

# 价值迭代模板
def runValueIteration(self):
    delta = 0
    while 1:
        new_values = util.Counter()     # new values after iteration
        for state in self.mdp.getStates():
            max_value = -float("inf")
            for action in self.mdp.getPossibleActions(state):
                value = self.computeQValueFromValues(state=state, action=action)
                max_value = max(value, max_value)
            new_values[state] = max_value if max_value != -float("inf") else 0
            delta = max(abs(new_values[state] - self.values[state]), delta))
        self.values = new_values        # update values, also policy
        if self.theta < delta:
            break
# 实验要求命令行输入迭代次数 -i <iterations>, 故修改为
def runValueIteration(self):
    for i in range(self.iterations):
        new_values = util.Counter()     # new values after iteration
        for state in self.mdp.getStates():
            max_value = -float("inf")
            for action in self.mdp.getPossibleActions(state):
                value = self.computeQValueFromValues(state=state, action=action)
                max_value = max(value, max_value)
            new_values[state] = max_value if max_value != -float("inf") else 0
            delta = max(abs(new_values[state] - self.values[state]), delta))
        self.values = new_values        # update values, also policy

计算动作价值Q

# 根据公式应该使用的函数模板
def computeQValueFromValues(self, state, action):
    sum = self.mdp.getReward(state, action)
    for nextState, prob in self.mdp.getTransitionStatesAndProbs(state=state, action=action):
        sum += self.discount * prob * self.getValue(nextState)
    return sum
# 由于mdp提供的getReward需要三个参数state, action, nextState, 故修改为
def computeQValueFromValues(self, state, action):
    sum = 0
    for nextState, prob in self.mdp.getTransitionStatesAndProbs(state=state, action=action):
        sum += prob * 
            (self.mdp.getReward(state, action) + self.discount * self.getValue(nextState) )
    return sum

根据state得到最好的action

def computeActionFromValues(self, state):
    max_value = -float("inf")
    best_action = None
    for action in self.mdp.getPossibleActions(state):
        # 与价值迭代中求Q值最大的action类似
        value = self.computeQValueFromValues(state=state, action=action)
        if value > max_value:
            best_action = action
            max_value = value
    return best_action

问题2:过桥分析

由题,noise表示智能体在执行操作时以意外的后继状态结束的频率,有一定概率不遵循我们计算得到的策略。故将noise设置为0.0,即可通过测试。

def question2():
    answerDiscount = 0.9
    answerNoise = 0.0
    return answerDiscount, answerNoise
  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值