AI导论实验之网格游戏(马尔可夫决策)
问题1:价值迭代
问题描述
实验来源于伯克利CS188\
项目已将问题形式化为马尔可夫决策过程(Markov decision process,MDP),即MDP\
在 valueIterationAgents.py 中,ValueIterationAgent 类构造方法接收MDP(无折扣因子)及折扣因子\
我们需要做的是实现以下方法包括:
- runValueIteration: 执行价值迭代
- computeActionFromValues(state):根据self.values给出的值函数计算最佳行动
- computeQValueFromValues(state, action):返回根据self.values给出的值函数给出的(状态, 动作)对的Q值
原理介绍
马尔可夫决策过程由五元组$$构成,项目的MDP已经提供了以下接口:
- mdp.getStates():获取MDP的所有状态
- mdp.getPossibleActions(state):当状态确定时,可能发生的所有动作
- mdp.getTransitionStatesAndProbs(state, action):当状态和动作确定时,所有可能的下一状态及其发生的概率
- mdp.getReward(state, action, nextState):当状态,动作及下一状态确定时,得到的即时回报
- mdp.isTerminal(state):判断状态是否为终止状态
价值迭代算法\
对每个状态$s$, 找到动作$a$使动作价值最大为$Q_m$, 更新s对应的状态价值$V=Q_m$及对应的策略为$a$
代码实现
1 | # 价值迭代模板 |
计算动作价值Q1
2
3
4
5
6
7
8
9
10
11
12
13# 根据公式应该使用的函数模板
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得到最好的action1
2
3
4
5
6
7
8
9
10def 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,即可通过测试。1
2
3
4def question2():
answerDiscount = 0.9
answerNoise = 0.0
return answerDiscount, answerNoise