迷宫最短路径-货郎担问题的解决思路

要解决的问题:

给定一个迷宫,此迷宫中有且仅有一个入口和出口,其中设有若干检查点,要求从入口开始,经过所有检查点后到达出口所需的最短路径。其中路径中允许多次经过入口或出口或某检查点,但路径的开始和结尾必须分别是入口和出口。更形象一点就是要把图中所有的宝藏找出来带出去的问题。
    连设计算法+写算法实现的论文+编写代码和制作演示动画,花费了四天时间,还是小有收获的赶脚。算法的核心描述就是先假设已经有一个最优路径,然后插入一个新的检查点时,如何使插入导致的路径增量最小。
这种先假设存在最优路径然后再在这条假设的路径中插入新的结点的思想其实就是贪心算法,出现在很多算法当中,并且十分行之有效,其基本模型就是持有两个关键集合,根据条件改变集合元素来动态规划集合中元素的组织方式。此题中的寻宝算法十分类似于货郎担问题,区别在于,货郎在寻找旅行路线时不能经过已经走过的城市,且最终要回到出发点,而这里的模型是可以经过已经走过的城市,但最终不是要回到出发点,而是以达到一个指定点结束。但本质上都需要两个动态集合来保存这些代表地点的结点。货郎担问题相对于此问题的简单之处表现在其不重复的特点上,因为不重复,所以每个结点必有单前驱与单后继,集合中元素都不相同,组合起来就很简单。而此问题由于可以多次经过同一个节点,所以在一条路径上就存在多个相同的结点,这就导致了同一结点有多前驱或多后继的问题。本问题解决的关键就是要解决这种多前驱与多后继的问题,也就是要决定同一结点如何在集合中表现出多种身份的方式。我在设计此算法时,到此便知道这就是问题的核心了,最终想到的办法就是为多前驱或多后继的结点建立多个虚拟结点,这些虚拟结点实质上共享同一个位置,但却分别有着不同的前驱与后继,因此可以构成一条完成的路线。然后问题就转移到如何在两个集合中标识这些虚拟结点的身份了。剩下的问题不再是难题,除了需要计算在插入新结点时如何查找最优插入区间、如何计算插入后带来的代价增量、如何决定是采用正常插入模式还是采用创建新的虚拟结点的插入方式等问题了。其中用到了算法导论一书中介绍的“三角不等式(两边之和大于第三边,两边之差小于第三边)”原理来计算和比较代价增量。

最后,如设计算法时所描述,这其实是一个NP完全问题,无法验证它是最优的,插入时存在稳定性改变的问题,但绝大多数情况下,得到的结果就是我们想要的最优结果。同时,整个寻路过程中,BFS算法的时间复杂度为O(logn),其中包括前向找出口的logn的时间和回退的logn的时间以及路径方向整理的logn的时间,这个总的时间复杂度虽然不算特别大,但却经常需要计算两点间的最短路径,而在很多情况下,需要重复计算上一次所得的结果。因此在算法中适时保存和处理中间结果将能够大大提高算法的时间性能。
    最终的运行结果如图所示:


时间: 2024-08-28 07:37:22

迷宫最短路径-货郎担问题的解决思路的相关文章

迷宫最短路径

1226: 迷宫最短路径 时间限制: 1 Sec  内存限制: 128 MB 提交: 1  解决: 1 [提交][状态][讨论版]      [Edit]      [TestData] 题目描述 给定一个大小为N*M的迷宫.迷宫有通道和墙壁组成,每一步可以向上下左右是个方向移动.求起点到终点的最短路 M,N<=100. 输入 创建迷宫. 输出 输出最短路长度. 样例输入 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### .

Can&#39;t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘ (2)解决思路

首先说明一下mysql.sock文件的作用: 连接mysql有两种方式,第一种是TCP/IP,第二种就是直接使用unix domain socket,它比TCP/IP块. mysql.sock是在mysql-server和client在同一服务器上时,发起本地连接时可用,而无需定义-h参数指定具体的IP.mysql.sock是随每次mysql server启动时生成,通常配置参数是将mysql.sock生成在/tmp/目录下.即在/etc/my.cnf文件中指定socket=/tmp/mysql

防止多图OOM的核心解决思路就是使用LruCache技术

防止多图OOM的核心解决思路就是使用LruCache技术.但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时.对此,Google又提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证).只可惜,Android Doc中并没有对DiskLruCache的用法给出详细的说明,而网上关于DiskLruCache的资料也少之又少,因此今天我准备专门写一篇博客来详细讲解DiskLruC

一个Android多平台问题兼容解决思路

问题:使用AS打出来的签名包,在调试一直用的5.0的小米手机上可以正常运行,4.4的联想手机上闪退,5.1的模拟器上闪退. 抛出:java.lang.UnsatisfiedLinkError,ClassLoader找不到相关的so库. 解决思路: 猜想跟CPU架构有关系,查询如下(cat /proc/cpuinfo): 模拟器:                     电脑使用的是Intel的cpu                         x86_64架构 联想:Processor  

Jquery UI - DatePicker 在Dialog中无法自动隐藏的解决思路

通过Jquery UI Dialog模态展示如下的一个员工编辑页面,但是遇到一个奇怪的问题:点击Start Date的input元素后,其无法失去焦点.从而导致DatePicker控件在选择日期后无法自动隐藏. 解决思路:给DatePicker加上onSelect事件,在该事件中让Start Date的input元素的父元素获取焦点,这样DatePicker控件在选择日期后就自动隐藏.

Qt新建项目No valid kits found解决思路

Qt新建项目No valid kits found解决思路 第一次用Qt Creator创建Project时,进入Kit Selection窗口后,会提示No Valid kits found. Please add a kit in the options or via the maintenance tool of the SDK.错误. 解决思路如下: 需要设置Qt SDK,Device type等的路径给Qt Creator.假设已装Qt SDK,安装方法在(这里).解决方法:点击蓝色o

系统优化(一)Maven打包同一个jar有不同的:版本+时间戳(解决思路)

解决:maven仓库的ear里面有很多个相同的jar(只是包含不同的:版本+时间戳) 问题描述: 发现ear里面有很多个相同的jar,只是包含不同的:版本+时间戳,如下图所示: (例如:itoo-basic-api有很多相同的jar,只是包含不同的:版本+时间戳) 解决思路 用权限的itoo-authority-usergroup-ear模块进行测试 1.怀疑是:maven的坐标,时间戳的问题 关键字: maven snapshot maven war中同一个jar有很多不同版本 maven 本

Error:Configuration with name &#39;default&#39; not found.解决思路

出现这问题的原因是你依赖的工程没有make project,意思是你导入项目的工程没有正确编译通过. 解决办法很巧妙,你可能是直接在android studio里将别的成功使用的项目里该依赖的工程拷贝到你现在的项目,但是你有没有发现你拷贝不完全,没有把很多文件拷贝进去,你应该从成功使用的项目里文件夹里拷贝到你现在的项目的文件夹里,在同步android studio,你发现拷贝完全了,再次编译就能通过了.这是我下项目中遇到的一中情况,希望对同学们有所帮助,有不对的地方敬请指教哦O(∩_∩)O Er

GIS与FVCOM模型耦合的关键技术及解决思路

1. FVCOM本身为Linux下的MPI程序,首先将其移植到Windows下,可以编译成控制台程序. 2. FVCOM的前处理由GIS完成剖分网格和初始设定等工作. 3. FVCOM的输出采用自定义的NetCDF数据格式,完成4D数据的描述及存储. 4. C#实现.Net平台下FVCOM控制台程序的调用.主要关键技术如下: (1)控制台的调用及重定向.采用多线程方法调用控制台程序 (2)得到控制台输出流,对特定变量进行区分,用于进程条的控制. (3)采用多线程方法将控制台的输出流,追加显示到T