计算机科学:最终项目
此项目将包括最终报告和您的代码。您的最终报告将包括以下内容。你会
正在为此最终项目提交.py(NOT*.ipynb)文件。
•标题页
•目录
•图表表
•一份执行摘要,强调你的实验/分析的一些主要收获
•向TA解释如何导航代码的附录。
对于每个实验,在你的实验室报告中包括一个与该实验相关的清晰部分。这份报告应该看起来专业且可读。
请注意:这是完整的第一部分和第二部分。分组完成第1-5部分。第6部分需要单独完成。请参阅教学大纲中的抄袭政策。
第1部分:单源最短路径算法
第1.1部分:在本部分中,您将实现Dijkstra算法的变体。这是一种流行的最短路径算法,一旦识别出新路径,就会更新到每个节点的当前已知最短路径。这种更新被称为放松,在具有𝑛 最多可以发生的节点𝑛 − 1次。在这一部分中,实现了一个函数dijkstra(图,源,k),该函数以图和源为输入,其中每个节点只能放松k次,其中0<𝑘 < 𝑁 − 1.此函数返回一个距离和路径字典,该字典将节点(整数)映射到距离和路径(节点序列)。
第1.2部分:考虑与前面相同的限制,并实现Bellman-Ford算法的变体。代 写2XC3 最短路径算法这意味着实现一个函数bellman_ford(graph,source,k),该函数将图和源作为输入,并找到每个节点只能放松k次的路径,其中,0<𝑘 < 𝑁 − 1.此函数还返回一个距离和路径字典,该字典将节点(整数)映射到距离和路径(节点序列)。
第1.3部分:设计一个实验来分析第1.1和1.2部分中编写的函数的性能。您应该考虑图形大小、图形等因素。k的密度和值,这在准确性、时间和空间复杂性方面影响算法性能。
第二部分:全对最短路径算法
Dijkstra和Bellman-Ford是单源最短路径算法。然而,很多时候我们面临的问题需要我们解决所有对之间的最短路径。这意味着算法需要找到从每个可能的源到每个可能的目的地的最短路径。对于每对顶点u和v,我们要计算最短路径𝑑𝑖𝑠𝑡𝑎𝑛𝑐𝑒(𝑢, 𝑣) 以及最短路径上倒数第二个顶点𝑝𝑟𝑒𝑣𝑖𝑜𝑢𝑠(𝑢, 𝑣). 如何为正边权重和负边权重设计全对最短路径算法?实现一个可以解决此问题的函数。Dijkstra有复杂性(𝐸 + 𝑉𝑙𝑜𝑔𝑉), 或Ɵ(𝑉2) 如果图是稠密的并且Bellman-Ford具有复杂性(𝑉𝐸) , 或Ɵ(𝑉3) 如果图是稠密的。知道了这一点,你会得出稠密图的两个算法的复杂性是什么?在报告中解释你的结论。你不需要凭经验来验证这一点。
第3部分:A*算法
在这一部分中,您将分析并实验Dijkstra算法的一个修改,称为a(我们将在下一节课中介绍该算法,但如果您想开始学习,您可以自由进行自己的研究)。该算法本质上是一种“知情”搜索算法或“最佳先搜索”,有助于找到两个给定节点之间的最佳路径。最佳路径可以定义为最短路径、最佳时间或最低成本。A最重要的特征是一个可以控制其行为的启发式函数。
第3.1部分:编写一个函数a_Star(图、源、目的地、启发式),它接受有向加权图、源节点、目的地节点和启发式“函数”。假设h是一个字典,它接受一个节点(一个整数),并返回一个浮点值。您的方法应该返回一个2-元组,其中第一个元素是前置字典,第二个元素是算法确定的从源到目标的最短路径。此实现应该使用优先级队列。
第3.2部分:在您的报告中解释以下内容:
•A*试图解决Dijkstra算法的哪些问题?
•您将如何实证检验Dijkstra与A*的对比?
•如果您生成了一个任意的启发式函数(如随机生成权重),如何
Dijkstra的算法与A*相比?
•您会使用A*而不是Dijkstra的哪些应用程序?
第4部分:比较最短路径算法
在这一部分中,您将比较Dijkstra和A算法的性能。虽然生成随机图可以提供一些关于算法如何执行的见解,但并非所有算法都可以使用随机生成图进行评估,尤其是对于启发式函数很重要的A算法。在本部分中,您将在真实世界的数据集上比较这两种算法的性能。随函附上一组包含伦敦地铁系统数据的数据文件。数据描述了大约有300个车站的地铁网络,线路代表了它们之间的连接。将每个站表示为图中的一个节点,如果两个站连接,则站之间的边应该存在。要查找不同边的权重,可以使用每个桩号的纬度和经度来查找两个桩号之间的移动距离。该距离可以作为给定边的权重。最后,为了计算启发式函数,可以使用源和给定站点之间的物理直接距离(而不是行驶距离)。因此,您可以创建一个散列图或函数,作为a*的启发式函数,将输入作为给定的站,并返回源和给定站之间的距离。
生成加权图和启发式函数后,将其用作A*和Dijkstra算法的输入,以比较它们的性能。检查所有对的最短路径,并计算所有站点组合的每个算法所花费的时间,这可能是有用的。使用实验设计,回答以下问题:
•A*何时表现优于Dijkstra?它们什么时候具有可比性?解释你的观察结果,为什么你会看到这些结果。
•您对1)在同一线路上、2)在相邻线路上和3)在需要多次换乘的线路上的车站有何观察?
•使用数据集中提供的“行”信息,计算最短路径在您的结果/讨论中使用了多少行?
图1:伦敦地铁地图
第5部分:根据UML图组织代码
按照图2中的统一建模语言(UML)图组织代码。此外,考虑下面列出的要点,并在报告中标记为第4部分的部分中讨论这些要点(如适用)。
•不要为这一部分重新编写A*算法,而是将UML中的类视为“适配器”。
•讨论图表中使用的设计原则和模式。
•UML在图节点由整数表示的意义上是有限的。你会怎么做
改变UML图以适应各种需求,例如节点被表示为字符串或携带比其名称更多的信息。?解释您将如何更改图2中的设计,使其对这些潜在的更改具有鲁棒性。
•讨论我们可以实现“图形”的其他哪些类型的图形。还有哪些其他实现?
图2:UML图
第6部分:未知算法(单独处理)
在与此文档一起发布的代码中,您会发现𝑢𝑛𝑘𝑛𝑜𝑤𝑛作用它以图形作为输入。做一些逆向工程。试着弄清楚这个函数到底在完成什么。您应该探索在具有负边权重的图上测试它的可能性(为此手动创建一些小图)。通过运行一些实验以及检查代码来确定此函数的复杂性。考虑到这段代码的作用,其复杂性令人惊讶吗?为什么?
年级分组:
第1部分:单源最短路径算法第2部分:全对最短路径法
第3部分:A*算法
第4部分:比较最短路径算法
第5部分:根据UML图组织代码第6部分:未知算法
第25组第15组第20组第30组第10组个人50部分提交类型积分
WX:codinghelp
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。