DRL代码学习打卡-1
1. 强化学习方法汇总 (Reinforcement Learning)
1.1
-
不理解环境(model-free)从环境得到反馈来学习,按部就班,一步步学习
- Q-learning
- Sarsa
- policy gradients
-
理解环境(model-based)可以对环境建模,通过想象预判断,根据想象情况选择最好的
- Q-learning
- Sarsa
- policy gradients
1.2
-
基于概率(policy-based)
- 输出各个动作的概率,概率最高未必会选择
- 可以对连续动作用分布表示
- policy gradients
-
基于价值(value-based)
- 输出实数值,选择最大值
- 对于连续动作无能为力
- Q-learning
- Sarsa
-
可以结合以上两种方法的优势
- Actor-Critic
- Actor根据概率做出动作
- Critic根据动作给出价值
1.3
-
回合更新(Monte-Carlo update)
- 游戏开始后等待结束以总结,更新准则
- 基础版 policy gradients
- Monte-Carlo learning
-
单步更新(Temporal-Difference update)
- 在游戏进行中的每一步都在更新,边玩边学习
- Q-learning
- Sarsa
- 升级版 policy gradients
1.4
-
在线学习(on-policy)
- Sarsa
- Sarsa( )
-
离线学习(off-policy)
- Q-learning
- Deep Q network
2. 代码条件
3. Q-learning
- 状态
- 动作
- 奖励
- 建立 Q 表
plz see details in https://blog.csdn.net/qq_23947237/article/details/79153916 and https://blog.csdn.net/qq_23947237/article/details/79628098.
3.1 一个例子
-----o–T
----o—T
—o----T
----o—T
—o----T
----o—T
-----o–T
------o-T
-------oT
-
游戏介绍:小人一开始在中间,可以往左走,或者右走。目标是最右边的 T。
-
我们要实现的内容是:创建游戏环境,让小人学会往右走到达目的地 T。
思路:
- 创建 Q 表,记录存储动作与状态对应的奖励值。
- 让小人选择动作,在某状态下选择某动作(贪婪选择最大奖励对应的动作)
action_name = state_actions.idxmax() # 贪婪模式
pandas: df.idxmax
- 根据选择的动作求环境反馈:获得奖励,转到新的状态
- 环境变化更新,实际上就是小人的状态在环境的变化
- Q-learning 的主循环
def rl():
# main part of RL loop
q_table = build_q_table(N_STATES, ACTIONS)
for episode in range(MAX_EPISODES):
step_counter = 0
S = 0
is_terminated = False
update_env(S, episode, step_counter)
while not is_terminated:
A = choose_action(S, q_table)
S_, R = get_env_feedback(S, A) # take action & get next state and reward
q_predict = q_table.loc[S, A]
if S_ != 'terminal':
q_target = R + GAMMA * q_table.iloc[S_, :].max() # next state is not terminal
else:
q_target = R # next state is terminal
is_terminated = True # terminate this episode
q_table.loc[S, A] += ALPHA * (q_target - q_predict) # update
S = S_ # move to next state
update_env(S, episode, step_counter+1)
step_counter += 1
return q_table
需要大概了解 pandas
的一些用法:
pandas中的索引:loc、iloc、ix的区别(ix 已经不再使用)https://blog.csdn.net/YE1215172385/article/details/79556388
- loc 只能通过标签名来取数据;不能通过索引(第0行,第1行等)来取数据
- iloc 只能通过索引(第0行,第1行等)来取数据;使用标签名则发生错误