作业参考-2025.03.19-night - from 黄老师

news/2025/3/19 23:26:10/文章来源:https://www.cnblogs.com/kkman2000/p/18782136

该项目聚焦于在吃豆人游戏场景中实现搜索算法,以帮助吃豆人智能体寻找路径和收集食物。需要完成的作业主要是在search.py文件中实现深度优先搜索(DFS)、一致代价搜索(UCS)、A*算法这三种搜索算法,以及在searchAgents.py文件中为CornersProblem实现一个非平凡一致性启发函数。

  1. 深度优先搜索(DFS)
    • search.py文件中,深度优先搜索需要使用util.Stack数据结构来实现。从起始状态开始,将其压入栈中,并标记为已访问。然后不断从栈中弹出状态,检查是否为目标状态。若是,则返回到达该状态的动作序列;若不是,则获取该状态的后继状态,将未访问过的后继状态及其动作序列压入栈中,并标记为已访问,持续这个过程直到找到目标状态或栈为空。
    def depthFirstSearch(problem):stack = util.Stack()visited = set()stack.push((problem.getStartState(), []))visited.add(problem.getStartState())while not stack.isEmpty():state, actions = stack.pop()if problem.isGoalState(state):return actionssuccessors = problem.getSuccessors(state)for successor, action, _ in successors:if successor not in visited:stack.push((successor, actions + [action]))visited.add(successor)
    
  2. 一致代价搜索(UCS):在search.pyuniformCostSearch函数中,利用util.PriorityQueue来实现一致代价搜索。将起始状态及其代价(初始为0)放入优先队列,同时记录已访问状态。每次从队列中取出代价最小的状态,若为目标状态则返回路径;否则,获取其后继状态,计算新的代价并将未访问的后继状态及其新代价和路径加入队列,直到找到目标状态。
    def uniformCostSearch(problem):priority_queue = util.PriorityQueue()priority_queue.push((problem.getStartState(), []), 0)visited = set()while not priority_queue.isEmpty():state, actions = priority_queue.pop()if problem.isGoalState(state):return actionsif state in visited:continuevisited.add(state)successors = problem.getSuccessors(state)for successor, action, cost in successors:new_actions = actions + [action]new_cost = problem.getCostOfActions(new_actions)priority_queue.push((successor, new_actions), new_cost)
    
  3. A*算法:在search.pyaStarSearch函数里,A*算法同样使用util.PriorityQueue,结合启发式函数来进行搜索。将起始状态及其总代价(初始为启发式函数值)放入队列,记录已访问状态。每次取出总代价最小的状态,若为目标状态则返回路径;否则,获取后继状态,计算新的总代价(路径代价与启发式函数值之和)并将未访问的后继状态及其新总代价和路径加入队列,直至找到目标状态。
    def aStarSearch(problem, heuristic=nullHeuristic):priority_queue = util.PriorityQueue()priority_queue.push((problem.getStartState(), []), heuristic(problem.getStartState(), problem))visited = set()while not priority_queue.isEmpty():state, actions = priority_queue.pop()if problem.isGoalState(state):return actionsif state in visited:continuevisited.add(state)successors = problem.getSuccessors(state)for successor, action, cost in successors:new_actions = actions + [action]new_cost = problem.getCostOfActions(new_actions) + heuristic(successor, problem)priority_queue.push((successor, new_actions), new_cost)
    
  4. 启发函数设计:在searchAgents.py中为CornersProblem实现启发函数时,要考虑当前状态与目标角落的距离以及已访问角落的情况。利用曼哈顿距离计算当前位置到未访问角落的距离之和,作为启发函数值。同时,确保函数满足非平凡、非负且一致的条件。
    def cornersHeuristic(state, problem):corners = problem.cornerswalls = problem.wallsnode = state[0]visited_corners = state[1]h_sum = 0for corner in corners:if corner not in visited_corners:h_sum += util.manhattanDistance(node, corner)return h_sum
    

完成上述代码实现后,可以按照题目中的测试指令,使用pacman.pyautograder.py对代码进行测试和验证,确保算法的正确性和有效性。

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

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

相关文章

C++ 基础(1)

0x01 第一个C++程序 #include <iostream>int main() {std::cout << "Hello World!\n"; } // std::cout 向控制台输出内容的指令 // << 输出的运算符 // "" 字符串内容的边界符 // \n 输出换行 // Hello World 输出字符…

在ubuntu系统下与开发板连接问题记录

对我所遇到的问题以及解决方法进行简单的记录在开发板与ubuntu(非虚拟机)连接之后使用lsmod查看是否连接lsusb 我的显示如下:如果可以看到自己的USB设备 那么就说明你已经安装了驱动 如果没有 请安装你的串口对应的驱动 我的驱动是CH340 没有安装的朋友可以去下面网站进行…

maven为什么发生依赖冲突?怎么解决依赖冲突?

maven为什么发生依赖冲突?怎么解决依赖冲突? 我们在开发的时候,偶尔会遇到依赖冲突的时候,一般都是NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError。打开搜索框又发现有这个类,明明就是引入进来了,就是找不到,让人头疼 1. 依赖冲突场景 在maven中依赖…

unstructured

unstructured 是一个开源的 Python 库,专门用于处理非结构化数据,如从 PDF、Word 文档、HTML 文件等中提取文本内容,并将其转换为结构化格式(1)安装依赖库pip install unstructured使用textfrom unstructured.partition.auto import partitionfilename = "a.txt"…

idea如何激活到2099年

前言 最近发现idea如何激活使用的问题、 网络上各种都是骗关注加各种公众号的最后也没有解决问题,下面分享一下我的激活方法是如何激活到2099年。目前适用于idea的所有版本。我以最新的ideaIU-2024.3为例。 一去官网上下载idea 官网下载地址:https://www.jetbrains.com.cn/id…

202108032324 - kafka的生产流程

由上图可以看出:KafkaProducer有两个基本线程: 主线程: 负责消息创建,拦截器,序列化器,分区器等操作,并将消息追加到消息收集器 RecoderAccumulator中; 消息收集器RecoderAccumulator为每个分区都维护了一个Deque<ProducerBatch> 类型的双端队列。 ProducerBatch…

Cython二进制逆向系列(三)运算符

在这篇文章里,我们会讨论Cython是如何处理运算符的(数学运算符、位运算符、in/not in 运算符、 ==运算符与逻辑运算符)。总的来叔其中大部分是调用虚拟机api来实现的。Cython二进制逆向系列(三)运算符在开始前,先给出本文用到的py源代码 def test1(x, y):# 数学运算符a…

QOJ 9785 Shrooks

曼哈顿距离转切比雪夫距离,对限制的贪心满足,扩宽限制,简化信息首先考虑限制的形式:对于两点 \((x_1, y_1), (x_2, y_2)\),要求 \(|x_1 - x_2| + |y_1 - y_2| \le n\)。 但是这个式子与 \(x_1, x_2, y_1, y_2\) 这 \(4\) 个值都强相关,且这里的绝对值也并不好拆开处理。 …

golang的GC机制

一、垃圾回收 什么是垃圾回收?垃圾回收(GC,garbage collection)是自动内存管理的一种形式,通常由垃圾收集器收集并适时回收或重用不再被对象占用的内存,比如众所周知的Java语言就能很好的支持GC。后起之秀——Go语言也同样支持垃圾回收,它使得Go程序员在编写程序的时候不…

fastjson漏洞复现(fastjson 1.2.47)

原理: Fastjson 的 @type 字段允许反序列化时动态指定类,攻击者可以通过指定带有危险行为的类,并结合 RMI/LDAP 远程加载恶意类,从而实现命令执行。开启vulhub靶场//如何验证是否存在fastjson反序列化漏洞 有json数据传输的地方可能存在 可以尝试使用dnslog带外但是不知道…

基于神经网络逆同步控制方法的两变频调速电机控制系统matlab仿真

1.课题概述两电机变频调速系统是一个多输入多输出非线性强耦合的控制系统。本课题使用神经网络构造原系统的a阶逆系统,设计线性闭环调节器进行控制,通过matlab对系统进行仿真。对两电机变频调速系统更为精确地实现了张力和速度间的解藕控制。2.系统仿真结果 (完整程序运行后…

使用gradio实现实时语音识别

这里通过gradio来实现实时语音识别,通过上传一个文件,当点击提交后则在右侧输出其相应识别的文字。 实现代码比较简单,如下所示: import gradiodef convert(file_bytes):# 语音识别方法,其中file_bytes是采样率与对应numpy.ndarray实例return recognition_func(file_bytes[1])d…