6.8 KiB
6.8 KiB
In [2]:
import numpy as np
# 假设我们在状态 s1 算出了 5 个动作的 Q 值 (参考书中 3.1 节的计算)
# a1: 向上, a2: 向右, a3: 向下, a4: 向左, a5: 原地不动
q_values_s1 = {
"a1": 6.2, # 撞墙,-1 + 0.9*v(s1)
"a2": 8.0, # 原策略向右,进禁区,-1 + 0.9*v(s2)
"a3": 9.0, # 向下避开禁区,0 + 0.9*v(s3)
"a4": 6.2, # 撞墙,-1 + 0.9*v(s1)
"a5": 7.2 # 原地不动,0 + 0.9*v(s1)
}
# 寻找使 Q 值最大的动作 (贪心策略 Greedy Policy)
best_action = max(q_values_s1, key=q_values_s1.get)
max_q_value = q_values_s1[best_action]
print("--- 策略改进演示 ---")
for action, q_val in q_values_s1.items():
print(f"动作 {action} 的价值: {q_val}")
print(f"\n=> 最佳动作是 '{best_action}',其价值为 {max_q_value}。")
print("结论:只要我们在每个状态都选择 Q 值最大的动作,就能得到一个更好的、甚至是最优的策略!")--- 策略改进演示 --- 动作 a1 的价值: 6.2 动作 a2 的价值: 8.0 动作 a3 的价值: 9.0 动作 a4 的价值: 6.2 动作 a5 的价值: 7.2 => 最佳动作是 'a3',其价值为 9.0。 结论:只要我们在每个状态都选择 Q 值最大的动作,就能得到一个更好的、甚至是最优的策略!
In [3]:
# 验证:假设两条路径,路径A直达终点(2步),路径B绕路(4步)
gamma = 0.9
target_reward = 10.0
print("--- 情景 1:每走一步没有任何惩罚 (即时奖励为 0) ---")
# 路径A: 0 + 0.9 * 10
return_path_A = 0 + (gamma ** 1) * target_reward
# 路径B: 0 + 0.9*0 + 0.9^2*0 + 0.9^3 * 10
return_path_B = 0 + 0 + 0 + (gamma ** 3) * target_reward
print(f"直达路径(A)的回报: {return_path_A}")
print(f"绕路路径(B)的回报: {return_path_B}")
print("结论:哪怕每步惩罚是 0,因为有 gamma 的折现,智能体依然知道直达路径更好!\n")
print("--- 情景 2:给每一步都增加 -1 的惩罚 (仿射变换) ---")
# 路径A: -1 + 0.9 * (10 - 1) -> 简化理解为每步 -1,最后一步拿到目标
return_path_A_penalty = -1 + (gamma ** 1) * target_reward
# 路径B: 绕远路
return_path_B_penalty = -1 + gamma*(-1) + (gamma**2)*(-1) + (gamma**3)*target_reward
print(f"增加惩罚后,直达路径(A)的回报: {return_path_A_penalty:.2f}")
print(f"增加惩罚后,绕路路径(B)的回报: {return_path_B_penalty:.2f}")
print("结论:增加统一惩罚后,直达路径(A)依然大于绕路路径(B)。相对好坏关系不变,最优策略不变。")--- 情景 1:每走一步没有任何惩罚 (即时奖励为 0) --- 直达路径(A)的回报: 9.0 绕路路径(B)的回报: 7.290000000000001 结论:哪怕每步惩罚是 0,因为有 gamma 的折现,智能体依然知道直达路径更好! --- 情景 2:给每一步都增加 -1 的惩罚 (仿射变换) --- 增加惩罚后,直达路径(A)的回报: 8.00 增加惩罚后,绕路路径(B)的回报: 4.58 结论:增加统一惩罚后,直达路径(A)依然大于绕路路径(B)。相对好坏关系不变,最优策略不变。
In [ ]: