强化学习之迷宫问题(MC, Sarsa, Q-learning实现)

强化学习-理解及应用:解决迷宫问题 强化学习(Reinforcement Learning, RL)是一种机器学习方法,旨在让智能体(agent)通过与环境的交互学习如何做出最优的行动选择以获得最大的累积奖励。 阅读详情

通过简易迷宫问题,理解Monte-Carlo, Sarsa和Q-learning算法

3×33\times33×3的迷宫如下
在这里插入图片描述
可以通过每一步都随机地走,直到走到S8为止
这里主要写通过强化学习,找到最佳路线

MC算法:

首先定义一个policy,它是一个矩阵,行代表S1~S8
列代表action的4个方向,这里定义方向为↑、→、↓、←的顺序

policy定义为πθ(s,a)\pi_{\theta}(s, a)πθ​(s,a), 其中θ\thetaθ是决定π\piπ的参数,首先定义初始θ0\theta_{0}θ0​
θ0\theta_{0}θ0​矩阵中值为1代表这个方向可以走,如果是墙壁,就定义为np.nan

#row: S0~S7, column: ↑、→、↓、←
#theta: parameter of policy pi(s, a)
theta_0 = np.array([[np.nan, 1, 1, np.nan], #S0
                    [np.nan, 1, np.nan, 1], #S1
                    [np.nan, np.nan, 1, 1], #S2
                    [1, 1, 1, np.nan], #S3
                    [np.nan, np.nan, 1, 1], #S4
                    [1, np.nan, np.nan, np.nan], #S5
                    [1, np.nan, np.nan, np.nan], #S6
                    [1, 1, np.nan, np.nan], #S7
                    #S8 is goal, no policy
    ])

下面由θ0\theta_{0}θ0​求πθ(s,a)\pi_{\theta}(s, a)πθ​(s,a),可以单纯求比例,也可以用softmax
soft公式如下:
P(θi)=exp(βθi)∑i=1Naexp(βθi)P(\theta_{i}) = \frac{exp(\beta\theta_{i})}{\sum_{i=1}^{N_{a}}exp(\beta\theta_{i})}P(θi​)=∑i=1Na​​exp(βθi​)exp(βθi​)​
NaN_{a}Na​表示action的种类数(4个)

#use softmax to get policy
def softmax_convert_into_pi_from_theta(theta):
    beta = 1.0
    [m, n] = theta.shape
    pi = np.zeros((m,n))
    
    exp_theta = np.exp(beta * theta)
    
    for i in range(0, m):
        pi[i, :] = exp_theta[i, :] /np.nansum(exp_theta[i, :])
        
    pi = np.nan_to_num(pi)
    
    return pi

打印初期πθ\pi_{\theta}πθ​可以看到在不同的state下不同action的概率

pi_0 = softmax_convert_into_pi_from_theta(theta_0)
print(pi_0)
#output:
#[[ 0.          0.5         0.5         0.        ]
# [ 0.          0.5         0.          0.5       ]
# [ 0.          0.          0.5         0.5       ]
# [ 0.33333333  0.33333333  0.33333333  0.        ]
# [ 0.          0.          0.5         0.5       ]
# [ 1.          0.          0.          0.        ]
# [ 1.          0.          0.          0.        ]
# [ 0.5         0.5         0.          0.        ]]

通过policy来确定agent的动作
通过π\piπ的概率来选择下一步的action和state

def get_action_and_next_s(pi, s):
    direction = ["up", "right", "down", "left"]
    
    next_direction = np.random.choice(direction, p=pi[s, :])
    
    if next_direction == "up":
        action = 0
        s_next = s - 3
    elif next_direction == "right":
        action = 1
        s_next = s + 1
    elif next_direction == "down":
        action = 2
        s_next = s + 3
    elif next_direction == "left":
        action = 3
        s_next = s - 1
    
    return [action, s_next]

直到走到Goal,一直不停探索路径,到达goal的路径保存在s_a_history

def goal_maze_ret_s_a(pi):
    s = 0  #start
    s_a_history = [[0, np.nan]]
    
    while(1):
        [action, next_s] = get_action_and_next_s(pi, s)
        s_a_history[-1][1] = action
        #print([action, next_s])
        
        s_a_history.append([next_s, np.nan]) #now don't know next action, add np.nan as next action
        
        if next_s == 8:
            break
        else:
            s = next_s
            
    return s_a_history

随机走一条路径

s_a_history = goal_maze_ret_s_a(pi_0)
print(s_a_history)
#output:
#[[0, 2], [3, 0], [0, 2], [3, 0], [0, 1], [1, 3], [0, 2], [3, 0], [0, 2], [3, #1], [4, 2], [7, 0], [4, 3], [3, 1], [4, 2], [7, 1], [8, nan]]
#17 steps

MC算法需要完整的路径来更新policy,所以每次得到完整路径后去更新θ\thetaθ,通过θ\thetaθ得到π\piπ,
重复上面的步骤直到policy收敛
θ\thetaθ的更新公式:
θsi,aj=θsi,aj+η.Δθsi,aj\theta_{s_{i},a_{j}} = \theta_{s_{i},a_{j}} + \eta.\Delta\theta_{s_{i},a_{j}}θsi​,aj​​=θsi​,aj​​+η.Δθsi​,aj​​
Δθsi,aj={N(si,aj)+P(si,aj)N(si,a)}/T\Delta\theta_{s_{i},a_{j}} = \{N(s_{i}, a_{j}) + P(s_{i}, a_{j})N(s_{i}, a)\}/TΔθsi​,aj​​={N(si​,aj​)+P(si​,aj​)N(si​,a)}/T

NNN表示次数,TTT表示到达goal的总step数

def update_theta(theta, pi, s_a_history):
    eta = 0.1  #learning rate
    T = len(s_a_history) - 1
    
    [m, n] = theta.shape
    delta_theta = theta.copy() #deep copy
    
    for i in range(0, m):
        for j in range(0, n):
            if not(np.isnan(theta[i, j])):
                SA_i = [SA for SA in s_a_history if SA[0] == i] #the (s,a) pair with state i
                SA_ij = [SA for SA in s_a_history if SA == [i, j]] #the (s,a) pair with state i, action j
                
                N_i = len(SA_i)
                N_ij = len(SA_ij)
                delta_theta[i, j] = (N_ij + pi[i, j] * N_i) / T
    
    new_theta = theta + eta * delta_theta
    
    return new_theta

MC算法迭代,定义收敛标准

stop_epsilon = 10**-8

theta = theta_0
pi = pi_0

is_continue = True
count = 1

while is_continue:
    s_a_history = goal_maze_ret_s_a(pi)
    new_theta = update_theta(theta, pi, s_a_history)
    new_pi = softmax_convert_into_pi_from_theta(new_theta)
    
    print(np.sum(np.abs(new_pi - pi)))
    print("steps to reach goal is: " + str(len(s_a_history) - 1))
    
    if np.sum(np.abs(new_pi - pi)) < stop_epsilon:
        is_continue = False
    else:
        theta = new_theta
        pi = new_pi

最后确认下收敛后的policy

np.set_printoptions(precision=3, suppress=True) #not display by e
print(pi)
#output
#[[ 0.     0.     1.     0.   ]
# [ 0.     0.38   0.     0.62 ]
# [ 0.     0.     0.474  0.526]
# [ 0.     1.     0.     0.   ]
# [ 0.     0.     1.     0.   ]
# [ 1.     0.     0.     0.   ]
# [ 1.     0.     0.     0.   ]
# [ 0.     1.     0.     0.   ]]

可以看到policy已经可以找到最佳路径,而未收敛的概率处是因为通过最优路径不会再采取那个action,所以仍保留初始附近的概率

Sarsa算法

名称解释,Sarsa指当前State(S), Action(a)得到即时Reward( r), 并通过下一步的State(s), Action(a)得到预期reward

定义Q矩阵,通过ϵ−greedy\epsilon-greedyϵ−greedy方法选择下一步的action, 在每一个step都更新Q值,而不是MC算法的每个episode更新policy
最后Q矩阵收敛可以得到最优路径

Q矩阵的size和上面policy一样,行代表state,列代表action,初始值为random
但是为了保持墙壁的限制条件,让Q乘θ0\theta_{0}θ0​
将Q的terminal state设为0

#row: S0~S7, column: ↑、→、↓、←
#theta: policy pi(s, a)
theta_0 = np.array([[np.nan, 1, 1, np.nan], #S0
                    [np.nan, 1, np.nan, 1], #S1
                    [np.nan, np.nan, 1, 1], #S2
                    [1, 1, 1, np.nan], #S3
                    [np.nan, np.nan, 1, 1], #S4
                    [1, np.nan, np.nan, np.nan], #S5
                    [1, np.nan, np.nan, np.nan], #S6
                    [1, 1, np.nan, np.nan], #S7
                    #S8 is goal, no policy
    ])

[a, b] = theta_0.shape
Q = np.random.rand(a, b) * theta_0
Q[7,3]=0

print(Q)
#output:
[[   nan  0.745  0.711    nan]
 [   nan  0.286    nan  0.385]
 [   nan    nan  0.513  0.056]
 [ 0.501  0.921  0.993    nan]
 [   nan    nan  0.891  0.01 ]
 [ 0.875    nan    nan    nan]
 [ 0.439    nan    nan    nan]
 [ 0.958  0.936    nan  0.   ]]

ϵ−greedy\epsilon-greedyϵ−greedy(选择下一步的action):
greedy表示每次选择Q[s, :]中的最大值作为下一步的action,但是它有一个问题,就是容易陷入local optimal,所以要平衡随机探索和greedy
于是以ϵ\epsilonϵ的概率进行随机探索,1−ϵ1-\epsilon1−ϵ的概率采取greedy
ϵ\epsilonϵ随着step增加而衰减

而且有一个理论,也就是说ϵ−greedy\epsilon-greedyϵ−greedy是可以改进policy的:
for any ϵ−greedy\epsilon-greedyϵ−greedy policy π\piπ, ϵ−greedy\epsilon-greedyϵ−greedy policy π′\pi&#x27;π′ with respect to qπq_{\pi}qπ​ is an improvement. Vπ′(s)≥Vπ(s)V_{\pi&#x27;}(s) \geq V_{\pi}(s)Vπ′​(s)≥Vπ​(s)
证明就不写了

由于涉及到随机探索,所以仍然需要探索用的policy
这里不用softmax,而是用简单的概率

def simple_convert_into_pi_from_theta(theta):
    [m, n] = theta.shape
    pi = np.zeros((m, n))
    for i in range(0, m):
        pi[i, :] = theta[i, :] / np.nansum(theta[i, :])
        
    pi = np.nan_to_num(pi)
    return pi

pi_0 = simple_convert_into_pi_from_theta(theta_0)

实现ϵ−greedy\epsilon-greedyϵ−greedy:

#epsilon-greedy
#get the action
def get_action(s, Q, epsilon, pi_0):
    direction = ["up", "right", "down", "left"]
    #print("s = " + str(s))
    
    #probability epsilon to random search
    if np.random.rand() < epsilon:
        next_direction = np.random.choice(direction, p=pi_0[s, :])
    else:
        #move by the maximum Q
        next_direction = direction[np.nanargmax(Q[s, :])]
    
    if next_direction == "up":
        action = 0
    elif next_direction == "right":
        action = 1
    elif next_direction == "down":
        action = 2
    elif next_direction == "left":
        action = 3
        
    return action
    
#get next state by action
def get_s_next(s, a, Q, epsilon, pi_0):
    direction = ["up", "right", "down", "left"]
    next_direction = direction[a]
    
    if next_direction == "up":
        s_next = s - 3
    elif next_direction == "right":
        s_next = s + 1
    elif next_direction == "down":
        s_next = s + 3
    elif next_direction == "left":
        s_next = s - 1
        
    return s_next

通过state, action更新Q矩阵的Sarsa算法:
推导:
μk=1k∑j=1kxj\mu_{k} = \frac{1}{k}\sum_{j=1}^{k}x_{j}μk​=k1​∑j=1k​xj​
=1k(xk+∑j=1k−1xj)=\frac{1}{k}(x_{k} + \sum_{j=1}^{k-1}x_{j})=k1​(xk​+∑j=1k−1​xj​)
=1k(xk+(k−1)μk−1)=\frac{1}{k}(x_{k} + (k-1)\mu_{k-1})=k1​(xk​+(k−1)μk−1​)
=μk−1+1k(xk−μk−1)=\mu_{k-1} + \frac{1}{k}(x_{k} -\mu_{k-1})=μk−1​+k1​(xk​−μk−1​)

for each state StS_{t}St​ with GtG_{t}Gt​:
N(St)←N(St)+1N(S_{t})\leftarrow N(S_{t})+1N(St​)←N(St​)+1
V(St)←V(St)+1N(St)(Gt−V(St))V(S_{t})\leftarrow V(S_{t}) + \frac{1}{N(S_{t})}(G_{t}-V(S_{t}))V(St​)←V(St​)+N(St​)1​(Gt​−V(St​))

Gt=Rt+1+γV(St+1)G_{t}=R_{t+1} +\gamma V(S_{t+1})Gt​=Rt+1​+γV(St+1​)

得到:
Q(st,at)=Q(st,at)+η∗(Rt+1+γQ(st+1,at+1)−Q(st,at))Q(s_{t}, a_{t}) = Q(s_{t}, a_{t}) + \eta*(R_{t+1} +\gamma Q(s_{t+1},a_{t+1})-Q(s_{t}, a_{t}))Q(st​,at​)=Q(st​,at​)+η∗(Rt+1​+γQ(st+1​,at+1​)−Q(st​,at​))
其中Rt+1+γQ(st+1,at+1)−Q(st,at)R_{t+1} +\gamma Q(s_{t+1},a_{t+1})-Q(s_{t}, a_{t})Rt+1​+γQ(st+1​,at+1​)−Q(st​,at​)叫做TD error

根据上述公式更新Q:

def Sarsa(s, a, r, s_next, a_next, Q, eta, gamma):
    if s_next == 8:  #the goal, next state not exist
        Q[s, a] = Q[s, a] + eta * (r - Q[s, a])
    else:
        Q[s, a] = Q[s, a] + eta * (r + gamma*Q[s_next, a_next] - Q[s, a])
        
    return Q

一个episode:

def goal_maze_ret_s_a_Q(Q, epsilon, eta, gamma, pi):
    s = 0 #start state
    a = a_next = get_action(s, Q, epsilon, pi) #get action by epsilon-greedy
    s_a_history = [[0, np.nan]]
    
    while(1): #until reach the goal
        a = a_next
        
        s_a_history[-1][1] = a
        
        s_next = get_s_next(s, a, Q, epsilon, pi)
        s_a_history.append([s_next, np.nan])
        
        if s_next == 8:
            r = 1 #get the reward
            a_next = np.nan
        else:
            r = 0
            a_next = get_action(s_next, Q, epsilon, pi)
            
        Q = Sarsa(s, a, r, s_next, a_next, Q, eta, gamma)  #update Q
        
        if s_next == 8:
            break
        else:
            s = s_next
    
    return [s_a_history, Q]

完整迭代:

eta = 0.1
gamma = 0.9
epsilon = 0.5
v = np.nanmax(Q, axis=1) #select the maximum Q value for each state
is_continue = True
episode = 1

while is_continue:
    print("episode: " + str(episode))
    
    epsilon = epsilon / 2  #epsilon-greedy
    
    [s_a_history, Q] = goal_maze_ret_s_a_Q(Q, epsilon, eta, gamma, pi_0)
    
    new_v = np.nanmax(Q, axis=1) #maximum value for each state
    
    print(np.sum(np.abs(new_v - v)))
    
    v = new_v
    
    print("steps to reach goal is: " + str(len(s_a_history) - 1))
    
    episode = episode + 1
    if episode > 100:
        break

虽然写了到100 episode,但是从output看出很快就收敛到最优路径

episode: 1
0.227489819094
steps to reach goal is: 14
episode: 2
0.154785251991
steps to reach goal is: 10
episode: 3
0.0105243446365
steps to reach goal is: 4
episode: 4
0.00946282714278
steps to reach goal is: 4
episode: 5
0.00848520483778
steps to reach goal is: 4
episode: 6
0.00758386849718
steps to reach goal is: 4
episode: 7
0.0051117594454
steps to reach goal is: 4
episode: 8

看下收敛后的路径及Q矩阵

print(s_a_history)
#output:
[[0, 2], [3, 1], [4, 2], [7, 1], [8, nan]]

print(Q)
#output:
[[   nan  0.705  0.729    nan]
 [   nan  0.286    nan  0.41 ]
 [   nan    nan  0.513  0.056]
 [ 0.501  0.81   0.775    nan]
 [   nan    nan  0.9    0.088]
 [ 0.875    nan    nan    nan]
 [ 0.575    nan    nan    nan]
 [ 0.928  1.       nan  0.   ]]

标准Sarsa只能backward一步,而Sarsa(λ)\lambda)λ)算法一次可以更新整个路径,与Sarsa不同的是加了一个EEE矩阵
(这个单独写)

Q-learning

Q-learning与Sarsa的区别:

对比Q的更新公式:

Sarsa:
Q(st,at)=Q(st,at)+η∗(Rt+1+γQ(st+1,at+1)−Q(st,at))Q(s_{t}, a_{t}) = Q(s_{t}, a_{t}) + \eta*(R_{t+1} +\gamma Q(s_{t+1},a_{t+1})-Q(s_{t}, a_{t}))Q(st​,at​)=Q(st​,at​)+η∗(Rt+1​+γQ(st+1​,at+1​)−Q(st​,at​))

Q-learning:
Q(st,at)=Q(st,at)+η∗(Rt+1+γmax⁡aQ(st+1,a)−Q(st,at))Q(s_{t}, a_{t}) = Q(s_{t}, a_{t}) + \eta*(R_{t+1} +\gamma \mathop{\max}\limits_{a }Q(s_{t+1},a)-Q(s_{t}, a_{t}))Q(st​,at​)=Q(st​,at​)+η∗(Rt+1​+γamax​Q(st+1​,a)−Q(st​,at​))

可以看到Sarsa更新时需要求并且使用at+1a_{t+1}at+1​,而Q-learning需要用到st+1s_{t+1}st+1​对应的最大Q值。
at+1a_{t+1}at+1​是由决定下一步action的policy决定的,所以Q的更新依赖于policy,称为online-policy
而Q-learning不依赖于决定action的policy,称为offline-policy

Sarsa中用到的ϵ−greedy\epsilon-greedyϵ−greedy中random的部分Q-learning中没有,所以Q-learning有比Sarsa收敛更快的特征

按照Q-learning公式:

def Q_learning(s, a, r, s_next, Q, eta, gamma):
    if s_next == 8:  #goal
        Q[s, a] = Q[s, a] + eta*(r - Q[s, a])
    else:
        Q[s, a] = Q[s, a] + eta*(r + gamma*np.nanmax(Q[s_next,:]) - Q[s, a])
    
    return Q

因为不用ϵ−greedy\epsilon-greedyϵ−greedy,所以action函数去掉随机的部分:

#get the action
def get_action(s, Q):
    direction = ["up", "right", "down", "left"]
    #print("s = " + str(s))    

    next_direction = direction[np.nanargmax(Q[s, :])]
    
    if next_direction == "up":
        action = 0
    elif next_direction == "right":
        action = 1
    elif next_direction == "down":
        action = 2
    elif next_direction == "left":
        action = 3
        
    return action

def get_s_next(s, a):
    direction = ["up", "right", "down", "left"]
    next_direction = direction[a]
    
    if next_direction == "up":
        s_next = s - 3
    elif next_direction == "right":
        s_next = s + 1
    elif next_direction == "down":
        s_next = s + 3
    elif next_direction == "left":
        s_next = s - 1
        
    return s_next

一次episode:

def goal_maze_ret_Q_learning(Q, eta, gamma):
    s = 0 #start state
    a = a_next = get_action(s, Q) #get action by maximum Q value
    s_a_history = [[0, np.nan]]
    
    while(1): #until reach the goal
        a = a_next
        
        s_a_history[-1][1] = a
        
        s_next = get_s_next(s, a)
        s_a_history.append([s_next, np.nan])
        
        if s_next == 8:
            r = 1 #get the reward
            a_next = np.nan
        else:
            r = 0
            a_next = get_action(s_next, Q)
            
        Q = Q_learning(s, a, r, s_next, Q, eta, gamma) #update Q
        
        if s_next == 8:
            break
        else:
            s = s_next
    
    return [s_a_history, Q]

完整迭代到100次:

eta = 0.1 #learning-rate
gamma = 0.9 #decrease rate
v = np.nanmax(Q, axis=1) #maximum value for each state
is_continue = True
episode = 1

V = []   #state value for each episode
V.append(np.nanmax(Q, axis=1))  #get the maximum value for each state

while is_continue:
    print("episode " + str(episode))
    
    [s_a_history, Q] = goal_maze_ret_Q_learning(Q, eta, gamma) #get one path
    
    new_v = np.nanmax(Q, axis=1)
    
    print(np.sum(np.abs(new_v - v))) #get the error
    
    v = new_v
    
    V.append(v)
    
    print("steps to reach goal: " + str(len(s_a_history) - 1))
    episode = episode + 1
    if episode > 100:
        is_continue = False

收敛结果

episode 1
0.100490460992
steps to reach goal: 20
episode 2
0.0969381947436
steps to reach goal: 16
episode 3
0.0943713455446
steps to reach goal: 8
episode 4
0.0932547392558
steps to reach goal: 6
episode 5
0.0918454990963
steps to reach goal: 6
episode 6
0.0904328729472
steps to reach goal: 4
episode 7
0.0895058129093
steps to reach goal: 4
episode 8
0.0885468091866
steps to reach goal: 4
episode 9
0.0875441463751
steps to reach goal: 4
episode 10
0.0864873768061
steps to reach goal: 4
episode 11
0.0853677368575
steps to reach goal: 4
episode 12
0.0841783707317
steps to reach goal: 4
episode 13
0.0829144098366
steps to reach goal: 4
episode 14
0.0815729464098
steps to reach goal: 4
episode 15
0.0801529321705
steps to reach goal: 4
episode 16
0.0786550263091
steps to reach goal: 4
episode 17
0.0770814118009
steps to reach goal: 4
episode 18
0.0754355946909
steps to reach goal: 4
episode 19
0.0737221974552
steps to reach goal: 4
episode 20
0.0719467546908
steps to reach goal: 4
无模型强化学习核心算法:蒙特卡洛与时序差分原理及Sarsa与Q-learning实战对比 如果你是一名生物专业的学生,第一次接触强化学习,可能会觉得它离你的领域很远——不就是训练AI玩游戏吗?但请先别急着划走。想象一下,你正在研究一种蛋白质的折叠过程,或者设计一个药物筛选的实验流程。这些任务本质上都是一个智能体(比如一个模拟的分子或实验方案)在复杂环境中通过不断试错,寻找最优“行为”序列的过程。这不正是强化学习要解决的核心问题吗? 然而,当你翻开经典的强化学习教材,扑面而来的往往是马尔可夫决策过程、贝尔曼方程等数学概念,以及动态规划这类需要完全已知环境模型的方法。这对于没有深厚数学和编程背景的生 阅读详情

相关推荐

SARSA与Q-Learning核心区别:安全策略vs最优策略的工程抉择

时序差分(TD)学习是强化学习中连接理论与现实的关键范式,它通过自举机制实现在线、增量的价值估计,无需完整环境模型也不依赖回合终了反馈。在TD框架下,SARSA作为on-policy方法,基于实际执行的下一个动作更新价值,强调策略稳定性与行为安全性;而Q-Learning作为off-policy方法,采用max操作选取最优后续动作,追求长期累积回报最大化,但可能引发高风险探索。二者差异本质是‘经验主义’与‘理想主义’在决策建模中的体现,直接影响机器人导航、智能控制、金融交易等真实场景的鲁棒性与收敛效率。本文

weixin_30443075的博客 436

强化学习极简例子--迷宫问题

迷宫 图1为一个小型迷宫,其中S为入口,−-−表示墙,+++表示出口。你说出口不在边缘?对的,就是这么任性。 图1. 迷宫 解法1: 单源最短路径 我们把迷宫的各个可达状态进行编号,获得图2. 图2. 编号后的迷宫 将各可达状态看成节点并编号,则相邻节点之间的距离为1,则迷宫可以转成无向图。令0号节点为源,18号节点为目的,则该问题为单源最短路径问题。 但是,我们偏不。 解法2: 强化学习 强化学习有两个实体: 一是环境,即这里的迷宫;二是智能体(Agent),即一个在迷宫是瞎转悠的人。 Agent从源开始

minfanphd的博客 2991

蒙特卡洛On-Policy迷宫求解:强化学习策略收敛实战

蒙特卡洛方法是强化学习中基于完整回合经验进行策略评估与改进的基础技术,其核心原理是通过无偏回报估计实现价值更新,避免时序差分的自举偏差。该方法天然适配离散状态空间与确定性环境建模,在迷宫路径规划等稀疏奖励任务中展现出优异的收敛稳定性与策略可解释性。结合On-Policy机制,确保行为策略与目标策略严格一致,为策略迭代提供理论保障。本文以二维网格迷宫为载体,深入解析首次访问MC、ε-greedy策略衰减、Q值初始化优化及终止状态建模等关键实践环节,覆盖从MDP建模到工程落地的全链路细节。

weixin_33816946的博客 406

强化学习:价值迭代求解迷宫寻路问题

​价值迭代求解迷宫路径规划问题

赛亚茂的博客 1608

强化学习 持续差分算法

强化学习中的持续差分算法主要涉及时序差分(Temporal Difference, TD)学习方法。时序差分方法是一种结合了动态规划和蒙特卡罗方法的强化学习算法,通过在状态间采取行动并获得奖励来更新价值函数,以最大化累积奖励。时序差分学习的核心在于使用TD目标值近似代替实际收获,即当前状态价值的有偏估计,而蒙特卡罗法则使用实际收获进行无偏估计。这种方法允许在没有完整序列的情况下进行学习,且更新速度更快,尤其适用于持续进行的环境。常见的基于时序差分的学习算法包括Q-learning和SARSA。

百态·数智思维 | 聚焦大数据、量化与未来AI 823

强化学习算法案例——一个经典的走迷宫任务。

作者:禅与计算机程序设计艺术 1.简介 在强化学习(Reinforcement Learning, RL)中,有一个经典的任务——走迷宫,其原理简单易懂,但它的实际意义却深远,它让计算机学习如何通过策略网络(policy network),以最佳的方式解决复杂的任务。本文将介绍如何用强化学习解决这个经典

AI天才研究院 3213

强化学习极简入门:通俗理解MDP、DP MC TD和Q学习、策略梯度、PPO

强化学习里面的概念、公式,相比ML/DL特别多,初学者刚学RL时,很容易被接连不断的概念、公式给绕晕,而且经常忘记概念与公式符号表达的一一对应(包括我自己在1.10日之前对好多满是概念/公式的RL书完全看不下去,如今都看得懂了,故如果读文本之前,你正在被RL各种公式困扰,相信看完这篇RL极简入门后就完全不一样了)。

结构之法 算法之道 14万+

Q学习解决迷宫游戏问题

Q学习解决迷宫游戏问题,人工智能行为只能的一种方法。里面有关于问题的阐述

[转载]Reinforcement Learning:Sarsa和Q-learning

Sarsa算法 Sarsa的算法如下: Sarsa算法是on-policy方法,其原始策略和更新策略是一致的,而其更新策略和MC不一样的是其策略更新不需要采样一个完整的轨迹,在执行完一个动作后就可以更新其值函数。 Q-learning算法 Q-learning算法则是一个off-policy的方法,其原始策略和值函数更新策略不一致,同样的也不需要进行采样一个轨迹进行策略更新,和Sarsa算法不一样的是,Q-learning在更新值函数的时候使用的是贪心策略,而不是ϵϵ-greedy策略。..

观林望实的博客 559

从RADIUS服务器到AP:实战搭建一个小型WPA2-Enterprise测试环境(FreeRADIUS + 家用路由器)

本文详细介绍了如何从零搭建WPA2-Enterprise测试环境,使用FreeRADIUS服务器和家用路由器实现企业级WiFi认证。通过实战指南,包括证书生成、EAP-PEAP配置、OpenWrt路由器设置及故障排查,帮助网络工程师和爱好者掌握802.1X协议栈的实际应用。

weixin_28715953的博客 323

RK3588 EVB开发板原理图讲解【六】

该原理图展示了eMMC Flash与主控芯片之间的连接关系,以及相关的电源、信号线路和去耦电容等。

weixin_48721556的博客 1162

时序差分法(TD)实战:从SARSA到Q-Learning的无模型强化学习对比

本文深入探讨了时序差分法(TD)在强化学习中的应用,对比了SARSA和Q-Learning两种无模型算法的实战表现。通过具体案例和公式解析,展示了SARSA的保守特性与Q-Learning的激进策略在不同场景下的优劣,并提供了参数设置和工程实践的实用建议,帮助开发者优化强化学习模型的性能。

weixin_29053067的博客 352

声音编程(Voice Coding) Talon(一) 基本介绍与安装使用

语音编程平台简介 语音编程工具有哪些:Talon是一款声音编程平台,它追求的意义在于完全取代键盘和鼠标。。当前,全球有两个领先的语音编程平台(Programming-By-Speech Platforms)。一是Serenade,它的作用有点像数字助手,可以让你描述正在编程的命令,而不要求你必须逐字逐句地口述每条指令。另一个就是Talon,它提供了对每一行代码更精细的控制,这也意味着你需要对每一个被编入机器的任务有更细致的把握。具体的差别可以参考文章末尾的Serenade 和 Talon编程的例子。 除了这

yinglang19941010的专栏 4139

无模型强化学习:蒙特卡洛与TD算法原理及Sarsa与Q-learning实现

在机器学习领域,强化学习是一种通过智能体与环境交互来学习最优决策序列的方法。其核心原理基于马尔可夫决策过程,通过价值函数评估状态或动作的长期收益。无模型强化学习技术,如蒙特卡洛方法和时序差分算法,无需依赖环境动态模型,仅通过采样经验进行学习,具有重要的工程实践价值。蒙特卡洛方法基于完整回合的回报进行更新,而时序差分算法则结合了动态规划的自举思想,支持在线、增量式学习。这两种方法广泛应用于机器人控制、游戏AI、自动驾驶及生物信息学中的复杂系统建模等场景。本文聚焦于时序差分学习的两个经典算法——Sarsa和Q-

weixin_42530793的博客 307

Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法

Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法 目录 Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、实现步骤 六、关键代码 一、简单介绍 Unity中的一些基础知识点。 本节介绍,Asset Bundle 在 Unity中的使用,入门第一篇,如何AssetBundle标记,如何打包成AssetBundle的操作方法,有不对的地方欢迎指正。...

仙魁XAN 1万+

CMOS sensor 基础

NA

m0_72053187的博客 1657

Reinforcement Learning(强化学习)Sarsa/Q_learning

在说这两种算法之前,先说一下: 蒙特卡罗的方法(MC)和动态规划的方法(DP)   蒙特卡罗方法利用经验平均估计状态的值函数即: 这里的是状态后直到终止状态所有回报的返回值,也就是要得到实验结束才可以进行更新,这样的话太慢。   动态规划说的是可以用后继状态的值函数来估计当前的值函数即 这里的和如果有模型的话就可以根据当前的通过一个策略(这个策略在强化学习中一般就是选取具有最大奖励值...

爱吃火锅的博客 2277

从零到一:Abaqus与Matlab联合仿真的自动化流程构建指南

本文详细介绍了如何构建Abaqus与Matlab联合仿真的自动化流程,涵盖基础架构设计、关键接口技术实现、结果提取与处理技术以及高级参数化优化流程。通过Python脚本作为桥梁,实现数据传递和任务控制,帮助工程师提升仿真效率。特别强调了版本兼容性、异常处理和性能监控等实用技巧。

weixin_29090089的博客 610

强化学习—时序差分算法

强化学习之时序差分算法简介

xiaonuonuoya的博客 1225

从OFED到rdma-core:手把手带你搞定Linux下RDMA开发环境的选型与搭建

本文详细介绍了在Linux系统下搭建RDMA开发环境的完整流程,涵盖OFED与rdma-core的选型对比及分步安装指南。针对高性能计算和分布式存储需求,解析RDMA技术栈的核心组件,提供环境验证与性能测试方法,帮助开发者快速构建稳定高效的开发环境。特别适合需要优化网络性能的工程师参考。

weixin_26905487的博客 225

基于的公司考勤系统(程序+开题报告)(开题报告+源码)

我们将研究和设计系统的架构和功能模块,包括员工信息管理模块、部门信息管理模块、考勤信息记录模块、工资信息计算模块、请假信息处理模块、奖惩信息管理模块、公告信息发布模块、上班打卡模块以及加班申请模块等。目的: 本项目旨在设计并实现一个基于的公司考勤系统,通过该系统,可以实现对员工、部门信息、考勤信息、工资信息、请假信息、奖惩信息、公告信息、上班打卡、加班申请等功能的统一管理。基于的公司考勤系统的设计与实现,旨在通过自动化技术提高考勤管理的效率和准确性,为企业管理提供有力的数据支持。最终成品以下面运行环境。

迟限程序设计 997

【强化学习】(二)从有偏无偏估计到强化学习三大求解器:DP、MC与TD

DP是“上帝视角”的精确规划,MC是“算总账”的无偏经验,TD是“边干边估”的有偏自举。三者从完全模型走向完全无模型,从无偏走向有偏,本质是在偏差与方差之间做权衡,以换取实际应用中的可行性与效率。

2503_91504671的博客 520

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TD-Learning实战指南:从Q-learning到SARSA的工业级调参与避坑

时间差分学习(TD Learning)是强化学习落地的关键范式,它通过单步自举(bootstrapping)突破蒙特卡洛方法对完整轨迹的依赖,实现在线、低延迟的价值更新。其核心在于TD error计算、on-policy与off-policy策略解耦,以及ϵ-greedy等探索机制的动态协同。技术价值体现在收敛效率高、内存开销可控、易于工程化部署,广泛应用于智能控制、推荐系统、机器人导航与工业调度等实时决策场景。本文聚焦TD-Learning在OpenAI Gym经典环境中的可复现实现,深入剖析Q-lear

weixin_32487557的博客 562

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【具身智能基础】强化学习

本文系统介绍了强化学习的核心概念与主流算法。首先阐述了强化学习的基本框架,包括智能体与环境交互、马尔可夫决策过程、蒙特卡洛采样等基础理论。随后详细解析了时序差分(TD)方法体系,包括Q-Learning、SARSA及其深度版本DQN等价值型算法。然后重点讨论了策略梯度(PG)方法及其改进版本Actor-Critic架构,涵盖A2C、A3C、DDPG、PPO、GRPO、DPO等算法。

AI²OT的博客 993

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

从零开始构建Q表格:强化学习中的状态-动作映射艺术

本文详细介绍了如何从零开始构建Q表格,深入解析强化学习中的状态-动作映射技术。通过GridWorld示例和代码实现,展示了Q表格的初始化、Bellman方程应用及训练算法对比(蒙特卡洛、时序差分、Q学习),帮助读者掌握表格法在强化学习中的核心应用与实践技巧。

ansible6ops的博客 158

【深度强化学习精通】第3讲 | 蒙特卡洛与时序差分:无模型学习

蒙特卡洛方法:基于完整回合的回报进行估计,无偏但方差大,仅适用于回合制任务。时序差分学习:结合自举思想,可以在线学习,方差小但有偏。SARSA:同策略TD控制,学习实际执行策略的价值,较为保守。Q-Learning:异策略TD控制,学习最优策略的价值,较为激进。n步TD与资格迹:在MC和TD(0)之间进行权衡,提供了更灵活的更新方式。

帅哥 511
上一篇: leetcode 204. Count Primes (n以下的质数个数)
下一篇: 强化学习之CartPole游戏(Q-learning)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值