鱼C论坛

 找回密码
 立即注册
查看: 1685|回复: 1

[技术交流] 《用Python动手学习强化学习》【价值迭代】【动态规划】

[复制链接]
发表于 2021-9-20 11:06:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖逗 于 2021-9-20 15:56 编辑

代码出处:《用Python动手学习强化学习》第二章:基于动态规划的价值近似学习(价值迭代)

  1. class Planner():
  2.     def __init__(self, env):
  3.         self.env = env
  4.         self.log = []
  5.    
  6.     def initialize(self):
  7.         self.env.reset()
  8.         self.log = []
  9.    
  10.     def plan(self, gamma = 0.9, threshold = 0.0001):
  11.         raise Exception("Planner have to implements plan method.")
  12.         
  13.     def transitions_at(self, state, action):
  14.         transition_probs = self.env.transit_func(state, action)
  15.         for next_state in transition_probs:
  16.             prob = transition_probs[next_state]
  17.             reward, _ = self.env.reward_func(next_state)
  18.             yield prob, next_state, reward
  19.   
  20.     def dict_to_grid(self, state_reward_dict):
  21.         grid = []
  22.         for i in range(self.env.row_length):
  23.             row = [0] * self.env.column_length
  24.             grid.append(row)
  25.         for s in state_reward_dict:
  26.             grid[s.row][s.column] = state_reward_dict[s]
  27.         return grid

  28. class ValueIterationPlanner(Planner):
  29.     def __init__(self, env):
  30.         super().__init__(env)
  31.         
  32.     def plan(self, gamma = 0.9, threshold = 0.0001):
  33.         self.initialize()
  34.         actions = self.env.actions
  35.         V = {}
  36.         for s in self.env.states:
  37.             V[s] = 0
  38.         
  39.         while True:
  40.             delta = 0
  41.             self.log.append(self.dict_to_grid(V))
  42.             for s in V:
  43.                 if not self.env.can_action_at(s):
  44.                     continue
  45.                 expected_rewards = []
  46.                 for a in actions:
  47.                     r = 0
  48.                     for prob, next_state, reward in self.transitions_at(s, a):
  49.                         r += prob * (reward + gamma * V[next_state])
  50.                     expected_rewards.append(r)
  51.                     
  52.                 max_reward = max(expected_rewards)
  53.                 delta = max(delta, abs(max_reward - V[s]))
  54.                 V[s] = max_reward
  55.             
  56.             if delta < threshold:
  57.                 break
  58.         
  59.         V_grid = self.dict_to_grid(V)
  60.         return V_grid
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-20 13:35:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 14:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表