摘要

啤酒游戏是在供应链管理课堂上广泛使用的一种课堂游戏,用来展示牛鞭效应。 该博弈是一个分散的、多代理的合作问题,可以建模为串行供应链网络,其中代理合作尝试最小化网络的总成本,即使每个代理只能观察自己的本地信息。 每个代理选择订单数量来补充其库存。 在某些条件下,已知基础油补充策略是最佳的。
然而,在一个分散的供应链中,其中一些代理(阶段)可能会不理性地行动(就像他们在啤酒游戏中所做的那样),对于希望采取最佳行动的代理,没有已知的最优策略。
我们提出了一种基于深度 Q 网络的机器学习算法,以优化给定阶段的补货决策。 当与遵循基本库存政策的代理一起玩时,我们的算法获得了接近最佳的订单数量。 当其他代理使用更现实的人类订购行为模型时,它的性能比基本库存策略好得多。 与文献中的大多数其他算法不同,我们的算法对啤酒游戏参数值没有任何限制。 与任何深度学习算法一样,训练算法可能需要大量计算,但这可以提前执行; 该算法在玩游戏时实时执行。 此外,我们提出了一种迁移学习方法,以便为一个代理和一组成本系数执行的培训可以快速适应其他代理和成本。 我们的算法可以扩展到其他具有部分观察信息的去中心化多智能体合作博弈,这是现实世界供应链问题中的一种常见情况。

引言

啤酒游戏由一个串行供应链网络组成,其中有四个代理商|零售商、仓库、分销商和制造商|他们必须在有限的信息下做出独立的补货决策。 该游戏在课堂环境中被广泛用于演示牛鞭效应,这是一种随着供应链上游移动而导致订单可变性增加的现象。 牛鞭效应的发生有多种原因,一些是理性的(Lee 等人,1997 年),一些是行为性的(Sterman 1989 年)。 当玩家试图实现游戏的既定目的,即最小化成本时,就会出现一个不经意的结果。 在本文中,我们感兴趣的不是牛鞭效应,而是既定的目的,即供应链成本的最小化,这是每个现实世界供应链决策的基础。 对于牛鞭效应的一般讨论,请参见,例如,Lee 等人。 (2004),Geary 等人。 (2006) 以及 Snyder 和 Shen (2018)。
啤酒游戏中的代理按顺序排列,编号分别从 1(零售商)到 4(制造商)。 (见图 1。)零售商节点面临来自客户的随机需求,制造商节点拥有无限的供应来源。 从上游到下游的产品流具有确定性的运输提前期 (ltr),但由于上游缺货,实际提前期是随机的; 从下游到上游(补货订单)的信息流也存在确定性的信息提前期 (lfi)。 每个代理可能有非零的短缺和持有成本。
在博弈的每个时期,每个代理选择一个订单数量 q 提交给它的前任(供应商),以试图最小化长期系统范围的成本,
公式1
其中 i 是代理的索引; t = 1; : : : ;T 是时间段的索引; T 是游戏的(随机)时间范围; ci h 和 ci p 分别是代理 i 的持有成本系数和短缺成本系数; ILi t 是代理 i 在时期 t 的库存水平。 如果ILi t > 0,则代理手头有库存,如果ILi t < 0,则表示有缺货,即欠客户的未满足需求。
符号x+和x分别表示maxf0;xg和maxf0;precisionxg。
啤酒游戏的标准规则规定,代理不得以任何方式进行通信,并且在游戏结束之前他们不会与其他代理共享任何本地库存统计数据或成本信息,届时所有代理都将知道 全系统成本。 换句话说,每个代理仅使用有关环境的部分信息做出决策,同时还与其他代理合作以最小化系统的总成本。 根据 Claus 和 Boutilier (1998) 的分类,啤酒游戏是一个分散的、独立的学习者 (IL)、多智能体、合作的问题。
啤酒博弈假设代理人承担持有和缺货成本,但没有固定的订购成本,因此最优库存策略是基础库存策略,其中每个阶段订购足够的数量以使其库存状况(现有量加上 -订单库存减去缺货)等于一个固定数量,称为基本库存水平(克拉克和斯卡夫 1960)。 当非零售商阶段没有缺货成本时,即 ci p = 0; 我 2 f2; 3; 在 4g 中,Clark 和 Scarf (1960) 的著名算法(或 Chen 和 Zheng (1994)、Gallego 和 Zipkin (1999) 的后续修改)提供了最佳基础油水平。 据我们所知,没有算法可以找到一般缺货成本结构的最佳基础库存水平,例如,非零售商代理的非零缺货成本。 更重要的是,当一些代理不遵循基本库存或其他理性策略时,给定代理应遵循的最优策略的形式和参数是未知的。 在本文中,我们提出了一种基于深度 Q 网络(DQN)的新算法来解决这个问题。
本文的其余部分如下。 第 2 节简要总结了相关文献和我们对它的贡献。 该算法的细节在第 3 节中介绍。
第 4 节提供数值实验,第 5 节总结论文。

文献综述

2.1SOTA
啤酒游戏由一个串行的供应链网络组成。 在博弈规定的条件下(零固定订购成本、无订购能力、线性持有和缺货成本等),每个阶段的基础库存库存策略都是最优的(Lee 等,1997)。 如果需求过程和成本是固定的,那么最佳基础库存水平也是固定的,这意味着在每个时期(除了第一个时期),每个阶段都只是简单地从供应商那里订购与需求量完全相同的数量。 如果客户需求是随机的,并且如果缺货成本仅在阶段 1 发生,那么可以使用 Clark 和 Scarf(1960)的精确算法找到最佳基础库存水平; 另见 Chen 和 Zheng (1994)、Gallego 和 Zipkin (1999)。 该方法涉及将串行系统分解为多个单级系统,并在每个系统上求解凸的单变量优化问题。 然而,目标函数需要数值积分,因此实现起来很麻烦并且计算成本很高。 尚和宋 (2003) 提出了一种有效的启发式方法。 有关这些模型的教科书讨论,另请参见 Snyder 和 Shen (2018)。
有大量关于啤酒游戏和牛鞭等的文献。我们在此回顾了一些文献,同时考虑了独立学习者(ILs)和联合行动学习者(JALs)(Claus和Boutilier,1998);有关更全面的审查,请参见Devika等人(2016年)。在ILs类别中,Mosekilde和Larsen(1988)开发了一个模拟和测试不同的订购策略,该策略使用一个公式表示,该公式涉及状态变量,如预期装运数量和未完成订单。在他们的问题中,有一个装运期和信息交付周期。他们假设客户需求在前四个周期中的每一个周期为4,然后在剩余时间内每个周期为7。斯特曼(1989)使用了类似的游戏版本,不允许玩家知道需求过程。他提出了一个公式(我们称之为斯特曼公式),用于根据当前积压的订单、现有库存、进货和出货、进货订单和预期需求确定订单数量。他的公式基于Tversky和Kahneman(1979)的锚定和调整方法。在一个
斯特曼公式试图模拟人类参与者对他们在供应链中观察到的情况(例如短缺或库存过剩)反应过度或反应不足的方式。 斯特曼的工作有多种扩展。 例如,Strozzi 等人。 (2007) 考虑了四个时期后顾客需求不断增加时的啤酒博弈,并提出了一种遗传算法 (GA) 来获得斯特曼模型的系数。 随后的行为啤酒游戏研究包括 Kaminsky 和 ​​Simchi-Levi(1998)、Croson 和 Donohue(2003)以及 Croson 和 Donohue(2006)。
本节第一段中描述的大多数优化方法都假设每个代理都遵循基础油策略。 然而,啤酒游戏的标志是玩家不倾向于遵循这样的政策或任何政策。 通常他们的行为是非常不理性的。 关于当其他智能体不合理玩时,给定智能体应如何优化其库存决策的文献相对较少(Sterman 1989,Strozzi et al. 2007)|也就是说,当她的队友时,单个玩家如何最好地玩啤酒游戏 可能无法做出最佳决策。
一些啤酒游戏文献假设代理是联合行动学习者 (JAL),即所有代理共享有关库存位置的信息,与经典的 IL 模型相比有显着差异。 例如,Kimbrough 等人。 (2002) 提出了一个 GA,它接收每个代理的当前快照,并根据 d + x 规则决定订购多少。 在 d + x 规则中,代理 i 观察 d i t ,即在时间段 t 收到的需求/订单,选择 x i t ,然后放置一个大小为 q i t = d i t + x i t 的订单。 换句话说,x i t 是代理的订单数量与其观察到的需求之间的(正或负)量。 (我们在我们的算法中使用相同的排序规则。)Giannoccaro 和 Pontrandolfo (2002) 考虑了具有随机发货提前期和随机需求的三个代理的啤酒游戏。 他们提出了一种强化学习 (RL) 算法来做出决策,其中状态变量被定义为三个库存位置,每个位置都离散为 10 个区间。 代理可以使用 [0, 30] 上的整数中的任何操作。 查哈苏吉等人。 (2008) 考虑与 Giannoccaro 和 Pontrandolfo (2002) 完全相同的博弈和相同的解决方案,除了四个代理和每个博弈的固定长度 35 个周期。 在他们提议的 RL 中,状态变量是四个库存位置,每个位置都离散为九个区间。 此外,他们的 RL 算法使用 d + x 规则来确定订单数量,其中 x 限制在 {0, 1, 2, 3} 内。
2.2强化学习
强化学习 (RL)(Sutton 和 Barto 1998)是机器学习的一个领域,已成功应用于解决复杂的决策问题。 RL 关注的是软件代理应该如何选择动作以最大化累积奖励的问题。 RL 是电信(Al-Rawi 等人,2015 年)、电梯调度(Crites 和 Barto,1998 年)、机器人控制(Finn 和 Levine 2017 年)和游戏(Silver 等人,2016 年)等领域的流行工具,仅举几例 .
考虑一个与环境交互的代理。 在每个时间步 t,代理观察系统的当前状态,st ∈ S(其中 S 是可能状态的集合),在 ∈ A(st)(其中 A(st) 是可能的状态集合)选择一个动作 当系统处于状态 st 时的动作),得到奖励 rt ∈ R,然后系统随机转换到状态 st+1 ∈ S。这个过程被称为马尔可夫决策过程(MDP)(见图 2),和 RL 算法可用于解决此类问题
矩阵 Pa(s, s0 ),称为转移概率矩阵,提供了在状态 s 中采取动作 a 时转移到状态 s 0 的概率,即 Pa(s, s0 ) = Pr(st+1 = s 0 | st = s, at = a)。 类似地,Ra(s, s0 ) 定义了相应的奖励矩阵。 在每个时期 t,决策者根据给定的策略在 = πt(s) 处采取行动,用 πt 表示,πt(a | s) 表示在时期 t 处于状态 s 时采取行动 a 的概率。 RL 的目标是当系统在无限范围内运行时,最大化奖励 rt 的预期折扣总和。 换句话说,目标是确定策略 π : S → A 以最大化 P∞ t=0 γE [Rat (st , st+1)],其中 at = πt(st) 和 0 ≤ γ ≤ 1 是 折扣系数。 对于给定的 Pa(s, s0 ) 和 Ra(s, s0 ),可以通过动态规划(例如,使用值迭代或策略迭代)或线性规划(Sutton 和 Barto 1998)获得最优策略。
解决这个问题的另一种方法是 Q-learning,一种 RL 算法,它获得策略 π,该策略使任何 s ∈ S 和 a = π(s) 的 Q 值最大化,即:
公式2
Q-learning 方法从对所有 s 和 a 的 Q(s, a) 的初始猜测开始,然后根据迭代公式继续更新它们
公式3
其中 αt 是时间步长 t 的学习率。 在每个观察到的状态下,代理通过 -greedy 算法选择一个动作:算法在时间 t 内以概率 t 随机选择一个动作,并以概率 1 − t 选择累积动作值最高的动作 , 即 at+1 = argmaxaQ(st+1, a)。 随机选择动作,称为探索,允许算法更充分地探索解决方案空间,并在 t → 0 时 t → ∞ 时为算法提供最优保证(Sutton 和 Barto 1998)。
到目前为止讨论的所有算法都保证它们将获得最佳策略。 然而,由于维度灾难,这些方法无法在合理的时间内解决具有大状态或动作空间的 MDP。 许多感兴趣的问题(包括啤酒游戏)都有很大的状态和/或动作空间。 此外,在某些设置中(同样,包括啤酒游戏),决策者无法观察到完整的状态变量。 这种情况被称为部分观察到的 MDP (POMDP),使问题比 MDP 更难解决。
为了解决大型 POMDP 并避免维数灾难,在 Q 学习算法(Sutton 和 Barto 1998)中近似 Q 值是很常见的。 线性回归通常用于此目的(Melo 和 Ribeiro 2007); 但是,它对于我们的应用程序来说不够强大或不够准确。 非线性函数和神经网络逼近器能够提供更精确的逼近; 另一方面,由于与观测序列中的非平稳性和相关性相关的问题,它们会提供不稳定甚至发散的 Q 值(Mnih 等人,2013 年)。 Mnih 等人的开创性工作。 (2015) 解决了这些问题提出目标网络并利用经验回放记忆(Lin 1992)。 他们提出了一种深度 Q 网络 (DQN) 算法,该算法使用深度神经网络来获得 Q 函数的近似值,并通过 Q 学习算法的迭代来训练它,同时更新另一个目标网络。 该算法已应用于许多竞技游戏,Li (2017) 对其进行了评论。 我们的啤酒游戏算法就是基于这种方法。
啤酒游戏展示了另一个特征,使其与 DQN 普遍应用的大多数设置不同,即有多个代理以分散的方式合作以实现共同目标。 这样的问题称为去中心化 POMDP,或 DecPOMDP。 由于每个代理的局部观察的部分可观察性和非平稳性,Dec-POMDP 极难解决,被归类为 NEXP 完全问题(Bernstein 等人,2002 年)。啤酒游戏展示了上述所有复杂特征——大的状态和动作空间、部分状态观察和分散合作。 在下一节中,我们将讨论解决啤酒游戏的当前方法的缺点,我们的算法旨在克服这些缺点。
2.3当前算法的缺点
在 2.1 节中,我们回顾了解决啤酒游戏的不同方法。 尽管 Clark 和 Scarf (1960) 的模型可以解决某些类型的串行系统,但对于更一般的串行系统,最优策略的形式和参数均未知。 此外,即使在基本库存策略是最优的系统中,如果其他代理不遵循该策略,那么对于给定代理来说,这种策略可能不再是最优的。 Mosekilde 和 Larsen (1988)、Sterman (1989) 和 Strozzi 等人基于公式的啤酒游戏模型。 (2007) 尝试模拟人类决策; 他们不尝试建模或确定最佳决策。
少数模型试图优化串行供应链中的库存行为,其成本或需求结构比 Clark 和 Scarf(1960)使用的模型更通用; 这些基本上是啤酒游戏设置。 然而,这些论文都假设充分观察或集中决策者,而不是啤酒游戏中采用的本地观察和分散方法。 例如,Kimbrough 等人。 (2002) 使用遗传算法 (GA),而 Chaharsooghi 等人。 (2008)、Giannoccaro 和 Pontrandolfo (2002) 以及 Jiang 和 Sheng (2009) 使用 RL。 然而,经典的 RL 算法只能处理较小或缩小的状态空间。 因此,这些 RL 在啤酒游戏或什至更简单的供应链网络中的应用也假设(隐式或显式)状态空间的大小很小。 这在啤酒游戏中是不现实的,因为代表给定代理库存水平的状态变量可以是 (−∞,+∞) 中的任何数字。 解决这样的 RL 问题几乎是不可能的,因为模型的训练成本非常高。 此外,Chaharsooghi 等人。 (2008) 以及 Giannoccaro 和 Pontrandolfo (2002) 对类似啤酒游戏的设置进行建模,假设信息共享,这不是啤酒游戏中的典型假设。 此外,为了处理维度灾难,他们建议将状态变量映射到少量图块上,这会导致有价值的状态信息丢失,从而导致准确性丢失。 因此,尽管这些论文与我们的工作有关,但他们对完全可观察性的假设将他们的工作与经典啤酒游戏和我们的论文区分开来。
正如我们在 2.2 节中讨论的,啤酒游戏是一个 Dec-POMDP。 轩等人提出的算法。 (2004) 对于一般的 Dec-POMDP 不能用于啤酒游戏,因为它们允许代理进行通信,但会受到一些惩罚; 没有通信,代理就无法学习共享的目标函数。 同样,Seuken 和 Zilberstein (2007) 以及 Omidshafiei 等人。 (2017) 提出了在部分可观察性下解决多智能体问题的算法,同时假设在每个时期所有智能体都知道所有智能体共享的奖励,但在啤酒游戏中,智能体直到游戏才学习到全部奖励 结束。 有关具有共享奖励的 IL 的研究调查,请参阅 Matignon 等人。 (2012)。
解决这个问题的另一种可能方法可能是经典的监督机器学习算法。 然而,这些算法也不能轻易应用于啤酒游戏,因为没有“正确”输入/输出对形式的历史数据。 因此,我们不能使用带有训练数据集的独立支持向量机或深度神经网络并训练它来学习最佳行动(如 Oroojlooyjadid 等人(2017a,b)用来解决一些更简单的供应链问题的方法)。 根据我们对文献的理解,有效解决啤酒游戏问题与当前算法可以处理的问题之间存在很大差距。 为了填补这一空白,我们提出了一种 DQN 算法的变体来选择啤酒游戏中的订单数量。
2.4 我们的贡献
我们为啤酒游戏提出了一种 Q 学习算法,其中 DNN 逼近 Q 函数。
实际上,我们算法的一般结构基于 DQN 算法(Mnih 等人,2015 年),尽管我们对其进行了大量修改,因为 DQN 是为单代理、竞争性、零和游戏制定的,而啤酒游戏是多代理的 ,去中心化,合作,非零和博弈。
换句话说,DQN 为一个在竞争环境中与环境交互的代理提供动作,而啤酒游戏是一种合作游戏,因为所有玩家的目标都是在随机数中最小化系统的总成本 期间。 此外,啤酒游戏代理是独立进行的,并且在游戏结束和总成本显示之前没有来自其他代理的任何信息,而 DQN 通常假设代理在游戏的任何时间步骤 t 完全观察环境状态。 例如,DQN 已成功应用于 Atari 游戏 (Mnih et al. 2015)、围棋 (Silver et al. 2016) 和国际象棋 (Silver et al. 2017),但在这些游戏中,代理试图击败对手 (人或计算机)并在每个时间步长 t 观察有关系统状态的完整信息。
扩展 DQN 算法以解决啤酒游戏的一种简单方法是使用多个 DQN,一个用于控制每个代理的动作。 然而,使用 DQN 作为每个代理的决策者会导致竞争游戏,其中每个 DQN 代理独立运行以最小化自己的成本。 例如,考虑一个啤酒游戏,其中玩家 2、3 和 4 各有一个独立的、训练有素的 DQN,零售商(阶段 1)使用基本库存策略来做出决策。 如果所有参与者的持有成本都是正的,而只有零售商的缺货成本是正的(这在啤酒游戏中很常见),那么代理 2、3 和 4 的 DQN 将在每个 期间,由于现有库存会损害这些玩家的目标函数,但缺货不会。 这是独立的 DQN 代理在不考虑总成本的情况下最小化自身成本的副产品,这显然不是系统整体的最优解。
相反,我们提出了一个统一的框架,其中代理仍然相互独立,但在训练阶段,我们使用反馈方案,以便 DQN 代理学习整个网络的总成本,并且随着时间的推移可以学习 最小化它。 因此,我们模型中的智能体在游戏的所有时期都能巧妙地发​​挥作用,以获得任何随机范围长度的近乎最优的累积成本。
原则上,我们的框架可以应用于团队中同时玩啤酒游戏的多个 DQN 代理。 然而,迄今为止,我们仅针对单个 DQN 代理设计和测试了我们的方法,该代理的队友不是 DQN,例如,他们由简单的公式或人类玩家控制。 增强算法使多个 DQN 可以同时和协作地播放是正在进行的研究的主题。
我们方法的另一个优点是它不需要了解需求分布,这与经典的库存管理方法(例如,Clark 和 Scarf 1960)不同。在实践中,人们可以根据历史数据来近似需求分布,但这样做容易产生错误,基于近似分布的决策可能会导致啤酒准确性的损失游戏。相比之下,我们的算法直接根据训练数据选择动作,而不是需要直接知道或估计概率分布
当我们为给定的代理调整和训练 DQN 时,所提出的方法非常有效和一组给定的游戏参数(例如,成本、提前期和行动空间)。一旦其中任何一个参数改变,或者代理改变,原则上我们需要调整和训练一个新的网络。虽然这种方法有效,但它很耗时,因为我们需要为每组新的游戏参数。为了避免这种情况,我们建议使用迁移学习(Pan 和Yang 2010) 方法,其中我们将一个代理获得的知识转移到一组游戏参数到另一个具有另一组游戏参数的代理。这样,我们减少将新代理训练大约一个数量级所需的时间。
总而言之,我们的算法是 DQN 算法的变体,用于选择啤酒中的动作游戏。为了获得接近最优的合作解决方案,我们开发了一个反馈方案作为通信框架。最后,为了使用新的成本参数简化训练代理,我们使用迁移学习以有效利用受过训练的代理所学的知识。此外玩好啤酒游戏,我们相信我们的算法可以作为 DQN 和其他机器学习方法可用于复杂供应的实时决策链设置。
最后,我们注意到我们正在将我们的算法集成到一个由 Opex Analytics(http://beergame.opexanalytics.com/) 开发的新在线啤酒游戏中;参见图 3.Opex 啤酒游戏将允许人类玩家与我们的 DQN 代理竞争或一起玩。

A Deep Q-Network for the Beer Game: A Reinforcement Learning Algorithm to Solve Inventory Optimizati相关推荐

  1. Deep Q Network 算法

     Deep Q Network 算法前置基础知识: Reinforcement Learning 基本概念 Q Leaning算法原理 深度学习神经网络知识 Tensorflow.Pytorch.Py ...

  2. 【深度学习入门到精通系列】Deep Q Network

    文章目录 1 什么是 DQN 2 DQN 算法更新 (Tensorflow) 3 DQN 神经网络 (Tensorflow) 4 DQN 思维决策 (Tensorflow) 1 什么是 DQN 我们使 ...

  3. 【强化学习】Deep Q Network深度Q网络(DQN)

    1 DQN简介 1.1 强化学习与神经网络 该强化学习方法是这么一种融合了神经网络和Q-Learning的方法,名字叫做Deep Q Network. Q-Learning使用表格来存储每一个状态st ...

  4. DQN(Deep Q Network)论文笔记

    1.简介 Deep Q Network 属于强化学习.本文是从<Playing Atari with Deep Reinforcement Learning>翻译总结的. 本模型包括卷积神 ...

  5. DQN(Deep Q Network)及其代码实现

    为什么需要DQN 我们知道,最原始的Q-learning算法在执行过程中始终需要一个Q表进行记录,当维数不高时Q表尚可满足需求,但当遇到指数级别的维数时,Q表的效率就显得十分有限.因此,我们考虑一种值 ...

  6. dqn/deep q network

    文章目录 核心思想 细节 experience replay fixed q-values 核心思想 基于q-learning,用深度神经网络,评估当前state和action组合的q值 细节 q-l ...

  7. Deep QLearning算法详解(强化学习 Reinforcement Learning)

    一.算法详解 文章最后附有博主自己实现的深度qlearning玩space invader游戏 本文介绍的是基于神经网络的qlearning算法.我们知道传统的qlearning算法只能处理状态和动作 ...

  8. Deep Reinforcement Learning Approach to Solve Dynamic Vehicle Routing Problem with Stochastic Custom

    摘要 在现实的城市物流运作中,路线和任务的变化是对动态事件的响应.为了确保消费者的需求得到满足,规划者需要快速(有时是瞬间)做出这些改变.本文提出了一个带时间窗的动态车辆路径问题,它是一个基于路径的马 ...

  9. Decision-making Strategy on Highway for Autonomous Vehicles using Deep Reinforcement Learning

    Decision-making Strategy on Highway for Autonomous Vehicles using Deep Reinforcement Learning 采用深度强化 ...

  10. 【阅读笔记】Falsification of Cyber-Physical Systems Using Deep Reinforcement Learning

    FM2018 Falsification of Cyber-Physical Systems Using Deep Reinforcement Learning (International Symp ...

最新文章

  1. apple hosts
  2. html设备监控系统模板,蓝色的远程监控设备系统后台管理界面模板
  3. db 文件 加密_有人说Kettle 数据库JNDI方式数据库密码不能加密,搞他!
  4. java heep space错误解决办法
  5. vue-自定义组件传值
  6. Proxy pattern-代理模式
  7. 掌握好数据分析,99%的企业都不会拒绝你
  8. Centos 7.x 安装配置tomcat-8过程梳理
  9. wince车机工厂模式德赛西威_求助:winCE 车机救砖问题,进BootLoader,或者TTL调试问题~~...
  10. linux网桥配置brctl
  11. 飞鱼星行为管理路由器【限制视频】方法(网页+客户端)
  12. Mac 安装谷歌浏览器驱动
  13. 《暗时间》----读书笔记
  14. 近期共享打印机出现打印或联机错误代码为0x0000000b11故障的处理方法
  15. java开发测试工具
  16. 爪哇国新游记之一----第一个类Cube
  17. 微软TTS语音引擎(中文)5.1
  18. telegram纯协议电报群发,自动加群,引流自动化解放双手*
  19. linux --- 2.常用命令 , python3, django安装
  20. 推荐几个Github中国区排名前100的公众号

热门文章

  1. 我在上海对日外贸公司的经历
  2. Php7.5,phpwind7.5灵活的业务支持体系
  3. seo入门,seo入门基础知识
  4. UART使用EDMA收发
  5. 前端获取计算机设备信息,JS怎么获取客户端计算机硬件信息
  6. postgresql 数据库健康巡检 报告
  7. python 从def里面调用另一个def函数内容_在python中从一个类调用def到另一个类
  8. 高质量外链的十大特性
  9. Mikrotik路由器(有线)快速设置教程
  10. JVM快速入门(下)