import numpy as np
import random
# 初始化矩阵
Q = np.zeros((6, 6))
Q = np.matrix(Q)#评估函数Q(s,a)的函数值是从状态s开始选择第一个动作a执行后获得的最大累积回报的折算值
# 回报矩阵R
R = np.matrix([[-1,-1,-1,-1,0,-1],[-1,-1,-1,0,-1,100],[-1,-1,-1,0,-1,-1],[-1,0,0,-1,0,-1],[0,-1,-1,0,-1,100],[-1,0,-1,-1,0,100]])
#,把状态图和即时奖励值放到下面的奖励值表“回报矩阵R"中:(-1表示不可选择的动作,两个状态间没有连接),由当前状态和选取的回报函数决定,理解是不考虑就近选下一个哪一个状态
# 设立学习参数
γ = 0.8
# 训练
for i in range(2000):
# 对每一个训练,随机选择一种状态
state = random.randint(0, 5)
while True:
# 选择当前状态下的所有可能动作
r_pos_action = []
for action in range(6):
if R[state, action] >= 0:
r_pos_action.append(action)
next_state = r_pos_action[random.randint(0, len(r_pos_action) - 1)]
Q[state, next_state] = R[state, next_state] + γ *(Q[next_state]).max() #更新 ;相当于是跳的,不是说每行依次的执行
#比较神奇,R相当于一个及时回报,首先在R矩阵中找到一些列大于0的动作,随机选取一个作为下一个状态
#感觉Q矩阵就是一个累计的奖励,他等于在当前转态下执行那个动作到达下一个转态的及时奖励R[state, next_state]再加上折扣因子γ乘以转换到下一个状态后最大的Q值
state = next_state
# 状态4位最优库存状态
if state==5: #如果到达了状态5开始了新的一轮循环
break
print(Q)
Q-表格学习
于 2020-11-10 20:54:35 首次发布