我有一个最好的路径问题需要解决.
给定一个填充了可步行瓦片和非步行瓦片的nxn网格,我必须从A点到达最短路径的B点.
诀窍是一些可行走的瓷砖包含点.当我达到目标时成为有效的解决方案我必须有一定数量的积分.
瓷砖上有不同数量的点(或没有),我需要最短的路径才能达到目标,但在途中也至少聚集了M个点.

我所尝试的是A *算法,该算法找到2点之间的最短路径,并试图将其定制为具有停止条件,不仅仅是当它到达目标而且还具有必要的点.它不像我做的那样工作,因为我阻挡了路径.

如果您有任何建议如何处理此问题或其他更适合的算法,我将不胜感激.
谢谢.

解决方法

如果你仍然坚持这个问题,因为其他答案/评论只给你一个部分答案 – 这里是问题空间的裂缝.

您实际上可以使用A *进行一些修改来捕获(大部分)无序的M点路径.您需要更改的唯一内容是启发式和终止条件.

首先,您需要更改启发式以考虑通过M点的路径.启发式必须是可接受的且一致的,因此它必须等于小于或等于真实路径成本的值,并且它只能在您接近目标时减小(必须是单调递增).

您可以将您现在所采用的路径视为必须完成的M个子路径,每个子路径都充当正常路径.因此,对于单点图(仅具有终止空间),您可以使用欧几里德距离等标准启发式算法.这是一个贪婪的估计,表明直线路径是最佳的,并且在理想情况下你不能做得更好(这是可以接受的).

对于不止一条路径,贪婪的方法同样表示点之间的畅通直线路径是你能走的最快.它仍然是一个一致的启发式,因为你不能走得更远,仍然有更好的分数.困难的部分是选择哪个M点的排序是最快的,没有障碍物以保持可接受的启发式.您可以在图表中找到M点的最佳选择,其中所有图块都可以通过宽度首先搜索从当前图块到每个M点的欧几里德距离,到每个M-1个剩余点,…,到终止广场.此操作非常昂贵,因为您需要为每个到达的方块执行此操作 – 但您可以使用动态编程或搜索缓存将所需的摊销计算降低到每步的O(M).

现在,一旦你拥有了没有障碍物的最快的M点路径,你可以使用该路径中每个点与当前位置之间的欧几里德距离作为启发式.这是一个贪婪的运动估计,所以它总是可以接受的(你不能超过估计的成本)并且它是一致的,因为你不能离开下一个贪婪的最佳点并降低你的成本,因为从当前的瓷砖中选择一个不同的贪婪点是不可接受的.

最后,您的终止标准需要更改为达到M点,其中最后一个点是终止图块.这模仿走M图而不需要构造M!走路的可能图表.提供的启发式算法将让A *在不改变基础算法的情况下实现它的魔力,并且应该在保持通用网格上的启发式所需约束的同时尽可能有效.

c – 网格中的最佳路径的更多相关文章

  1. c – 如何管理特殊情况和启发式

    我经常使用基于特定定义算法的代码.这得到了很好的评论,似乎是正确的.对于大多数数据集,算法运行良好.但随后边缘情况,特殊情况,启发式方法被添加以解决特定数据集的特定问题.随着特殊情况的数量增加,评论越来越模糊.我担心在一年左右的时间内回过头来查看这段代码并试图记住为什么会添加每个特殊的特例或启发式.我有时希望有一种方法可以在源代码中嵌入或链接图形,所以我可以有效地说,“在这个数据集的图形中,这个特

  2. c – 网格中的最佳路径

    走路的可能图表.提供的启发式算法将让A*在不改变基础算法的情况下实现它的魔力,并且应该在保持通用网格上的启发式所需约束的同时尽可能有效.

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部