【EAI 004】LLM+P:借助LLM和PDDL赋予机器人最优规划能力

news2024/11/16 3:23:09

论文标题:LLM+P: Empowering Large Language Models with Optimal Planning Proficiency
论文作者:Bo Liu, Yuqian Jiang, Xiaohan Zhang, Qiang Liu, Shiqi Zhang, Joydeep Biswas, Peter Stone
作者单位:Department of Computer Science, The University of Texas at
Austin, Department of Computer Science, State University of New York at Binghamton, Snoy AI
论文原文:https://arxiv.org/abs/2304.11477
论文出处:–
论文被引:78(01/05/2024)
论文代码:https://github.com/Cranial-XIX/llm-pddl

Abstract

大型语言模型(LLMs)已经展现出非凡的零样本泛化能力:最先进的聊天机器人可以为日常生活中出现的许多常见问题提供似是而非的答案。然而,到目前为止,LLMs 还不能可靠地解决机器人的长周期规划问题。相比之下,经典规划器一旦以格式化的方式给出问题,就能使用高效的搜索算法快速确定正确甚至最优的规划。为了两全其美,本文介绍了 LLM+P,这是第一个将经典规划器的优势融入 LLM 的框架。LLM+P 接收规划问题的自然语言描述,然后用自然语言返回解决该问题的正确(或最优)计划。LLM+P 首先将语言描述转换成用规划域定义语言(PDDL)编写的文件,然后利用经典规划器快速找到解决方案,再将找到的解决方案翻译回自然语言。除了 LLM+P,我们还从机器人规划场景中定义了一系列不同的基准问题。通过对这些基准问题的综合实验,我们发现 LLM+P 能够为大多数问题提供最佳解决方案,而 LLM 甚至无法为大多数问题提供可行的计划。我们还展示了 LLM+P 能够让家用机器人解决用户用自然语言指定的复杂操纵任务

I. INTRODUCTION

自从这一领域诞生以来,人工智能研究人员就一直在努力创造能用自然语言交谈的程序,并使其具有与人一样的优雅和灵活性。虽然即使是相对简单的模型,如 1966 年的 Eliza [1],也能对一些提示生成看似合理的回答,但生成提示总是相对容易,这暴露了它们与人相比的弱点–缺乏真正的理解

虽然 GPT-4 [2] 和 ChatGPT [3] 等大型语言模型(LLM)已经远远超出了几年前的预期,但它们在这方面并没有什么不同。事实上,互联网上现在充斥着这样的例子:人们陶醉于让 ChatGPT 生成连 5 岁的人类小孩都知道是不明智的输出结果。

鉴于 LLM 的设计和训练方式,这种现象不足为奇。LLMs 并不是专门为展示理解能力而设计的,而是为了在人类在事先设定的上下文下生成可能对人类来说是合理的单词序列。用 Mahowald et.al 的话说[4],LLMs 在语言能力(知道怎么说)方面已经达到了惊人的熟练程度;但在功能能力(知道说什么)方面却差强人意。举例来说,如果询问一个在他们的训练语料库中没有出现过的简单算术问题的结果,或者询问一个需要了解世界如何运作的新颖规划问题的解决方案,他们(相对)很容易上当受骗。

这是否意味着我们应该加大力度,将所有算术和规划问题都纳入他们的训练语料库?显然,这是痴人说梦。另一方面,这又有什么必要呢?我们已经有了能保证得出正确答案的计算器和通用符号规划器。因此,将 LLM 与这些工具连接起来是一种自然而然的替代方法,当然我们也不是第一个探索这种方法的人。

有鉴于此,本文研究目标是首次使 LLM 能够正确解决规划问题。我们的目标是在不改变 LLM 本身的情况下实现这一目标,即使是微调 [5], [6]。相反,我们引入了一种称为 LLM+P 的方法,通过这种方法,当我们向 LLM 提供规划问题的自然语言描述时,LLM:

  • 1)输出适合作为通用规划器输入的问题描述;
  • 2)使用通用规划器解决问题;
  • 3)将规划器的输出转换为自然语言(或连接到机器人的动作执行器)。

我们广泛的经验评估表明,LLM+P 能够为更多的规划问题生成正确的解决方案,其能力远远超过 LLM 本身。虽然本文展示的是规划问题,但这一通用方法也可应用于任何一类拥有完善求解器的问题,例如算术问题(利用计算器)

Limitation:本文并没有要求 LLM 识别它所收到的提示是否适合使用 LLM+P 管道进行处理。未来一个有价值的研究方向是考虑识别提示何时应由 LLM+P 处理

II. BACKGROUND

本节将介绍我们用来表示将由 LLM 解决的规划问题的符号,并回顾经典规划器的标准表示方法。

A. The Classical Planning Problem

从形式上看,规划问题 P P P 的输入是由 ⟨ S , s i n i t , S G , A , f ⟩ ⟨\mathscr{S}, s^{init}, \mathscr{S}^G, \mathscr{A}, f⟩ S,sinit,SG,A,f 元组定义的:

  • S \mathscr{S} S 是一个有限且离散的状态集合,用来描述世界的状态(即状态空间)。我们假设有一个因子状态空间(factored state space),即每个状态 s ∈ S s\in \mathscr{S} sS 是由一组固定变量的值定义的。

  • s i n i t ∈ S s^{init} \in \mathscr{S} sinitS 是初始世界状态(world state)。

  • S G ⊂ S \mathscr{S}^G \subset \mathscr{S} SGS 是一组目标状态。 S G \mathscr{S}^G SG 通常被指定为一系列目标条件(goal conditions),所有这些条件都必须在目标状态下成立。

  • A \mathscr{A} A 是一组符号化的动作(symbolic actions)。

  • f f f 是底层状态转换函数。 f f f 将当前状态和一个动作作为输入,并输出相应的下一个状态。

规划问题 P P P 的解是由 ⟨ a 1 , a 2 , . . . , a N ⟩ ⟨a_1, a_2, ..., a_N⟩ a1,a2,...,aN 组成的抽象的规划 π π π。使得 a 1 a_1 a1 的先决条件在 s i n i t s^{init} sinit 中成立, a 2 a_2 a2 的先决条件在应用 a 1 a_1 a1 后的状态中成立,以此类推,目标条件都在应用 a N a_N aN 后的状态中成立。

B. Planning Domain Definition Language (PDDL)

规划域定义语言(PDDL)是经典规划问题的标准化编码[7], [8]。规划问题 P 的 PDDL 表示分为两个文件:领域文件(domain file)和问题文件(problem file)。

  • 领域 PDDL 文件提供了世界底层规则的提升表示(lifted representation)。它包括一组谓词,这些谓词定义了状态空间 S S S 和行动 A A A 及其前提条件和效果(即转换函数 f)。
  • 问题 PDDL 文件提供了一个对象列表,用于定义域,问题的初始状态 s i n i t s^{init} sinit 和目标条件 S G \mathscr{S}^G SG存在着大量的符号规划器(symbolic planners),它们可以实现高效的搜索算法,以解决 PDDL 形式化的规划问题

在这项工作中,我们的目标是将描述初始状态 s i n i t s^{init} sinit 和目标条件 S G \mathscr{S}^G SG 的自然语言提示用 PDDL 格式化,并利用符号规划器输出正确的计划。我们假设领域规则是可用的(参见第三节中的假设)。

在这里插入图片描述

III. METHOD

本节首先使用一个运行示例来研究在 PDDL 中制定计划提示的方法,然后介绍 LLM+P 方法。

A. Large Language Model as a PDDL Writer

LLM 不擅长规划或长周期推理(long-horizon reasoning)[9],但擅长描述和翻译文本输入,包括以 PDDL 格式重写规划提示(planning prompts)。直觉告诉我们,我们可以将 PDDL 视为一种不同于英语的语言,因此用 PDDL 重写规划提示实质上是一项机器翻译任务,而这正是众所周知的 LLM 所擅长的。在此,我们提供了一个由 GPT-4 编写的 PDDL 问题文件示例,该文件未进行任何提示工程。生成的文件似乎具有正确的 PDDL 语法,但却使用了一个虚构的谓词(empty),并且忽略了 b1 在桌子上的初始条件。

在这里插入图片描述

B. In-Context Learning

众所周知,LLMs 能够在不对其参数进行微调的情况下进行上下文学习(in-context learning),即 LLMs 能够通过简单地对一些输入标签对(demonstrations)进行调节,从而执行未见过的下游任务[10]。下面是一对用自然语言和 PDDL 编写的问题描述,作为上下文提供给 GPT-4。当上下文与上述示例中的提示一起包含时,规划器就能直接解决生成的 PDDL 问题文件。

在这里插入图片描述

C. Large Language Model + Classical Planner (LLM+P)

在这里插入图片描述

在介绍了 LLM 在 PDDL 和上下文学习中对问题进行编码的能力之后,介绍 LLM+P 解决方案(图 1 的底部)。具体来说,我们假设对于每个问题领域,人类专家都能提供一个领域描述(即动作前提条件和效果),该描述将固定用于该领域中发生的所有问题实例。虽然自动生成描述的问题是另一个有价值的研究课题,但在本文中,我们假定描述可以作为 PDDL 域文件提供。LLM+P 方法可直接用作向机器人系统下达任务的自然语言接口。例如,假设我们想让机器人扮演调酒师,调制鸡尾酒。合理的做法是告诉它可以采取哪些行动,但让它自己去推断如何在一组配料的组合下最有效地调制新的鸡尾酒。此外,我们假设Agent会得到一个最小示例,该示例展示了该领域内一个简单问题的示例问题 PDDL 是什么样子的。接下来,Agent将面临一个可能相当复杂的新问题(P)。一旦生成了问题 PDDL 文件,我们就会将其与所提供的领域 PDDL 文件一起输入任何经典规划器,以生成 PDDL 规划 [11]。最后,LLM 将 PDDL 计划翻译回自然语言,完成 LLM+P 管道:

  • 1)根据与人类用户的对话,机器人知道何时触发 LLM+P。
  • 2)提供领域 PDDL,以定义机器人能够执行的操作。该规范与任务无关,与任务相关的实体在 LLM 生成的问题 PDDL 中指定
  • 3)还提供了用自然语言描述的简单问题及其相应的问题 PDDL 文件。

IV. RELATED WORK

本节首先简要介绍了经典规划算法。然后总结了在使用大型语言模型完成规划任务方面的最新进展。最后,本节还将讨论最近关于利用外部模块增强 LLM 的研究。

A. Classical Planning

自动规划或经典规划技术可用于计算实现给定目标的行动序列 [12],[13],[14]。自动规划算法已广泛应用于机器人系统。

  • Shakey 是第一个配备规划组件的机器人,它是用 STRIPS [15] 构建的。之前的一些通用规划架构也被证明可用于机器人规划,如 PRODIGY [16] 和 HTN [17]。
  • 最近为机器人设计的经典规划系统经常使用规划域描述语言(Planning Domain Description Language, PDDL)或答案集编程(Answer Set Programming, ASP)作为规划器的底层动作语言 [18],[19],[20],[21]。例如,研究人员使用经典规划算法为执行配送任务的移动机器人安排行动序列 [22],为自动驾驶车辆推理安全高效的城市驾驶行为 [23],以及为移动机器人团队规划行动 [24]。
  • 任务与运动规划(Task And Motion Planning, TAMP)是一种分层规划框架,它将离散空间中的经典规划与连续空间中的机器人运动规划相结合 [25], [26]。

上述大多数规划方法都需要特定领域的编程语言作为问题及其解决方案的基础表述。而 LLM+P 则利用 LLM 的优势,作为机器人的自然语言接口来解决复杂的规划任务。促使我们使用此类经典规划系统的主要原因是,这些规划系统大多是完善的,它们能保证逻辑上的正确性,并在存在规划的情况下输出规划。许多规划系统还能找到最优(最短)计划,至少在时间充足的情况下是这样。

B. Planning with Large Language Models

近年来,人们开发了各种大型语言模型(LLM),如 Bert [27],CodeX [28],Opt [29],GPT-3 [10],ChatGPT [30],GPT-4 [2],Llama [31],Llama2 [32] 和 PaLM [33]。由于 LLM 经过大量离线文本数据的预训练,因此它们具有惊人的零样本泛化能力,可用于机器人规划任务 [34],[35],[36],[37],[38],[39],[40],[41],[42],[43],[44],[45]。最近有几种方法成功地从 LLMs 中提取了任务知识,从而用自然语言为机器人分解指令或指示。例如,

  • 通过迭代增强提示,LLMs 可用于家居领域的任务规划 [38]。
  • SayCan 是另一种方法,它利用 affordance functions 对机器人进行规划,以考虑行动的可行性,其中的服务请求是用自然语言指定的[34]。
  • ChatGPT for Robotics [3] 研究了如何将 ChatGPT 应用于通用机器人领域 。

然而,现有 LLM 的一个主要缺点是缺乏对复杂任务的长周期推理能力(见 [9], [46] 和 [2] 第 8.2 节)。当遇到此类任务时,它们产生的输出往往是不正确的,即按照输出计划实际上并不能解决任务。因此,在这项工作中,我们将重点利用经典规划器的特性来解决这个问题。同样,最近的一些工作也研究了将经典规划与 LLM 结合起来的方法 [47],[48],[49],[50],[51],[52],[53],[54],[55],[56],[57]。它们或使用提示,或使用微调,使 LLM 能够解决 PDDL 规划问题。通过迭代查询 LLM,长周期规划能力也得到了提高,这在 Minecraft [58] 中得到了验证。相比之下,我们并不完全依赖 LLM 作为问题求解器,而是更多地利用规划器(即生成准确和最优的规划)和 LLM 本身(即将自然语言问题描述转换为 PDDL 的 one-shot 泛化)的优势

C. Augmenting LLMs with External Modules

最近开发的方法表明,通过将 LLM 与外部模块相结合,可以提高 LLM 下游任务的性能。例如,

  • WebGPT [59] 是 GPT-3 的微调版,它结合了网络知识来回答开放式问题。
  • Lazaridou et al.研究了如何利用谷歌等搜索引擎作为 LLM 的外部工具[60]。
  • MemPrompt [61] 提出了一种人在回路系统,在该系统中,不断增长的错误记忆和用户反馈将作为过去的经验,融入提示中,以更准确地回答新问题。
  • REPLUG [62] 是另一种检索增强语言建模范例,它将语言模型视为一个黑盒子,并用一个可微调的检索模型对其进行增强。
  • [63],[64] 研究了使用计算器进行计算。

在最近与我们相关的工作中,Schick et al.训练了一个名为 ToolFormer 的模型,该模型可以通过对 LLMs 提示的在线增强来决定何时以及如何调用某些工具 API [65]。在这项工作中,我们提出经典规划器可以成为另一个特别有用的外部模块。相比之下,LLM+P 并不依赖于对 LLM 的任何微调或再训练。LLM+P 只需将经典规划器的知识融入现有的 LLM 中,就能实现长周期推理和规划功能

作者获悉,同时进行的一项工作[66]介绍了使用 SayCan 数据集[34]将 LLM 与 PDDL 集成的初步结果。不过,SayCan 数据集的范围有限,因为它只包含三个预定义的操作。因此,原论文中评估的所有模型变体都达到了约 90% 的成功率。由于 SayCan 数据集的同质性,Lyu et al.并不需要对领域 PDDL 进行严格定义,这可能会导致计划不可行。因此,我们认为我们的 LLM+P 方法是对增强具有最佳规划能力的 LLM 的更全面研究。

V. EXPERIMENTS

我们进行实验来回答这些问题:

  • 1)How well does LLM-AS-P work? To what extent can state-of-the-art LLMs and LLM-based reasoning methods be directly used for planning? (Not at all)
  • 2)How well does LLM+P work compare to LLM-AS-P? (Much better)
  • 3)What role does the context play in the success of LLM+P? (It’s crucial)
  • 4)Can LLM+P help make service robots more efficient on realistic tasks? (Yes)

A. Benchmark Problems

我们从以往的 International Planning Competitions 中借鉴了七个机器人规划领域,并为每个领域提供了 20 个自动生成的任务 [67]。以下是规划领域的列表,以及每个领域的简要概述。

1)BLOCKSWORLD:给定桌子上的一组积木,机器人的任务是将它们重新排列成指定的目标配置。

2)BARMAN:机器人调酒师的任务是利用现有的配料和容器为顾客调制鸡尾酒。

3)FLOORTILE:一组机器人的任务是在地砖上绘制颜色图案。机器人可以走动并变换颜色,但不能踩在涂有油漆的地砖上。

4)GRIPPERS:一组有两个抓手的机器人的任务是在不同房间之间移动物体。

5)STORAGE: 给定一组升降机,目标是使用升降机将板条箱提升并投放到仓库中。板条箱最初存放在不同的区域,升降机可以在不同的存放区域之间移动。

6)TERMES:机器人的任务是通过搬运和放置积木来建造复杂的结构,还可以爬到积木上建造塔楼。

7)TYREWORLD:机器人的任务是更换爆胎,例如,给轮胎充气,拧紧螺母,完成后按正确顺序将工具搬回引导箱。

B. Experiment Setup

我们使用 GPT-4 进行所有实验。将 temperature 设置为 0,并使用概率最高的响应。因此,LLM 返回的响应是确定性的。生成文本 PDDL 响应后,我们将其输入 FAST-DOWNWARD 规划器,并尝试使用 SEQ-OPT-FDSS-1(保证最优)和 LAMA(不保证最优)两种 alias,最大搜索时间为 200 秒。我们报告了最优 alias 的成功率,对于超时的域,我们在括号中显示了次优 alias 的成功率。对于基线方法,我们手动计算最优方案的数量,并在括号中报告正确方案的数量(如果存在次优方案)。

我们还对最近一种基于 LLM 的深思熟虑的推理方法 Tree of Thoughts [68] 进行了评估,简称为 LLM-AS-P (TOT)。我们将原始 ToT 实现中的广度优先搜索算法用于规划。我们会提示 LLM 从允许的行动中扩展搜索树,并评估路径达到目标的可能性。时间限制同样为 200 秒

C. Results and Analysis

在这里插入图片描述

表 I 提供了在 7 个领域应用 LLM-AS-P 和 LLM+P 的结果。

Findings (LLM-AS-P):

  • 1)尽管 LLM-AS-P 为每个问题提供了一个自然语言计划,但其中大多数计划并不可行。主要原因是 LLM-AS-P 缺乏对先决条件的推理能力。

  • 2)在大多数情况下,无论是否将示例计划作为上下文,LLM-AS-P 的失败方式都是一样的。特别是在 BLOCKSWORLD 领域,LLM-AS-P 无法跟踪 ON 和 CLEAR 等属性。在 BARMAN 域中,LLM-AS-P 的计划无法在再次使用前清洁酒杯。

  • 3)最难处理的域是具有复杂空间关系的域。LLM-AS-P 方法(无论有无上下文)在此类问题上完全失败。在 FLOORTILE 域,LLM-AS-P 生成 “move right to tile 0-4 and paint tile 1-2 black”,但机器人只能将邻近的地砖涂成黑色。在 TERMES 和 STORAGE 中,LLM-AS-P 忽略了机器人不能在原位置卸载木块/木箱的要求。

  • 4)LLM-AS-P (TOT) 在每个树节点上调用 LLM,提供可用行动列表,然后调用 LLM 将树上的每条新路径作为部分计划进行评估。我们发现,LLM 能够对部分计划给出合理的排序,但它往往无法识别计划是否能达到目标。由于 LLM 调用次数较多,LLM-AS-P (TOT) 在大多数情况下都会超时,因此不适合解决长周期问题

Findings (LLM+P):

  • 1)LLM+P 可为大多数问题生成最优规划。大多数失败案例都是由于问题文件指定错误造成的,例如缺少一个初始条件(例如,在 FLOORTILE 中让瓷砖断开连接),导致规划问题无法解决

  • 2)在没有上下文(即示例问题及其相应的问题 PDDL)的情况下,我们发现 LLM 无法生成正确的问题 PDDL 文件。因此,上下文对 LLM+P 的工作非常重要

D. Robot Demonstration

我们将 LLM+P 部署到一个负责整理家居的真实机器人身上,从而验证了 LLM+P 能够高效地解决现实中的服务机器人问题。用户要求机器人将一个芥末瓶从茶几上移到储藏室,并将空汤罐从边桌上扔掉。由于边桌和回收箱都在从茶几到餐具室的途中,因此最佳方案是将芥末瓶搬到边桌上,扔掉汤罐后再重新抓起,总成本为 22。图 2 显示了 LLM+P 找到的最优计划。提示的部分内容和生成的 PDDL 如下所示。LLM-AS-P 输出了一个次优计划,即先把瓶子拿到储藏室,然后再回去拿汤罐,总成本为 31。

在这里插入图片描述
在这里插入图片描述

VI. CONCLUSION AND FUTURE WORK

在这项工作中,我们建议利用经典规划器,使大型语言模型具备最佳规划能力。LLM+P 框架的关键设计选择是让 LLM 专注于将规划问题从自然语言转换为结构化 PDDL 格式。此外,我们还表明,让 LLM 意识到一个简单的 (problem, PDDL) 对作为上下文学习的示范(或上下文)也很重要。进一步扩展 LLM+P 框架的一些有趣方向包括:

  • 1)使 LLM 能够自动检测何时以及如何应用 LLM+P。
  • 2)减少 LLM+P 对人类信息的依赖,可能涉及微调。

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

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

相关文章

WorkPlus Meet打造高质量的视频会议体验,助力实时远程协作

在全球化的商业环境中,远程协作和在线会议成为了企业高效工作的关键。作为一款高质量的视频会议软件,WorkPlus Meet以其卓越的性能和创新的功能,成为企业实时远程协作的首选。 WorkPlus Meet打造了高质量的视频会议体验,为企业提供…

Transformer - Attention is all you need 论文阅读

虽然是跑路来NLP,但是还是立flag说要做个project,结果kaggle上的入门project给的例子用的是BERT,还提到这一方法属于transformer,所以大概率读完这一篇之后,会再看BERT的论文这个样子。 在李宏毅的NLP课程中多次提到了…

vue使用elementui 的 table且自定义某列表头时,添加的点击事件和自带的筛选功能有类似冒泡行为

element 自带的table 需求:在时间这一列的筛选按钮旁边添加一个批量修改按钮问题:如果不加排序这个属性,那么表格自带的筛选和新加的批量筛选点击事件会冲突(冒泡事件)解决方法:在该列添加sortable属性&…

【IDEA】 解决在idea中连接 Mysql8.0,驱动无法下载问题

本篇继【idea】解决sprintboot项目创建遇到的问题2-CSDN博客 目录 一、Failed to download https://download.jetbrains.com/idea/jdbc-drivers/MySQL/8/LICENSE.txt:Remote host terminated the handshake 二、no dirver files provided com.mysql.cj.jdbc.Driver 三、Serv…

[蓝桥杯学习] ST表

RMQ问题 ST 表 用状态 s[i][j] 记录区间长度为 2^j 的长度的区间的最大值 所以状态转移方程就是 st[i][j] max( st[i][j-1] , st[i(1 << (j-1))][j-1] ) 注意状态转移的方向&#xff0c;保证区间合法性&#xff08;i2^j 不能超过数组大小&#xff09; 写完这些后&am…

Linux之Ubuntu环境Jenkins部署前端项目

今天分享Ubuntu环境Jenkins部署前端vue项目 一、插件安装 1、前端项目依赖nodejs&#xff0c;需要安装相关插件 点击插件管理&#xff0c;输入node模糊查询 选择NodeJS安装 安装成功 2、配置nodejs 点击后进入 点击新增 NodeJS 配置脚手架类型&#xff1a;如果不填 默认npm …

软件测试|Linux下Python安装配置指南

在Linux中安装Python是一个简单而且重要的过程&#xff0c;因为Python是一种广泛使用的编程语言&#xff0c;许多系统工具和应用都依赖于它。在本文中&#xff0c;我将详细介绍如何在Linux系统中安装Python。 请注意&#xff0c;在本文中&#xff0c;我将以Centos为例&#xf…

一键了解获取网页requests方式

目录 一、爬虫原理&#xff1a; 二、安装&#xff1a; 测试&#xff1a; 三、文件的操作 方式一 方式二: 方式三 四、认识User-Agent 4.1、为什么用User-Agent&#xff1a; 步骤&#xff1a; 五、请求方式 5.1、get 5.2、post 六、爬出有中国关键字页面案例 一、爬…

【两阶段鲁棒】计及需求响应的多能互补微网两阶段鲁棒优化matlab

目录 1 主要内容 算例模型 目标函数 第一阶段 第二阶段 求解流程图 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《多能互补微网两阶段鲁棒优化调度研究》&#xff0c;在考虑风光不确定集的基础上提出采用计及DR响应的多能互补微网两阶段鲁棒备用调度模…

Android WiFi 连接

Android WiFi 连接 1、设置中WiFi显示2、WiFi 连接流程2.1 获取PrimaryClientModeManager2.2 ClientModeImpl状态机ConnectableState2.3 ISupplicantStaNetworkCallback 回调监听 3、 简要时序图4、原生低层驱动5、关键日志 1、设置中WiFi显示 Android WiFi基础概览 packages/a…

RabbitMQ(九)死信队列

目录 一、简介1.1 定义1.2 何时进入死信队列&#xff1f;1.3 死信消息的变化1.4 死信队列的应用场景1.5 死信消息的生命周期 二、代码实现2.1 死信队列的配置步骤2.2 配置类2.3 配置文件2.4 生产者2.5 业务消费者2.6 死信消费者2.7 测试结果 三、总结 RabbitMQ 是流行的开源消息…

MYSQL InnoDB引擎

逻辑存储结构 架构 内存架构 磁盘结构 后台线程 事务原理 redolog undo log MVCC 基本概念 实现原理 隐藏字段 undo log readview

学习使用layPage, 多功能JS分页组件/插件的方法

学习使用layPage, 多功能JS分页组件/插件的方法 效果图分页代码 效果图 点击查看链接 分页代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>Layui</title><meta name"renderer" content"we…

用队列实现栈oj题——225

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;LeetCode刷题|数据结构|Linux 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 题目要求&#xff1a;实现 MyStack 类&#xff1a;注意&#xff1a;示例&#xff1a;解释&#xff1a;提示&#xff1a; 解题核心数据结构的定义…

通信触发流程

该示例方案主要介绍如何通过建立的Modbus或TCP通信来实现触发方案、协议解析、发送事件和以及响应配置等功能。 需求&#xff1a;使用Modbus通信触发指定流程运行。 搭建思路&#xff1a;在接收事件中使用协议组装&#xff0c;比较规则选择上升沿&#xff0c;当接收到的值从其…

如何成为一名高级UI设计师,UI设计与交互动效进阶教学

一、教程描述 本套教程从基础学习到案例实践教学&#xff0c;涵盖了设计师所需的全部知识和实战技术&#xff0c;比如&#xff0c;品牌形象设计&#xff0c;企业视觉识别系统VIS&#xff0c;标志logo提案设计&#xff0c;banner运营视觉设计&#xff0c;字体搭配使用&#xff…

学习笔记 | Kafka

一、概述 定义 1、Kafka传统定义&#xff1a;Kafka 是一个分布式的基于 发布/订阅模式 的消息队列&#xff08;Message Queue&#xff09; &#xff0c;主要应用与大数据实时处理领域。 2、发布/订阅&#xff1a;消息的发送者不会将消息直接发送给特定的订阅者&#xff0c;而…

企业网盘全方位解读:热门云存储工具的优势与适用场景

企业网盘无疑是当下最热门的企业协同工具。什么是企业网盘&#xff1f;企业网盘与个人网盘又有什么不同呢&#xff1f;一文全方位解读企业网盘这一热门云存储工具。 什么是企业网盘 企业网盘为企业级文件存储、管理与共享平台&#xff0c;企业团队可以在企业网盘中存储企业文…

【python】连上钉钉机器人每日推送

使用Python向钉钉机器人发送消息 导入必要的库 导入json库用于处理JSON数据&#xff0c;time库用于获取当前时间&#xff0c;requests库用于发送HTTP请求。 定义send_ding_message函数 该函数接收一个消息作为参数&#xff0c;并通过POST请求发送给钉钉机器人。请求的URL和头部…

阿里云服务器可用区是什么?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…