《Learning Combinatorial Optimization Algorithms over Graphs》阅读笔记

news2024/11/22 20:40:24

一.文章概述

本文提出将强化学习和图嵌入的组合以端到端地自动为图上组合优化问题设计贪心启发式算法,以避免设计传统算法所需要的大量专业知识和试错。学得的贪心策略行为类似增量构造解决方案的元算法,动作由解决方案当前状态上的图嵌入网络确定。作者提出方案学得的启发式算法对多个不同的组合优化问题、图类型和大小都有效。

元算法:meta algorithm,通用框架,可用于解决许多问题。

二.背景介绍

解决NP-hard图优化问题的方法主要分为三类:

  • 精确算法:基于枚举或带整数规划形式的分支限界,对大型实例不适用。
  • 近似算法:多项式逼近算法是可取的,但可能会受到弱最优性保证或经验性能的影响,或者对于不可逼近的问题甚至可能不存在。
  • 启发式算法:通常是快速有效的算法,但缺乏理论保证,并且可能还需要算法设计者进行大量针对特定问题的研究和试错。

上述三种范式都很少利用现实世界优化问题的一个共同特征:同一类型问题的实例在常规基础上被一次又一次地解决,保持相同的组合结构,但主要在数据上有所不同。为此作者提出,给定一个图优化问题 G G G和分布 D \mathbb{D} D,是否能从 D \mathbb{D} D中学习到更好的启发式方法来推广到未见的实例?

现有基于深度学习方法的不足之处:

  • 使用的深度架构是通用的,不能有效地反映图问题的组合结构。
  • 需要大量的实例来提升方法的泛化性能。
  • 现有工作通常基于策略梯度进行训练,这种方法并不是特别有效的样本。
  • 需要繁琐的人工特征工程。

基于现状,作者使用强化学习和图嵌入的独特组合来解决图问题的学习算法的挑战。学习到的策略行为类似于增量构造解决方案的元算法,动作由解决方案当前状态上的图嵌入网络确定。作者提出的架构与以往的工作由以下几个方面的不同:

  • 算法设计模型:采用贪心元算法设计,根据图的结构,通过节点的连续添加构造可行解,并保持可行解满足问题的图约束。
  • 算法表示:使用structure2vec的图嵌入网络来表示贪心算法中的策略,该网络能捕获节点在其图邻域上下文中的属性。这允许策略根据节点的有用性来区分它们,并推广到不同大小的问题实例。
  • 算法训练:使用拟合Q-learning来学习一个由图嵌入网络参数化的贪心策略。策略的目标是直接优化原始问题实例的目标函数。该方法的主要优点是可以以数据高效的方式处理延迟奖励(贪心算法获取的目标函数值的剩余增量);在贪心算法的每一步中,根据部分解更新图嵌入,以反映每个节点对最终目标值的效益的新知识。相比之下,策略梯度只对整个解决方案更新一次模型参数。

作者提出的框架如下所示:

在这里插入图片描述

三.图上贪心算法通用范式

作者使用有权图上的三个优化问题来说明其框架。令 G ( V , E , w ) G(V, E, w) G(V,E,w)表示有权图,其中 V V V表示节点集, E E E表示边集, w : E → R + w: E \rightarrow \mathbb{R}^{+} w:ER+表示边权重函数, w ( u , v ) w(u, v) w(u,v)表示边 ( u , v ) ∈ E (u, v) \in E (u,v)E的权重。

基于此,作者解决的三个优化问题表示如下:

  • Minimum Vertex Cover (MVC):给定图 G G G,寻找节点子集 S ⊆ V S \subseteq V SV,使得任意边都有端点在 S S S中。
  • Maximum Cut (MAXCUT):给定图 G G G,寻找节点子集 S ⊆ V S \subseteq V SV,使得cut-set的权重之和 ∑ ( u , v ) ∈ C w ( u , v ) \sum_{(u, v) \in C} w(u, v) (u,v)Cw(u,v)最大,其中cut-set C ⊆ E C \subseteq E CE中每条边的一段在 S S S中,另一端在 V \ S V \backslash S V\S中。
  • Traveling Salesman Problem (TSP):给定二维空间的点集,以每个点为图节点,点间的距离作为点间边的权重,该问题旨在寻找一个总权值最小的tour,tour指访问图中每个顶点仅一次的环。

**贪心算法基于最大化某个评估函数 Q Q Q(通过 Q Q Q衡量当前局部解背景下一个节点的质量),在局部解S中依次添加节点来构造一个解。**作者指出上述问题的贪心算法可以用一个共同的公式来表示:

  1. 一个给定优化问题的问题实例 G G G是从分布 D \mathbb{D} D中采样的,即实例图 G G G V 、 E V、E VE w w w是根据模型或真实世界的数据生成的。

  2. 一个部分解决被表示为一个有序的list S = ( v 1 , v 2 , … , v ∣ S ∣ ) , v i ∈ V S=\left(v_1, v_2, \ldots, v_{|S|}\right), v_i\in V S=(v1,v2,,vS),viV, 和 S ˉ = V \ S \bar{S}=V\backslash S Sˉ=V\S 待添加的候选节点集。作者使用一个二元决策变量的向量 x x x,每个维度 x v x_v xv对应于 V V V中的一个节点 v v v,如果 v ∈ S v\in S vS x v = 1 x_v=1 xv=1,否则为0。可以把 x v x_v xv看作是 v v v上的一个标签或额外的特征

  3. 需要一个维护(或辅助)过程 h ( S ) h(S) h(S),其将有序列表 S S S映射到一个满足问题特定约束的组合结构。

  4. 部分解决 S S S的质量是由基于 S S S的组合结构 h h h的目标函数 c ( h ( S ) , G ) c(h(S), G) c(h(S),G)给出的。

  5. 一个通用的贪婪算法能使评估函数 Q ( h ( S ) , v ) ∈ R Q(h(S), v) \in \mathbb{R} Q(h(S),v)R最大化的节点 v v v作为下一个添加到部分解 S S S中的节点,这取决于当前部分解决方案的组合结构 h ( S ) h(S) h(S),即部分解可以扩展为:
    S : = ( S , v ∗ ) , where  v ∗ : = argmax ⁡ v ∈ S ˉ Q ( h ( S ) , v ) S:=\left(S, v^*\right) \text {, where } v^*:=\operatorname{argmax}_{v \in \bar{S}} Q(h(S), v) S:=(S,v), where v:=argmaxvSˉQ(h(S),v)
    其中 ( S , v ∗ ) (S, v^*) (S,v)表示在list S S S尾端添加节点 v ∗ v^* v。该步骤会重复直到满足终止条件 t ( h ( S ) ) t(h(S)) t(h(S))

对于以上抽象模型(分布 D \mathbb{D} D、辅助函数 h h h、终止准则 t t t和代价函数 c c c),三个问题具体设计如下:

  • MVC:辅助函数 h h h不需要做任何工作, c ( h ( S ) , G ) = − ∣ S ∣ c(h(S), G)=-|S| c(h(S),G)=S。终止条件是检查是否所有边都被覆盖。
  • MAXCUT:辅助函数将 V V V划分为两个子集 S S S和其补集 S ˉ = V \ S \bar{S}=V \backslash S Sˉ=V\S并维持cut-set C = { ( u , v ) ∣ ( u , v ) ∈ E , u ∈ S , v ∈ S ˉ } C=\{(u, v) \mid(u, v) \in E, u \in S, v \in \bar{S}\} C={(u,v)(u,v)E,uS,vSˉ}。代价函数是 c ( h ( S ) , G ) = ∑ ( u , v ) ∈ C w ( u , v ) c(h(S), G)=\sum_{(u, v) \in C} w(u, v) c(h(S),G)=(u,v)Cw(u,v),无终止条件。
  • TSP:辅助函数根据 S S S中的节点顺序维护一个tour。最简单的方法是按照 S S S的顺序将节点追加到部分旅游的末尾。代价函数为 c ( h ( S ) , G ) = − ∑ i = 1 ∣ S ∣ − 1 w ( S ( i ) , S ( i + 1 ) ) − w ( S ( ∣ S ∣ ) , S ( 1 ) ) c(h(S), G)=-\sum_{i=1}^{|S|-1} w(S(i), S(i+1))-w(S(|S|), S(1)) c(h(S),G)=i=1S1w(S(i),S(i+1))w(S(S),S(1)),终止条件是 S = V S=V S=V。根据经验,在部分tour中插入一个节点 u u u,使tour长度增加最少的位置是一个更好的选择。作者以此作为TSP的辅助函数。

在部分解 S S S中添加一个节点所产生的解决方案质量的估计值将由评估函数 Q Q Q决定,该函数将通过使用问题实例的集合来学习。这与传统的贪心算法设计相反,在传统算法中需要手工设计 Q Q Q,并且需要大量针对特定问题的研究和试错。

四.图嵌入表示

对于评估函数 Q Q Q,作者希望其考虑到当前部分解 S S S,因为它映射到图上。即对所有节点 v ∈ S v \in S vS x v = 1 x_v=1 xv=1,节点按照图结构进行连接。直观地说, Q ^ \widehat{Q} Q 应该总结"有标签的 "图 G G G的状态,如果要在该图背景下添加新节点,就应该算出它的价值。在这里,图的状态和节点 v v v的上下文都可能非常复杂,难以用封闭形式描述,而且可能取决于复杂的统计数据,如全局/局部度分布、三角形计数、与标记节点的距离。为了在组合结构上表示如此复杂的现象,作者在图上利用深度学习架构,即structure2vec来参数化 Q ^ ( h ( S ) , v ; Θ ) \widehat{Q}(h(S), v ; \Theta) Q (h(S),v;Θ)

4.1 Structure2Vec

给定当前部分解 S S S,structure2vec会为每个节点 v ∈ V v \in V vV计算 p p p维的特征嵌入 μ v \mu_v μv。更具体地说,structure2vec根据输入图结构 G G G递归地定义网络架构,structure2vec的计算图受到图模型推断算法的启发,其中节点特定的标签或特征 x v x_v xv根据 G G G的图拓扑递归地聚合。经过多次迭代,网络将为每个节点产生一个新的嵌入,同时考虑到图特征和这些节点特征之间的远程交互。structure2vec的一个变体是将嵌入 μ v ( 0 ) \mu_v^{(0)} μv(0)初始化为0,对所有 v ∈ V v \in V vV,在每次迭代中将嵌入同步更新为:
μ v ( t + 1 ) ← F ( x v , { μ u ( t ) } u ∈ N ( v ) , { w ( v , u ) } u ∈ N ( v ) ; Θ ) \mu_v^{(t+1)} \leftarrow F\left(x_v,\left\{\mu_u^{(t)}\right\}_{u \in \mathcal{N}(v)},\{w(v, u)\}_{u \in \mathcal{N}(v)} ; \Theta\right) μv(t+1)F(xv,{μu(t)}uN(v),{w(v,u)}uN(v);Θ)
其中 N ( v ) \mathcal{N}(v) N(v)表示节点 v v v的邻居集, F F F表示神经网络或核函数。

4.2 Parameterizing Q ^ \widehat{Q} Q

基于structure2vec,作者定义的嵌入更新方式为:
μ v ( t + 1 ) ← relu ⁡ ( θ 1 x v + θ 2 ∑ u ∈ N ( v ) μ u ( t ) + θ 3 ∑ u ∈ N ( v ) relu ⁡ ( θ 4 w ( v , u ) ) ) \mu_v^{(t+1)} \leftarrow \operatorname{relu}\left(\theta_1 x_v+\theta_2 \sum_{u \in \mathcal{N}(v)} \mu_u^{(t)}+\theta_3 \sum_{u \in \mathcal{N}(v)} \operatorname{relu}\left(\theta_4 w(v, u)\right)\right) μv(t+1)relu θ1xv+θ2uN(v)μu(t)+θ3uN(v)relu(θ4w(v,u))
θ 1 ∈ R p , θ 2 , θ 3 ∈ R p × p \theta_1 \in \mathbb{R}^p, \theta_2, \theta_3 \in \mathbb{R}^{p \times p} θ1Rp,θ2,θ3Rp×p θ 4 ∈ R p \theta_4 \in \mathbb{R}^p θ4Rp都是模型的参数, relu \text{relu} relu表示非线性激活。经过 T T T轮迭代,作者使用这些嵌入来定义 Q ^ ( h ( S ) , v ; Θ ) \widehat{Q}(h(S), v ; \Theta) Q (h(S),v;Θ)。即作者使用每个节点 v v v的嵌入和整个图上的池化嵌入 ∑ u ∈ V μ u ( T ) \sum_{u \in V} \mu_u^{(T)} uVμu(T),作为 v v v h ( S ) h(S) h(S)的代用品,即:
Q ^ ( h ( S ) , v ; Θ ) = θ 5 ⊤ relu ⁡ ( [ θ 6 ∑ u ∈ V μ u ( T ) , θ 7 μ v ( T ) ] ) \widehat{Q}(h(S), v ; \Theta)=\theta_5^{\top} \operatorname{relu}\left(\left[\theta_6 \sum_{u \in V} \mu_u^{(T)}, \theta_7 \mu_v^{(T)}\right]\right) Q (h(S),v;Θ)=θ5relu([θ6uVμu(T),θ7μv(T)])
其中 θ 5 ∈ R 2 p , θ 6 , θ 7 ∈ R p × p \theta_5 \in \mathbb{R}^{2 p}, \theta_6, \theta_7 \in \mathbb{R}^{p \times p} θ5R2p,θ6,θ7Rp×p [ ⋅ , ⋅ ] [\cdot, \cdot] [,]表示拼接操作。作者将 T T T设置的很小(因为会过平滑)。对于训练,作者使用的是强化学习。

五.训练:Q Learning

作者期望在分布 D \mathbb{D} D上的 m m m个图组成的图集 D = { G i } i = 1 m \mathcal{D}=\left\{G_i\right\}_{i=1}^m D={Gi}i=1m上学得函数 Q ^ \widehat{Q} Q

5.1 强化学习公式

作者对强化学习框架中的状态、动作和奖励定义如下:

  • State:状态 S S S是图 G G G上的一系列动作(节点)。由于已经在嵌入中表示了标记图中的节点,所以状态是 p p p维空间中的一个向量, ∑ v ∈ V μ v \sum_{v \in V} \mu_v vVμv。很容易看出,这种状态的嵌入表示可以跨不同的图使用。终止状态 S ^ \widehat{S} S 取决于手头的问题。

  • Transition:过渡是确定的,相当于用特征 x v = 1 x_v=1 xv=1来标记被选为最后行动的节点 v ∈ G v \in G vG

  • Actions:动作 v v v G G G中的一个节点,不属于当前状态 S S S。同样,作者将把行动表示为其相应的 p p p维节点嵌入 μ v \mu_v μv,这样的定义适用于各种规模的图。

  • Rewards:状态 S S S的奖励函数 r ( S , v ) r(S, v) r(S,v)被定义为采用行动 v v v,转移到新状态 S ′ : = ( S , v ) S^{\prime}:=(S, v) S:=(S,v)后,代价函数的变化,即:
    r ( S , v ) = c ( h ( S ′ ) , G ) − c ( h ( S ) , G ) r(S, v)=c\left(h\left(S^{\prime}\right), G\right)-c(h(S), G) r(S,v)=c(h(S),G)c(h(S),G)
    其中 c ( h ( ∅ ) , G ) = 0 c(h(\emptyset), G)=0 c(h(),G)=0。因此,终止状态 S ^ \widehat{S} S 的累积奖励 R R R S ^ \widehat{S} S 的目标函数值完全重合,即 R ( S ^ ) = ∑ i = 1 ∣ S ^ ∣ r ( S i , v i ) R(\widehat{S})=\sum_{i=1}^{|\widehat{S}|} r\left(S_i, v_i\right) R(S )=i=1S r(Si,vi)等于 c ( h ( S ^ ) , G ) c(h(\widehat{S}), G) c(h(S ),G)

  • Policy:基于 Q ^ \widehat{Q} Q ,确定性贪心策略 π ( v ∣ S ) : = argmax ⁡ v ′ ∈ S ˉ Q ^ ( h ( S ) , v ′ ) \pi(v \mid S):=\operatorname{argmax}_{v^{\prime} \in \bar{S}} \widehat{Q}\left(h(S), v^{\prime}\right) π(vS):=argmaxvSˉQ (h(S),v)被使用,选择行动 v v v对应于向当前部分解中添加一个 G G G的节点,这会导致收集奖励 r ( S , v ) r(S,v) r(S,v)

表1展示了本文的三个优化问题的强化学习框架实例:

在这里插入图片描述

作者用 Q ∗ Q^* Q表示每个RL问题的最优 Q Q Q函数,作者用 Q ^ ( h ( S ) , v ; Θ ) \widehat{Q}(h(S), v ; \Theta) Q (h(S),v;Θ)来近似它,这通过 n n n Q Q Q学习来习得。

5.2 学习算法

为了对 Q ^ ( h ( S ) , v ; Θ ) \widehat{Q}(h(S), v ; \Theta) Q (h(S),v;Θ)的参数进行端到端的学习,作者使用 n n n Q Q Q学习和拟合 Q Q Q迭代的组合,具体详见算法1:

在这里插入图片描述

作者使用术语episode来表示从一个空解开始,直到终止的一个完整的节点添加序列,episode中的一个step表示一个单独的操作(节点添加)。

标准(1步) Q Q Q学习通过执行gradient step来最小化平方损失函数,在episode的每个step中更新函数近似器的参数:
( y − Q ^ ( h ( S t ) , v t ; Θ ) ) 2 , \left(y-\widehat{Q}\left(h\left(S_t\right), v_t ; \Theta\right)\right)^2, (yQ (h(St),vt;Θ))2,
其中 y = γ max ⁡ v ′ Q ^ ( h ( S t + 1 ) , v ′ ; Θ ) + r ( S t , v t ) y=\gamma \max _{v^{\prime}} \widehat{Q}\left(h\left(S_{t+1}\right), v^{\prime} ; \Theta\right)+r\left(S_t, v_t\right) y=γmaxvQ (h(St+1),v;Θ)+r(St,vt) 表示状态 S t S_t St的非终止状态。 n n n Q Q Q学习有助于处理延迟奖励的问题,在这种情况下,agent感兴趣的最终奖励只能在某一episode的未来才能收到。在作者的设置中,解决方案的最终目标值只有在添加许多节点之后才会显示出来。因此,一步更新可能太短视了,其自然扩展是等待 n n n步,然后更新近似器的参数,以便收集对未来奖励的更准确的估计。形式上更新仍然是在相同的损失平方上,但是目标不同, y = ∑ i = 0 n − 1 r ( S t + i , v t + i ) + γ max ⁡ v ′ Q ^ ( h ( S t + n ) , v ′ ; Θ ) y=\sum_{i=0}^{n-1} r\left(S_{t+i}, v_{t+i}\right)+\gamma \max _{v^{\prime}} \widehat{Q}\left(h\left(S_{t+n}\right), v^{\prime} ; \Theta\right) y=i=0n1r(St+i,vt+i)+γmaxvQ (h(St+n),v;Θ)

当使用神经网络作为函数逼近器时,拟合 Q Q Q迭代法已被证明可以导致更快的学习收敛,这一属性也适用于本文的设置。与逐个样本更新 Q Q Q函数不同,拟合 Q Q Q迭代方法使用experience replay来更新函数逼近器,使用来自数据集 E E E的一批样本,而不是当前经历的单个样本。数据集 E E E在之前的episode中被填充,这样在step t + n t+n t+n,元组 ( S t , a t , R t , t + n , S t + n ) \left(S_t, a_t, R_{t, t+n}, S_{t+n}\right) (St,at,Rt,t+n,St+n)被添加到 E E E,其中 R t , t + n = ∑ j = 0 n − 1 r ( S t + i , a t + i ) R_{t, t+n}=\sum_{j=0}^{n-1} r\left(S_{t+i}, a_{t+i}\right) Rt,t+n=j=0n1r(St+i,at+i)。然后,从 E E E中抽取的随机样本进行随机梯度更新。

Q-learning这样的off-policy强化学习算法可以比其策略梯度对应的算法有更高的样本效率。这主要是由于策略梯度方法需要在函数逼近器的每次参数更新后获得的新策略的策略样本。

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

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

相关文章

『清安无别事-赠书01期』|〖测试设计思想〗

目录 🧡 内容简介 💛 作者简介 💖 本书内容|目录 💗 读后感想 💝 参与方式 购书传送门:测试设计思想购书传送门:测试设计思想购书传送门:测试设计思想 🧡 内容简介 …

Win10提醒事项如何打开?电脑上如何添加日程提醒?

有不少上班族表示自己在日常办公时,经常会忘记一些重要的事情,例如领导安排给自己的任务、会议安排、项目截止日期等。为了避免自己忘记工作事项,很多人都想要在电脑上设置提醒事项或添加日程提醒。那么Win10提醒事项如何打开呢?P…

LCS最大公共子序列 与 LIS最大递增子序列

LCS Largest Common Subsequence 最大公共子序列 /* Input s1 s2//两个字符串Output length//长度 ans//具体字母 */ #include<iostream> using namespace std; int main() {string s1,s2;cin>>s1>>s2;int dp[100][100]{0};//dp[i][j]表示s1取前i位&#x…

软件工程概述-架构师(三)

软件工程概述&#xff08;老版&#xff09; 软件开发生命周期&#xff1a; 软件定义时期&#xff1a;包括 可行性研究和详细需求分析过程&#xff0c;任务是软件工程必需完成的目标&#xff0c;具有可行问题分析、可行性研究、需求分析等。软件开发时期&#xff1a;软件的 设…

css浮动(为什么要清除浮动?清除浮动有哪几种方式?)

为什么要清除浮动&#xff1f; 清除浮动主要是为了清除浮动元素造成的影响&#xff0c;使浮动元素不会影响其后元素的布局 防止父元素高度塌陷&#xff1a;当元素浮动后&#xff0c;它会脱离一个标准文档流&#xff0c;不再占用原先的布局空间。如果一个父元素内只有浮动元素&a…

SpringBoot中优雅的实现隐私数据脱敏(提供Gitee源码)

前言&#xff1a;在实际项目开发中&#xff0c;可能会对一些用户的隐私信息进行脱敏操作&#xff0c;传统的方式很多都是用replace方法进行手动替换&#xff0c;这样会由很多冗余的代码并且后续也不好维护&#xff0c;本期就讲解一下如何在SpringBoot中优雅的通过序列化的方式去…

07 线程学习

一 qt线程角色 子线程完成与UI线程无关的工作,并且能够保持与UI线程通信 二 qt中线程 在QT中,对于 线程操作也是提供类(QThread)来进行封装,然后再学习该类的API接口 参数用途Header:#include qmake:QT += coreInherits:QObject //继承于QObject从官方文档可以看出,如果一…

每天一道leetcode:797. 所有可能的路径(图论中等深度优先遍历)

今日份题目&#xff1a; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节…

[论文笔记]Glancing Transformer for Non-Autoregressive Neural Machine Translation

引言 这是论文Glancing Transformer for Non-Autoregressive Neural Machine Translation的笔记。 传统的非自回归文本生成速度较慢,因为需要给定之前的token来预测下一个token。但自回归模型虽然效率高,但性能没那么好。 这篇论文提出了Glancing Transformer,可以只需要一…

Verdi_traceX and autotrace

Verdi_traceX and autotrace Trace X From nWave/nTrace of from the Teporal Flow View. Show Paths on Flow ViewShow Paths on nWave 若Waveform中有X态&#xff0c;鼠标右键会有Trace X的选项&#xff1b; 会自动打开Temporal Flow View窗口&#xff0c;展示对应路径&am…

我的创作纪念日 — 嵌入式up(2023.8.15)

机缘 在2022年8月15日&#xff0c;开始了CSDN文章的编写&#xff0c;最初只想做一个知识的积累&#xff0c;毕竟对一个电子发烧友来说&#xff0c;很多东西都是迭代很快&#xff0c;且玩的次数不会很多&#xff0c;有些问题和一些解决方法&#xff0c;最好记录下来&#xff0c;…

分类预测 | MATLAB实现EVO-CNN多输入分类预测

分类预测 | MATLAB实现EVO-CNN多输入分类预测 目录 分类预测 | MATLAB实现EVO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现EVO-CNN多输入分类预测 2.代码说明&#xff1a;量谷优化卷积神经网络的数据分类预测&#xff1a;要求于Matlab …

杭电多校 Shortest path 记忆化搜索

&#x1f468;‍&#x1f3eb; Shortest path 输入 4 7 114514 1919810 2147483648输出 3 19 20 31&#x1f351; 思路&#xff1a;用操作3 凑出 操作1 操作2 的前提条件&#xff0c;暴搜记忆化搜索 import java.io.*; import java.util.*;public class Main {static Buffer…

linux中的/dev/null

1.什么是/dev 在 Linux 上&#xff0c;从驱动程序到设备的所有内容都可以作为文件进行访问。/dev/ 是包含所有物理和虚拟设备的目录。例如&#xff0c;/dev/sda 可能是您的主硬盘驱动器&#xff0c;/dev/sdb 可能是您现在正在使用的笔记本驱动器的文件。这就是您在 Linux 中访问…

华为OD机试-考勤信息

代码实现 # coding: utf-8 import numpyclass Solution:def chuqinInfo(self, n, arrs):res []for i in range(n):arr arrs[i]count 0for s in arr:if str(s) absent:count 1if count > 1:res.append(False)continuefor i in range(len(arr) - 1):a arr[i]b arr[i …

前端技术栈es6+promise

let入门使用、 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>let 基本使用</title><script type"text/javascript">let name "hspedu教育";//老韩解读//1. conso…

字符函数、数值函数、日期时间函数、聚集函数、判断函数、运算符号、排序、分组、过滤、分页、插入表记录、更新表记录、删除表记录

Top NSD DBA DAY02 案例1&#xff1a;常用函数案例2&#xff1a;查询结果处理案例3&#xff1a;管理表记录 1 案例1&#xff1a;常用函数 1.1 问题 练习字符函数练习数学函数练习日期函数练习聚集函数练习数学计算练习if函数练习case函数 1.2 方案 函数&#xff1a;MySQL…

将树莓派转身为强大的Web服务器:使用Nginx和cpolar实现远程访问

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

【Python】使用python解析普通格式的报文为someip格式报文

文章目录 1.安装scapy库2.示例 1.安装scapy库 使用 pip 安装 scapy 第三方库&#xff0c;打开 cmd&#xff0c;输入以下命令&#xff1a; pip install scapy出现如图所示&#xff0c;表示安装成功&#xff1a; 2.示例 要解析someip格式报文&#xff0c;需要导入someip模块&a…

《Rethinking the Expressive Power of GNNs via Graph Biconnectivity》阅读笔记

一.文章概述 现如今存在许多工作探索GNN的表达能力&#xff0c;然而对于其中大多数方法&#xff0c;仍然缺乏对它们可以系统地和可证明地获取哪些额外表达力的深刻理解。在本文中&#xff0c;作者通过图双连通性&#xff08;biconnectivity&#xff09;引入一类新的表达能力度…