无法在2D网格表面找到最短路径

时间:2016-10-04 14:49:05

标签: algorithm matlab dijkstra

三天前我问了这个问题,我被贡献者烧了,因为我没有提供足够的信息。对此我很抱歉。

我有一个2D矩阵,每个阵列位置与一个通道中的水深有关,我希望应用Dijkstra或类似的“最低成本路径”算法来找出构建桥梁所需的最少量的混凝土隔着水面。

将数据格式化为干净的版本花了一些时间,所以我学会了一些基本的Matlab技能​​。我已经移除了大部分土地,现在海岸线被标准化为一定值,我的计划是使用一个循环来移动“西”岸上的每个“像素”并运行最低成本算法对它最近“东”岸并穿过整个网格,最终找到最低成本的一个。

这是我的问题,将数据拟合到任何算法。不幸的是,我被选项和不同格式所淹没,因为其他示例适用于其他用例。

我的另一个考虑因素是,当计算出最短的成本路径时,它将是一条不适合桥梁的锯齿状线,所以我需要在路径中限制弯曲半径,如果可能的话,我不会知道如何去做。

频道图片:

enter image description here

方法方法中的任何建议都会很棒,我只需要知道某人是否知道应该有效的方法,然后我会花时间学习如何拟合数据。

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式将Dijkstra应用于您的问题:

  1. 要连接的两个“干”区域对应于值为0的矩阵条目;其他单元格的正值表示深度(或用混凝土填充这个地方的成本)

  2. 您的边缘是矩阵中相邻单元格的连接。 (它可以是4或8邻域。)边的权重是连通单元格值的算术平均值。

  3. 然后你应用Dijkstra算法,在一个“干”区域有一个起点,在另一个“干”区域有一个终点。

  4. 最便宜的路径将连接两个值为0的单元格,其权重将对应于所访问单元格的成本总和。 (每个细胞重量的一半来自边缘进入细胞,另一半来自离开细胞的边缘。)

    通过这种方式,您将获得一条通向水面的可能相当弯曲的路径,这可能是建造廉价桥梁的有用暗示。

    您可以使用A *算法加快计算速度。因此,需要每个小区到达另一侧的剩余成本的下限。只要环不包含另一侧的0-单元,就可以通过检查点周围的“同心环”来计算这样的下限。然后,每个环的最小单元格值的总和是剩余成本的下限。

答案 1 :(得分:0)

另一种方法,强调你需要一个非锯齿状的桥梁的约束,将使用蒙特卡罗,模拟退火或遗传算法,其中最初的桥梁"在两个随机选择的端点(在裂口的每一侧上有一个)之间加上一个简单的样条曲线,加上在裂口中的少量或随机选择的中间点。你最终会得到一个真实的,逼真的。桥梁和合理优化的混凝土成本。