强化学习数学原理(三)——迭代算法

一、值迭代过程

v=\max_\pi(r_\pi+\gamma P_\pi v)

        上面是贝尔曼最优公式,之前我们说过,f(v)=v,贝尔曼公式是满足contraction mapping theorem的,能够求解除它最优的策略和最优的state value,我们需要通过一个最优v*,这个v*来计算状态pi*,而vk通过迭代,就可以求出唯一的这个v*,而这个算法就叫做值迭代。V(s)是状态s的最优价值,R是在状态s时执行动作a可获得的,y是折扣因子(衰减系数),还有状态概率矩阵P

1.1 初始化状态价值函数

        我们说过,这个函数有两个未知量。v与pi,因此要计算最优策略,我们就需要先假设一个初始值。选择一个初始值先来表示每个状态的价值。假设我们就可以设置所有价值V(s)都为0

1.2 迭代更新价值函数

        使用贝尔曼最优方程更新状态价值函数,对于与每个状态s,计算改状态下所有可能的动作a下的期望值,然后选择最大值作为新的状态价值函数。Vk是第k次迭代时s的状态,他会更新为k+1,直到k+1是最优时刻为止,具体的更新公式为:

v_{k+1}=f(v_k)=\max_\pi(r_\pi+\gamma P_\pi v_k)

        这上面就包含了所说了两个步骤

        第一步 ploicy update:\pi_{k+1}=\arg\max_\pi(r_\pi+\gamma P_\pi v_k)

        第二部 value update:v_{k+1}=r_{\pi_{k+1}}+\gamma P_{\pi_{k+1}}v_k

        每次更新一个pik+1之后代入,就可以得到迭代后的vk+1,但是这里有个点,迭代过程中,左侧他是vk+1,所以他并不是我们所说的state value,他是一个值,

1.2.1 Ploicy update

\pi_{k+1}=\arg\max_\pi(r_\pi+\gamma P_\pi v_k)

        我们把上面的公式具体的拆成每个状态对应的element,得到

\pi_{k+1}(s)=\arg\max_{\pi}\sum_{a}\pi(a|s)\underbrace{\left(\sum_{r}p(r|s,a)r+\gamma\sum_{s^{\prime}}p(s^{\prime}|s,a)v_{k}(s^{\prime})\right)}_{q_{k}(s,a)}

        vk是已知的(假设了v0,假设现在就是v0,求pi1),那么qk(s,a)  (q1)是已知的,最优策略,就会选取qk最大时的action,其他行动为0,这样就只与q(s,a)相关,那么pik+1就知道了,就是pik+1(s)最大的一个

\left.\pi_{k+1}(a|s)=\left\{\begin{array}{ll}1&a=a_k^*(s)\\0&a\neq a_k^*(s)\end{array}\right.\right.

1.2.2 Value update

        对于其elementwise form v_{k+1}(s)=\sum_a\pi_{k+1}(a|s)\underbrace{\left(\sum_rp(r|s,a)r+\gamma\sum_{s^{\prime}}p(s^{\prime}|s,a)v_k(s^{\prime})\right)}_{q_k(s,a)}

        按照迭代顺序写出每一个值,从1.2.1,我们就可以知道,qk(s,a)是能求出的,注意一点,策略迭代里面,求出了最大的value对应的state,那么我们就知道这个pik+1,求出最后的结果

v_{k+1}(s)=\max_aq_k(a,s)

1.3 判断收敛性

        每次迭代后,检查状态价值函数的变化。如果状态价值变化小于某个阈值(例如 ϵ\epsilonϵ),则认为收敛,可以终止迭代。常见的收敛条件是:

\max_s|V_{k+1}(s)-V_k(s)|<\epsilon

通常  \epsilon  是一个小的正数,用于表示精度要求。如果状态价值函数的变化足够小,算法收敛。

        根据例子,给出一个python代码

import numpy as np# 初始化参数
gamma = 0.9  # 折扣因子
epsilon = 1e-6  # 收敛阈值
max_iterations = 1000  # 最大迭代次数
S = 4  # 状态空间大小
A = 5  # 动作空间大小# 转移概率矩阵 P(s'|s, a) - 4x5x4 的三维矩阵
P = np.zeros((S, A, S))## 顺时针行动
# 奖励函数 R(s, a) - 4x5 的矩阵
R = np.array([[-1, 4, -1, -1, -1],[-1, 4, -1, -1, -1],[4, -1, -1, -1, -1],[-1, -1, -1, -1, 1]])# 转移概率矩阵
# 动作 a=1
P[:, 0, :] = np.array([[0.8, 0.1, 0.1, 0],[0.1, 0.8, 0.1, 0],[0.2, 0.2, 0.6, 0],[0, 0, 0, 1]])# 动作 a=2
P[:, 1, :] = np.array([[0.6, 0.3, 0.1, 0],[0.1, 0.7, 0.2, 0],[0.3, 0.3, 0.4, 0],[0, 0, 0, 1]])# 动作 a=3
P[:, 2, :] = np.array([[0.7, 0.2, 0.1, 0],[0.1, 0.8, 0.1, 0],[0.2, 0.2, 0.6, 0],[0, 0, 0, 1]])# 动作 a=4
P[:, 3, :] = np.array([[0.5, 0.4, 0.1, 0],[0.2, 0.7, 0.1, 0],[0.4, 0.4, 0.2, 0],[0, 0, 0, 1]])# 动作 a=5
P[:, 4, :] = np.array([[0.9, 0.05, 0.05, 0],[0.05, 0.9, 0.05, 0],[0.1, 0.1, 0.8, 0],[0, 0, 0, 1]])# 初始化状态价值函数 V(s)
V = np.zeros(S)# 记录最优策略
pi = np.zeros(S, dtype=int)# 值迭代算法
for k in range(max_iterations):V_new = np.zeros(S)delta = 0  # 最大值变化# 遍历每个状态for s in range(S):# 对每个动作计算期望回报value = -float('inf')  # 当前最大回报(初始化为负无穷)for a in range(A):# 计算该动作下的期望回报expected_return = R[s, a] + gamma * np.sum(P[s, a, :] * V)value = max(value, expected_return)  # 保持最大的期望回报# 更新当前状态的价值V_new[s] = valuedelta = max(delta, abs(V_new[s] - V[s]))  # 计算状态价值的变化# 更新状态价值V = V_new# 如果变化小于 epsilon,认为收敛if delta < epsilon:break# 根据最优状态价值函数计算最优策略
for s in range(S):max_value = -float('inf')best_action = -1for a in range(A):# 计算每个动作下的期望回报expected_return = R[s, a] + gamma * np.sum(P[s, a, :] * V)if expected_return > max_value:max_value = expected_returnbest_action = api[s] = best_action# 输出结果
print("最优状态价值函数 V*(s):")
print(V)print("最优策略 pi*(s):")
print(pi)

MATLAB实现:

% 初始化参数
gamma = 0.9;        % 折扣因子
epsilon = 1e-6;     % 收敛阈值
max_iterations = 1000; % 最大迭代次数
S = 4;              % 状态空间大小
A = 5;              % 动作空间大小% 转移概率矩阵 P(s'|s, a) - 4x5x4 的三维矩阵
P = zeros(S, A, S);% 奖励函数 R(s, a) - 4x5 的矩阵
R = [-1, 4, -1, -1, -1;-1, 4, -1, -1, -1;4, -1, -1, -1, -1;-1, -1, -1, -1, 1];% 转移概率矩阵
% 动作 a=1
P(:, 1, :) = [0.8, 0.1, 0.1, 0; 0.1, 0.8, 0.1, 0; 0.2, 0.2, 0.6, 0; 0, 0, 0, 1];% 动作 a=2
P(:, 2, :) = [0.6, 0.3, 0.1, 0;0.1, 0.7, 0.2, 0;0.3, 0.3, 0.4, 0;0, 0, 0, 1];% 动作 a=3
P(:, 3, :) = [0.7, 0.2, 0.1, 0;0.1, 0.8, 0.1, 0;0.2, 0.2, 0.6, 0;0, 0, 0, 1];% 动作 a=4
P(:, 4, :) = [0.5, 0.4, 0.1, 0;0.2, 0.7, 0.1, 0;0.4, 0.4, 0.2, 0;0, 0, 0, 1];% 动作 a=5
P(:, 5, :) = [0.9, 0.05, 0.05, 0;0.05, 0.9, 0.05, 0;0.1, 0.1, 0.8, 0;0, 0, 0, 1];% 初始化状态价值函数 V(s)
V = zeros(S, 1);% 记录最优策略
pi = zeros(S, 1);% 值迭代算法
for k = 1:max_iterationsV_new = zeros(S, 1);delta = 0; % 最大值变化% 遍历每个状态for s = 1:S% 对每个动作计算期望回报value = -Inf; % 当前最大回报(初始化为负无穷)for a = 1:A% 计算该动作下的期望回报expected_return = R(s, a) + gamma * sum(squeeze(P(s, a, :)) .* V);value = max(value, expected_return); % 保持最大的期望回报end% 更新当前状态的价值V_new(s) = value;delta = max(delta, abs(V_new(s) - V(s))); % 计算状态价值的变化end% 更新状态价值V = V_new;% 如果变化小于 epsilon,认为收敛if delta < epsilonbreak;end
end% 根据最优状态价值函数计算最优策略
for s = 1:Smax_value = -Inf;best_action = -1;for a = 1:A% 计算每个动作下的期望回报expected_return = R(s, a) + gamma * sum(squeeze(P(s, a, :)) .* V');if expected_return > max_valuemax_value = expected_return;best_action = a;endendpi(s) = best_action;
end% 输出结果
disp('最优状态价值函数 V*(s):');
disp(V);disp('最优策略 pi*(s):');
disp(pi);

        在这描述一下如何代码的运行流程,首先我们定义了衰减率,收敛阈值,需要迭代的次数,有多少个状态,有多少个动作,然后设置在每个状态下,动作的奖励R,还有状态概率矩阵P,在s状态下执行a跳到si的概率是多少,以代码和视频内的 4状态5动作举例,设置的P是个4*5*4的矩阵,策略pi会是个4*1的矩阵,他的作用就是记录4个状态的行动,所有有多少状态,他就是n*1.在正式值迭代里进行循环,首先需要给 V state value一个初始值,接着遍历每一个状态,在各个状态下采取行动,从s1到s4,计算a1到a5行动,代入到公式里

v=\max_\pi(r_\pi+\gamma P_\pi v)

       每一次计算就是一次标量的计算,value保存其中最大的值,然后对V进行更新,当更新值小于阈值的时候,就收敛停止。

        现在计算出来每个状态的V,就对状态s遍历,用同样的方法进行遍历,但是这次需要记录获得最大值的a,把他记录到策略里。修改奖励与衰减系数可得到不同V

二、策略迭代过程

        策略迭代 Policy lteration用于求解马尔可夫MDP最优策略的经典算法,其中有策略评估PE和策略改进PI两个关键步骤。策略迭代算法的核心思想是通过交替进行策略评估和策略改进两个步骤,不断优化策略,直到找到最优策略。具体来说,算法从一个初始策略开始,首先对该策略进行评估,计算出该策略下每个状态的价值函数;然后根据计算得到的价值函数对策略进行改进,得到一个新的策略;接着对新的策略进行评估,如此反复,直到策略不再发生变化,此时得到的策略即为最优策略 。算出整体的return进行比较,确认最好的策略,相当于从整体上看

2.1 初始化策略

        值迭代我们说,需要一个初始的V,当然这里也是需要V的,就假设初始的state 策略迭代时生成了一个策略pi0(s),其中pi0(s)表示在状态s下采取动作的概率分布。

2.2 策略评估

        给定一个策略 ,策略评估的目标是计算该策略下的状态价值函数 V 。状态价值函数V  表示从状态 s 开始,遵循策略  pi 所获得的期望累积折扣奖励。可以通过以下贝尔曼方程来计算:

V^\pi(s)=\sum_{a\in A}\pi(a|s)\left[R(s,a)+\gamma\sum_{s^{\prime}\in S}P(s^{\prime}|s,a)V^\pi(s^{\prime})\right]

        ​​v_{\pi_k}=r_{\pi_k}+\gamma P_{\pi_k}v_{\pi_k}

按照迭代的方式我们写作

        实际实现中,我们通常用的都是上面所说的之迭代来让state value收敛,这就不多做说明了

2.3 策略改进(PI)

        根据评估得到了Vpi(s),评估了当前策略的好坏,但是我们知道,有了V就可以对pi进行改进,选择能让未来期望积累折扣奖励最大的动作作为新的策略,当策略不变化时,作为最优策略返回

\pi_{k+1}=\arg\max_\pi(r_\pi+\gamma P_\pi v_{\pi_k})

        值迭代通过直接优化state value,每次计算最大的期望回报,更新状态,最后根据最优状态函数来推导出最优策略.策略迭代就是通过上面所说的方法进行不断更新

% 初始化参数
gamma = 0.9;        % 折扣因子
epsilon = 1e-6;     % 收敛阈值
max_iterations = 1000; % 最大迭代次数
S = 4;              % 状态空间大小
A = 5;              % 动作空间大小% 转移概率矩阵 P(s'|s, a) - 4x5x4 的三维矩阵
P = zeros(S, A, S);% 奖励函数 R(s, a) - 4x5 的矩阵
R = [-1, 4, -1, -1, -1;-1, 4, -1, -1, -1;4, -1, -1, -1, -1;-1, -1, -1, -1, 1];% 转移概率矩阵
% 动作 a=1
P(:, 1, :) = [0.8, 0.1, 0.1, 0; 0.1, 0.8, 0.1, 0; 0.2, 0.2, 0.6, 0; 0, 0, 0, 1];% 动作 a=2
P(:, 2, :) = [0.6, 0.3, 0.1, 0;0.1, 0.7, 0.2, 0;0.3, 0.3, 0.4, 0;0, 0, 0, 1];% 动作 a=3
P(:, 3, :) = [0.7, 0.2, 0.1, 0;0.1, 0.8, 0.1, 0;0.2, 0.2, 0.6, 0;0, 0, 0, 1];% 动作 a=4
P(:, 4, :) = [0.5, 0.4, 0.1, 0;0.2, 0.7, 0.1, 0;0.4, 0.4, 0.2, 0;0, 0, 0, 1];% 动作 a=5
P(:, 5, :) = [0.9, 0.05, 0.05, 0;0.05, 0.9, 0.05, 0;0.1, 0.1, 0.8, 0;0, 0, 0, 1];% 初始化策略(均匀随机策略)
policy = ones(S, A) / A;  % 每个状态下所有动作的概率均等% 初始化状态价值函数 V(s)
V = zeros(S, 1);% 策略迭代算法
for k = 1:max_iterations% 策略评估while trueV_new = zeros(S, 1);delta = 0; % 最大值变化% 遍历每个状态for s = 1:S% 计算当前策略下的期望回报expected_return = 0;for a = 1:Aexpected_return = expected_return + policy(s, a) * (R(s, a) + gamma * sum(squeeze(P(s, a, :)) .* V));endV_new(s) = expected_return;delta = max(delta, abs(V_new(s) - V(s))); % 计算状态价值的变化end% 更新状态价值V = V_new;% 如果变化小于 epsilon,认为收敛if delta < epsilonbreak;endend% 策略改进policy_stable = true; % 假设策略已经稳定for s = 1:S% 找到当前策略下的动作old_action = find(policy(s, :) == max(policy(s, :)), 1);% 计算每个动作的期望回报action_values = zeros(A, 1);for a = 1:Aaction_values(a) = R(s, a) + gamma * sum(squeeze(P(s, a, :)) .* V);end% 找到最优动作[~, best_action] = max(action_values);% 更新策略policy(s, :) = 0; % 清零policy(s, best_action) = 1; % 贪心策略% 检查策略是否变化if old_action ~= best_actionpolicy_stable = false;endend% 如果策略稳定,退出循环if policy_stablebreak;end
end% 输出结果
disp('最优状态价值函数 V*(s):');
disp(V);disp('最优策略 pi*(s):');
[~, pi] = max(policy, [], 2); % 从策略矩阵中提取最优动作
disp(pi);

        同样的也来描述一样代码流程,策略评估的过程实际就是V计算的过程,这部分和值迭代是一样的,在值迭代的第二部,我们依然是遍历每一个状态下的a,找寻其最大值(其实是可以直接放到一起的)。在策略迭代执行的就是PI这一步,首先假设策略已经是稳定的了,然后遍历每个状态,再遍历每个动作,因为已经算出来vpik了,所以就可以计算qpik,新的动作就是选择最大qpik里的a。更新策略,当策略不再更新的时候,就是最优的。

三、截断策略迭代

        Truncated Policy Iteration在传统的策略迭代中,策略评估步骤需要迭代求解贝尔曼方程,直到价值函数收敛,这在状态空间较大时明显就非常耗时。截断策略迭代则对策略评估步骤进行了截断,即只进行有限次的迭代更新,而不是一直迭代到收敛。这样虽然得到的价值函数可能不是精确的,但可以在较少的计算量下快速得到一个近似的价值函数,进而进行策略改进,加快整个算法的收敛速度。

3.1 初始化

        初始化一个任意的策略 pi ,其中 pi0(s) 表示在状态 s 下采取动作的概率分布,同时也需要初始化V0 state value

3.2 截断策略评估

        给定一个策略pi,进行有限次k的价值函数更新,更新还是基于贝尔曼公式,V是第i次迭代的价值

3.3 策略改进

        根据截断策略评估得到的state value,对策略进行改进如果新的策略  pi_new与旧的策略 pi 相同,那么算法终止,得到策略为最优策略,否则返回继续进行迭代。

% 初始化参数
gamma = 0.9;        % 折扣因子
epsilon = 1e-6;     % 收敛阈值
max_iterations = 1000; % 最大迭代次数
S = 4;              % 状态空间大小
A = 5;              % 动作空间大小
truncation_steps = 5; % 截断策略评估的迭代次数% 转移概率矩阵 P(s'|s, a) - 4x5x4 的三维矩阵
P = zeros(S, A, S);% 奖励函数 R(s, a) - 4x5 的矩阵
R = [-1, 4, -1, -1, -1;-1, 4, -1, -1, -1;4, -1, -1, -1, -1;-1, -1, -1, -1, 1];% 转移概率矩阵
% 动作 a=1
P(:, 1, :) = [0.8, 0.1, 0.1, 0; 0.1, 0.8, 0.1, 0; 0.2, 0.2, 0.6, 0; 0, 0, 0, 1];% 动作 a=2
P(:, 2, :) = [0.6, 0.3, 0.1, 0;0.1, 0.7, 0.2, 0;0.3, 0.3, 0.4, 0;0, 0, 0, 1];% 动作 a=3
P(:, 3, :) = [0.7, 0.2, 0.1, 0;0.1, 0.8, 0.1, 0;0.2, 0.2, 0.6, 0;0, 0, 0, 1];% 动作 a=4
P(:, 4, :) = [0.5, 0.4, 0.1, 0;0.2, 0.7, 0.1, 0;0.4, 0.4, 0.2, 0;0, 0, 0, 1];% 动作 a=5
P(:, 5, :) = [0.9, 0.05, 0.05, 0;0.05, 0.9, 0.05, 0;0.1, 0.1, 0.8, 0;0, 0, 0, 1];% 初始化策略(均匀随机策略)
policy = ones(S, A) / A;  % 每个状态下所有动作的概率均等% 初始化状态价值函数 V(s)
V = zeros(S, 1);% 截断策略迭代算法
for k = 1:max_iterations% 截断策略评估for step = 1:truncation_stepsV_new = zeros(S, 1);% 遍历每个状态for s = 1:S% 计算当前策略下的期望回报expected_return = 0;for a = 1:Aexpected_return = expected_return + policy(s, a) * (R(s, a) + gamma * sum(squeeze(P(s, a, :)) .* V));endV_new(s) = expected_return;end% 检查收敛性if max(abs(V_new - V)) < epsilonbreak;end% 更新状态价值V = V_new;end% 策略改进policy_stable = true; % 假设策略已经稳定for s = 1:S% 找到当前策略下的动作old_action = find(policy(s, :) == max(policy(s, :)), 1);% 计算每个动作的期望回报action_values = zeros(A, 1);for a = 1:Aaction_values(a) = R(s, a) + gamma * sum(squeeze(P(s, a, :)) .* V);end% 找到最优动作[~, best_action] = max(action_values);% 更新策略new_policy = zeros(1, A);new_policy(best_action) = 1;% 检查策略是否变化if any(policy(s, :) ~= new_policy)policy_stable = false;end% 更新策略policy(s, :) = new_policy;end% 如果策略稳定,退出循环if policy_stablebreak;end
end% 输出结果
disp('最优状态价值函数 V*(s):');
disp(V);disp('最优策略 pi*(s):');
[~, pi] = max(policy, [], 2); % 从策略矩阵中提取最优动作
disp(pi);

        在代码内,定义了一个新的参数 truncation_steps,用于指定策略评估步骤的迭代次数,策略循环中,收敛性检查依然是必须的,态价值函数 V 已经收敛(即变化小于 epsilon),则提前退出策略评估循环。在策略改进时,直接使用贪心策略(即选择当前状态下期望回报最大的动作),并检查策略是否发生变化。如果策略没有变化,则认为策略已经稳定,退出主循环。并且在改进的时候,直接更新为最优策略,就不是一步步来了,全部算完然后从头来,直接哪个最好使用哪个,这就是上面说的截断,也是一部到位的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 浪潮席卷中国年,开启科技新春新纪元

在这博主提前祝大家蛇年快乐呀&#xff01;&#xff01;&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其影响力已经渗透到社会生活的方方面面。在中国传统节日 —— 春节期间&#xff0c;AI 技术也展现出了巨大的潜力&#xff0c;为中国年带…

vim的特殊模式-可视化模式

可视化模式&#xff1a;按 v进入可视化模式 选中 y复制 d剪切/删除 可视化块模式: ctrlv 选中 y复制 d剪切/删除 示例&#xff1a; &#xff08;vim可视化模式的进阶使用&#xff1a;vim可视化模式的进阶操作-CSDN博客&#xff09;

sunrays-framework配置重构

文章目录 1.common-log4j2-starter1.目录结构2.Log4j2Properties.java 新增两个属性3.Log4j2AutoConfiguration.java 条件注入LogAspect4.ApplicationEnvironmentPreparedListener.java 从Log4j2Properties.java中定义的配置读取信息 2.common-minio-starter1.MinioProperties.…

相互作用感知的蛋白-小分子对接模型 - Interformer 评测

Interformer 是一个应用于分子对接和亲和力预测的深度学习模型&#xff0c;基于 Graph-Transdormer 架构的模型&#xff0c;利用相互作用&#xff08;氢键、疏水&#xff09;感知的混合密度网络&#xff08;interaction-aware mixture den sity network&#xff0c; MDN&#x…

Ceisum无人机巡检直播视频投射

接上次的视频投影&#xff0c;Leader告诉我这个视频投影要用在两个地方&#xff0c;一个是我原先写的轨迹回放那里&#xff0c;另一个在无人机起飞后的地图回显&#xff0c;要实时播放无人机拍摄的视频&#xff0c;还要能转镜头&#xff0c;让我把这个也接一下。 我的天&#x…

【漫话机器学习系列】065.梯度(Gradient)

梯度&#xff08;Gradient&#xff09; 在数学和机器学习中&#xff0c;梯度是一个向量&#xff0c;用来表示函数在某一点的变化方向和变化率。它是多变量函数的一阶偏导数的组合。 梯度的定义 设有一个标量函数 &#xff0c;它对 ​ 是可微的&#xff0c;则该函数在某一点的…

基于SpringBoot多数据源解决方案

最近在学习SpringBoot的时候&#xff0c;需要同时用两个不同的数据库连接服务&#xff0c;在网上学习了之后&#xff0c;下文以连接一个MySQL数据库和一个SqlServer数据库为例。 配置数据源连接信息 在配置文件中&#xff0c;配置对应的数据库连接信息&#xff0c;相比于单数…

二叉树的最大深度(C语言详解版)

一、摘要 嗨喽呀大家&#xff0c;leetcode每日一题又和大家见面啦&#xff0c;今天要讲的是104.二叉树的最大深度&#xff0c;思路互相学习&#xff0c;有什么不足的地方欢迎指正&#xff01;好啦让我们开始吧&#xff01;&#xff01;&#xff01; 二、题目简介 给定一个二…

穿心莲内酯(andrographolide)生物合成CYP72-文献精读106

Two CYP72 enzymes function as Ent-labdane hydroxylases in the biosynthesis of andrographolide in Andrographis paniculata 两种CYP72酶在穿心莲&#xff08;Andrographis paniculata&#xff09;中作为Ent-labdane羟化酶&#xff0c;在穿心莲内酯&#xff08;andrograp…

[SaaS] 内容创意生产平台

1.即梦 2.讯飞绘镜 typemovie 3.Krea.ai 4.Pika 5.runway 6.pixVerse 7.

DiffuEraser: 一种基于扩散模型的视频修复技术

视频修复算法结合了基于流的像素传播与基于Transformer的生成方法&#xff0c;利用光流信息和相邻帧的信息来恢复纹理和对象&#xff0c;同时通过视觉Transformer完成被遮挡区域的修复。然而&#xff0c;这些方法在处理大范围遮挡时常常会遇到模糊和时序不一致的问题&#xff0…

[c语言日寄]assert函数功能详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

【数据结构】_链表经典算法OJ:分割链表(力扣—中等)

目录 1. 题目描述及链接 2. 解题思路 2.1 思路1 2.2 思路2 2.3 思路3&#xff08;本题采取该解法&#xff09; 3. 题解程序 1. 题目描述及链接 题目链接&#xff1a;面试题 02.04. 分割链表 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个链表…

基于vue和elementui的简易课表

本文参考基于vue和elementui的课程表_vue实现类似课程表的周会议列表-CSDN博客&#xff0c;原程序在vue3.5.13版本下不能运行&#xff0c;修改两处&#xff1a; 1&#xff09;slot-cope改为v-slot 2&#xff09;return background-color:rgb(24 144 255 / 80%);color: #fff; …

【Unity3D】实现Decal贴花效果,模拟战旗游戏地形效果

目录 一、基础版 二、Post Process 辉光Bloom效果 矩形渐隐 涉及知识点&#xff1a;Decal贴花、屏幕后处理Bloom、屏幕空间构建世界空间、ChracterController物体移动、Terrain地形创建 一、基础版 Unity 2019.4.0f1 普通渲染管线&#xff08;非URP、非HDRP&#xff09; UR…

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题&#xff0c;因为数据范围的不同要用不同的方法进行求解&#xff0c;涉及了很多之前的东西快速幂&#xff0c;逆元&#xff0c;质数&#xff0c;高精度等…

基于物联网设计的疫苗冷链物流监测系统

一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新&#xff0c;疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流&#xff0c;温度、湿度等环境因素的控制直接关系到疫苗的质量和效力&#xff0c;因此高效、可靠的冷链监控系统显得尤为重要。冷…

学习数据结构(1)时间复杂度

1.数据结构和算法 &#xff08;1&#xff09;数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合 &#xff08;2&#xff09;算法就是定义良好的计算过程&#xff0c;取一个或一组的值为输入&#xff0c;并产生出一个或一组…

基于RIP的MGRE实验

实验拓扑 实验要求 按照图示配置IP地址配置静态路由协议&#xff0c;搞通公网配置MGRE VPNNHRP的配置配置RIP路由协议来传递两端私网路由测试全网通 实验配置 1、配置IP地址 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 15.0.0.1 24 [R1]int LoopBack 0 [R1-LoopBack0]i…

Oracle迁移DM数据库

Oracle迁移DM数据库 本文记录使用达梦官方数据迁移工具DTS&#xff0c;将Oracle数据库的数据迁移至达梦数据库。 1 数据准备 2 DTS工具操作步骤 2.1 创建工程 打开DTS迁移工具&#xff0c;点击新建工程&#xff0c;填写好工程信息&#xff0c;如图&#xff1a; 2.2 新建迁…