Java 中的目标堆栈规划程序2024 年 9 月 10 日 | 阅读 8 分钟 目标栈规划是一种流行的用于规划和解决任务的人工智能技术。它涉及将复杂任务分解为一系列子目标和实现这些目标的动作。在本文中,我们将探讨目标栈规划的概念,并用 Java 实现一个简单的目标栈规划程序。我们将通过包含代码示例和输出的逐步过程来演示其功能。 理解目标栈规划目标栈规划采用自顶向下的方法来解决问题。它从一个高层目标开始,并递归地将其分解为子目标,直到子目标可以通过一系列动作直接实现。核心思想是通过将初始目标分解为更简单的子目标,并最终分解为一系列可执行动作的序列,来找到实现初始目标的计划。 让我们考虑一个简单的例子来说明目标栈规划。假设您想烘烤一个蛋糕,目标是准备好一个美味的蛋糕。为了实现这个目标,您需要执行一些子目标,例如准备面糊、预热烤箱、烘烤蛋糕和装饰蛋糕。
这些子目标中的每一个可能都需要进一步分解为更细粒度的动作。例如,准备面糊可能涉及收集配料、混合它们以及将面糊倒入烤盘等步骤。这些步骤将继续分解为更简单的动作,直到我们达到每个动作都可以直接执行的级别。 在 Java 中实现目标栈规划现在,让我们在 Java 中实现一个简单的目标栈规划程序。我们将从定义一个代表目标的 Goal 类和一个代表目标栈的 Stack 类开始。 GoalStackPlanning.java 输出 Current Goal: Have a delicious cake ready Goal achieved: Have a delicious cake ready 在这个示例中,我们有一个 Goal 类来表示每个目标,以及一个 Stack 来维护目标栈。GoalStackPlanning 类中的主循环从栈中弹出目标并检查它们是否可实现。如果一个目标是可实现的,它将打印目标已实现。否则,它会将目标分解为子目标(为简单起见,未实现分解规则)。 由于高层目标是可实现的,因此程序直接实现它,而无需任何分解。 实现目标分解现在,为了使程序更有用,让我们实现目标分解规则。我们将修改 decompose 函数来将高层目标分解为子目标。 GoalStackPlanning.java 输出 Current Goal: Have a delicious cake ready Current Goal: Decorate the cake Current Goal: Apply icing on the cake Goal achieved: Apply icing on the cake Current Goal: Prepare icing Current Goal: Add food coloring Goal achieved: Add food coloring Current Goal: Mix sugar and butter Current Goal: Get butter Current Goal: Find butter in the fridge Goal achieved: Find butter in the fridge Current Goal: Take butter from the fridge Goal achieved: Take butter from the fridge Goal achieved: Get butter Current Goal: Get sugar Current Goal: Find sugar in the pantry Goal achieved: Find sugar in the pantry Current Goal: Take sugar from the shelf Goal achieved: Take sugar from the shelf Goal achieved: Get sugar Goal achieved: Mix sugar and butter Goal achieved: Prepare icing Goal achieved: Decorate the cake Current Goal: Bake the cake Current Goal: Put the batter in the oven Current Goal: Prepare the batter Current Goal: Mix the ingredients Current Goal: Add sugar Goal achieved: Add sugar Current Goal: Mix flour and eggs Goal achieved: Mix flour and eggs Goal achieved: Mix the ingredients Goal achieved: Prepare the batter Current Goal: Preheat the oven Current Goal: Wait for preheating Goal achieved: Wait for preheating Current Goal: Set oven temperature Goal achieved: Set oven temperature Goal achieved: Preheat the oven Goal achieved: Bake the cake Goal achieved: Have a delicious cake ready 从输出中可以看出,程序成功地将高层目标分解为子目标,实现了每个子目标,并最终实现了准备好美味蛋糕的高层目标。 动态目标选择我们可以做的另一个增强功能是根据规划过程的当前状态动态选择要实现的目标。与其使用静态栈,不如实现一种策略来动态选择最相关的目标。 一种方法是根据目标它们的启发式得分进行优先排序,正如我们在前面的部分中所实现的。但是,我们也可以考虑实现目标所需的动作数量或目标与动作之间的依赖关系等因素。 GoalStackPlanning.java 输出 Current Goal: Prepare the batter Goal achieved: Prepare the batter Current Goal: Gather ingredients Goal achieved: Gather ingredients Current Goal: Mix the ingredients Goal achieved: Mix the ingredients 这种动态目标选择策略允许规划器适应问题域的变化或调整规划过程以更有效地实现目标。 总而言之,目标栈规划是一种强大的人工智能技术,用于通过将复杂问题分解为更简单的子目标和动作来解决它们。在本文中,我们探讨了目标栈规划的概念,并用 Java 实现了一个简单的目标栈规划程序。我们首先定义了 Goal 类来表示目标,并使用 Stack 来管理目标栈。 然后,我们实现了主规划循环,该循环从栈中弹出目标,检查它们的可实现性,并使用分解规则将它们分解为子目标。通过运行程序,我们观察到它如何通过将其分解为一系列子目标和动作来实现高层目标。 请记住,这只是目标栈规划的一个基本实现,实际场景可能涉及更复杂的规则和条件。尽管如此,目标栈规划仍然是有效解决复杂问题和规划任务的宝贵工具。 下一主题Java 中的半菱形图案 |
? 在 Java 中,从字符串中删除子字符串涉及操作原始字符串以排除指定的子字符串。此过程可以通过各种方法实现,通常涉及字符串处理方法,这些方法可以识别子字符串的位置,然后创建一个不包含子字符串的新字符串...
阅读 10 分钟
递归是函数直接或间接调用自身的进程,相关的函数称为递归函数。递归可以轻松解决一些问题。汉诺塔(TOH)、中序/前序/后序树遍历、DFS 等问题是……
阅读 2 分钟
在 Java 中,要将数字分解成各位数,我们必须了解 Java 的 while 循环、模运算符和除法运算符。Java 中的模运算符用于确定余数,而除法运算符则给出商作为结果。在本节中,我们创建了 Java 程序……
阅读 3 分钟
Java 是当今市场上需求量最大的语言之一。事实上,全球有千万开发者使用 Java 编程语言,而且这个数字还在不断增长。因此,如果您是 Java 开发人员,或者是一位初露头角的 Java 爱好者,那么...
阅读 8 分钟
Minecraft 是由 Mojang Studios 开发的一款沙盒视频游戏。它以 Java 编程语言编写。它由 Markus Persson 开发。2009 年 5 月,它发布于个人电脑。Minecraft Java 版支持 Windows、Linux 和 macOS 之间的跨平台游戏。它...
阅读 4 分钟
Java 中的自定义类允许开发人员通过定义封装状态(属性)和行为(方法)的新类来创建自己的数据类型。这种灵活性是 Java 面向对象特性的基础,它能够创建复杂且可重用的代码。以下是有关自定义的详细指南...
5 分钟阅读
Java 以其健壮且通用的特性,提供了多种方法将文件从一个位置复制到另一个位置。无论您是处理本地文件系统还是远程服务器,Java 丰富的 API 都使文件操作成为一项简单的任务。在本综合指南中,我们将探讨各种技术...
5 分钟阅读
? 在面向对象编程中,不可变字符串或对象一旦创建就无法修改。但我们只能改变对象的引用。我们限制更改对象本身。Java 中的 String 是不可变的,因为安全、同步和并发... ...
阅读 4 分钟
优化应用程序性能的一个有效工具是 Java 的配置文件注解功能,它允许您指定各种参数和优化。它提供了一种注解代码以指示应使用它的特定场景。在本节中,我们将...
5 分钟阅读
在本节中,我们将讨论如何使用 Java 中的字节数组反转字符串。以下是使用 Java 中的字节数组反转字符串的步骤。此方法的第一步是生成一个长度为……的临时字节数组
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India