- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题:在有障碍物的矩形网格上找到多个目标中最近的路径。只允许向上/向下/向左/向右移动(没有对角线)。我确实看到了this question and answers , and this , and that ,等等。我没有看到任何人使用或建议我的特定方法。我的方法是否存在重大错误?
我在这里最重要的约束是,如果需要,将路径(或任何列表)表示为“堆栈”或“单链表”对我来说非常便宜。也就是说,恒定时间访问顶部元素,O(n) 用于反转。
(对我而言)显而易见的解决方案是使用曼哈顿距离启发法搜索从任何目标到起点的路径。从目标到起点的第一条路径将是到最近目标的最短路径(可能是许多路径中的一个),并且我不需要在遵循它之前反转路径(它将以“正确”顺序,起点在上,目标在末尾)。
在伪代码中:
A*(start, goals) :
init_priority_queue(start, goals, p_queue)
return path(start, p_queue)
init_priority_queue(start, goals, q_queue) :
for (g in goals) :
h = manhattan_distance(start, g)
insert(h, g, q_queue)
path(start, p_queue) :
h, path = extract_min(q_queue)
if (top(path) == start) :
return path
else :
expand(start, path, q_queue)
return path(start, q_queue)
expand(start, path, q_queue) :
this = top(path)
for (n in next(this)) :
h = mahnattan_distance(start, n)
new_path = push(n, path)
insert(h, new_path, p_queue)
对我来说,以这种方式反向搜索似乎是很自然的。这里有想法吗?
还有一个问题:假设我的优先级队列在具有相同优先级的元素上是稳定的(如果两个元素具有相同的优先级,则较晚插入的会较早出来)。我故意未定义上面的 next
:随机化返回矩形网格上可能的下一个图 block 的顺序似乎是一种非常便宜的方法,可以通过矩形找到一条不可预测的、相当曲折的路径没有障碍物的区域,而不是沿着两个边缘(锯齿形路径在统计上更有可能)。对吗?
最佳答案
据我所知,它在大 O 中是正确且高效的(N log N,只要启发式是可接受且一致的,其中 N = 网格的单元数,假设您使用其操作有效的优先级队列在日志 N)。之字形也可以。
附注对于这类问题,有一个效率更高的“优先级队列”可以在 O(1) 中运行。我所说的这类问题是指每对节点之间的有效距离是一个非常小的常数(在这个问题中为 3)的情况。
编辑:根据评论中的要求,这里是针对此问题的恒定时间“优先队列”的详细信息。
首先,将图转换为下图:设图中节点(即网格中的单元格)的势为节点到目标(即启发式)的曼哈顿距离。我们称节点 i 的势为 P(i)。之前,相邻单元格之间有一条边,其权重为 1。在修改后的图中,权重 w(i, j) 变为 w(i, j) - P(i) + P(j)。这与在启发式可接受且一致的情况下为什么 A* 是最优的并在多项式时间内终止的证明完全相同。请注意,此问题的曼哈顿距离启发式算法是可接受且一致的。
第一个关键观察是原始图中的 A* 与修改后的图中的 Dijkstra 完全相同。这是因为修改后的图中节点 i 的“值”恰好是与原始节点的距离加上 P(i)。第二个关键观察是我们转换后的图中每条边的权重要么是 0 要么是 2。因此,我们可以通过使用“双端队列”(或双向链表)而不是普通队列来模拟 A*:每当我们遇到权重为 0 的边,将其推到队列的前面,每当我们遇到权重为 2 的边时,将其推到队列的末尾。
因此,该算法模拟A*,在最坏情况下以线性时间运行。
关于algorithm - 修改 A* 以在矩形网格上找到最接近多个目标的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26231305/
您能否建议如何在 Bootstrap 或 IE 兼容的 CSS 网格中,在没有 CSS 网格的情况下进行以下布局。 在大屏幕中 头部,左侧堆叠的 body 和右侧覆盖头部和 body 高度的图像。 [
我想在 Objective-C 中绘制一个 15*15 的网格。格子颜色是蓝色的,就像在诺基亚制作“贪吃蛇”游戏的棋盘一样。 我试过使用 for 循环来创建 subview ,但它似乎不起作用,我查看
我正在尝试将 CSS 网格与 grid-template-columns: repeat(auto-fill, auto) 一起使用,单元格被设置为最大宽度,导致每行一个元素。 p> 是否可以让元素宽
我正在努力在网格的自定义列上添加一个指向网站的简单、简单的链接。我用了 Inchoo blog为列添加自定义渲染器,它可以工作。我认为只需修改渲染并添加标签就足够了。但我的希望破灭了,行不通。 如何做
使用 Gnuplot 我绘制了下图 - 现在,正如您在图像中看到的那样,很难在线条之间识别出其末端的块。所以我想用不同的颜色或样式交替着色网格。 我现在用来给网格着色的代码是 - set style
假设我有一个非常简单的 WPF 网格(6 行 x 6 列),定义如下:
我有一个希望绑定(bind)到 WPF 网格的集合。 我面临的问题是列数是动态的并且取决于集合。这是一个简单的模型: public interface IRows { string Messa
我正在使用 Vaadin 8,我想制作某种混淆矩阵。我想知道是否可以根据单元格位置而不是数据提供者手动填充表格/网格的值。 referenceTable.addColumn(reference ->
我在 http://jsfiddle.net/TsRJy/ 上创建了一个带有 div 框的网格. 问题 我不知道如何使 a:hover 工作。 信息 重写 HTML 代码,因为表格不适合我。 http
银光处女在这里。如何使网格周围的用户控件自动调整大小以适应内部网格宽度?目前,当浏览器窗口更宽时,用户控件的显示尺寸约为 300 或 400 像素。它在数据网格周围呈现垂直和水平滚动条,这很丑陋。我想
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我想使用 CSS Grid 的 grid-template-areas。 但问题是我正在使用的 CMS 添加了大量额外的包装器。有没有办法忽略额外的包装?因为它弄乱了漂亮的网格区域...... 我正在
在我的Grid中,当我单击“操作”按钮(下面的代码中显示的“删除和编辑”按钮)时,我需要弹出一个窗口,而不用警告消息提醒用户; 在下面的代码中,我正在使用HANDLER handler: button
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我需要模拟一个仓库,其中有几辆自动驾驶车辆在给定的布局上移动,并具有简单的优先级规则。根据我的理解,这个问题可以通过离散事件模拟(DES)轻松解决,我会使用 SimPy为了这。 我看到的问题是,我似乎
在 ASP.NET 中,我可以让用户控件在页面上的表格中占据多个单元格: 用户控件1: foo bar 第1页: 并且自动调整列宽以适应最大的用户控件。 这也可以在 WPF
我正在寻找一种方法来实时搜索我的网格+要过滤的复选框。我有一个包含学生的网格(照片和姓名)。我想要的是有一个复选框,可以过滤学生所在的不同类(class)。还有一个搜索栏,我可以在其中输入学生姓名。
我正在使用 jQuery 和 jQuery UI 构建一个 Web 应用程序。我陷入了僵局。我需要的是一个 jQuery 网格,它具有可编辑字段,并以某种方式在这些可编辑单元格之一上合并一个自动完成字
我想知道是否有其他 JavaScript 组件可以提供具有多个分组的网格表示。下面是jqGrid的截图我扩展了允许该功能,但它需要获取所有数据。我希望在扩展分组时加载数据。 另一个修改后的 jqGri
我一直在为我将在此处描述的 CSS 问题而烦恼: 在下面的示例 ( https://codesandbox.io/s/jjq4km89y5 ) 中,您可以看到一个可滚动的内容(紫色背景)和一个被左侧面
我是一名优秀的程序员,十分优秀!