强化学习之利用SARAS学习解决出租车问题

''' 利用SARAS学习解决出租车问题 '''

"""
智能体必须在一个位置上接上乘客并在另一个位置放下乘客。
成功放下乘客,那么智能体将会得到奖励+20分,且每经过一
个时间步得到-1分。如果智能体错误搭载和放下,则会得到
-10分。因此,智能体的目标就是学习在最短时间内在正确的
位置搭载和放下乘客,且不会搭载非法乘客。
            +---------+
            |R: | : :G|
            | : : : : |
            | : : : : |
            | | : | : |
            |Y| : |B: |
            +---------+
其中字母(R, G, Y, B)分别表示4个不同位置。
"""
import random
import gym
env = gym.make('Taxi-v1')

env.render()  # 输出出租车环境

alpha = 0.4
gamma = 0.999
epsilon = 0.017

# 将Q表初始化为字典来保存状态-行为值
Q = {}
for s in range(env.observation_space.n):
    for a in range(env.action_space.n):
        Q[(s, a)] = 0.0

# 定义一个称为epsilon_greedy 的函数来根据epsilon贪婪策略选择行为
def epsilon_greedy(state, epsilon):
    if random.uniform(0, 1) < epsilon:
        return env.action_space.sample()
    else:
        return max(list(range(env.action_space.n)), key=lambda x: q[(state, x)])

for i in range(4000):
    # 在r中保存每个情景的累计奖励
    r = 0
    # 在每次迭代中初始化状态
    state = env.reset()
    # 根据贪婪策略选择行为
    action = epsilon_greedy(state, epsilon)
    while True:
        # 在状态下执行行为,并转移到下一状态
        nextstate, reward, done, _ = env.step(action)
        # 根据贪婪策略选取下一行为
        nextaction = epsilon_greedy(nextstate, epsilon)
        # 利用更新规则计算上一状态的Q值
        Q[(state, action)] += alpha * (reward + gamma * Q[(nextstate, nextaction)] - Q[(state, action)])

        # 最后,将状态和行为更新为下一状态和行为
        action = nextaction
        state = nextstate
        r += reward
        # 若情景到达终止状态,则停止
        if done:
            break

    print("total reward: ", r)

env.close()

你可能感兴趣的:(强化学习,强化学习,SARAS)