【问题标题】:Shortest Path Algorithm最短路径算法
【发布时间】:2016-08-01 17:30:28
【问题描述】:

我正在尝试在我的代码中实现最短路径算法,但我不知道如何去做。假设您有一个包含多个线段的 (x,y) 坐标的矩阵。假设每个线段都有一个与之相关的分数,分数表明该线段对设计的“价值”程度。

如果将此信息放入矩阵中,则行的格式可以如下:

开始 X,开始 Y,结束 X,结束 Y,得分

现在,假设上述矩阵中没有提供连接信息,即您不知道基于矩阵的 1 条线与另一条线的关系。基于上面的矩阵,我想找到产生最高分数的元素路径(在我的程序中它是最低分数,但这是语义)。然而,问题是每条路径必须是连续的,连接线段之间没有跳跃。有谁知道如何编码?我在下面有一段代码,其中计算并存储了每个元素的分数(在矩阵 ElementMap 中),但是一旦有了 ElementMap,我不知道如何形成最佳路径。

谢谢

for i = 1:Count2
 for j = 1:length(ElementMap)

    xStart = ElementMap(j,1);
    yStart = ElementMap(j,2);
    xEnd = ElementMap(j,3);
    yEnd = ElementMap(j,4);

    Score = 0;
    if NodeMap(2*(i-1)+1) == ElementMap(j,1) && ElementMap(j,5) ~= 1

        for m = 1:length(ThetaIncident)

            [Point] = RayScore(xStart,yStart,xEnd,yEnd,ThetaIncident(m),OvenGlassXrange);

            Score = Score - Point;
        end
        ElementMap(j,5) = 1;  % 1 will indicate Element has been analyzed
    end
    ElementMap(j,6) = ElementMap(j,6) + Score;
 end
end

【问题讨论】:

  • 我将分两步解决它:1. 从端点创建一个图(即,每个唯一端点都是一个顶点,每个段都是连接两个顶点的加权边),2. 运行合适的图算法
  • 我了解最短路径算法的概念,但我遇到问题的部分是在我的代码上下文中实现一个。
  • 您似乎跳过了@VincentvanderWeele 建议中的第 1 步。大概你有一些独特的坐标(x,y)。每个唯一坐标都是一个顶点。数据的每一行都是一条边。这有意义吗?
  • 这确实有道理,但我有一些问题。本质上,制作图需要几条路径,这些路径被定义为边的集合。使用我的数据,只有某些边缘会在几何上相互连接(形成连续函数),我不知道如何判断哪种边缘组合将形成一条可行的路径。如何形成路径?

标签: algorithm matlab shortest-path


【解决方案1】:

在我看来,您从一个这样的数组开始:

+---------+---------+-------+-------+-------+
| Start X | Start Y | End X | End Y | Score |
+---------+---------+-------+-------+-------+
| 1       | 3       | 2     | 4     | 23    |
+---------+---------+-------+-------+-------+
| 1       | 3       | 7     | -3    | 87    |
+---------+---------+-------+-------+-------+
| 7       | -3      | 5     | 5     | 12    |
+---------+---------+-------+-------+-------+

在您开始尝试寻找最短路径之前,我建议您编写一些代码来完成一些初步工作。我建议您首先创建一个新的/单独的数组来表示作为线段端点的 x-y 坐标对。

使用我上面给出的相同示例数据,我们有:

+---+----+
| X |  Y |
+---+----+
| 1 | 3  |
+---+----+
| 2 | 4  |
+---+----+
| 7 | -3 |
+---+----+
| 5 | 5  |
+---+----+

接下来,任意命名/索引这些点

+---------+---+----+
| pointID | X |  Y |
+---------+---+----+
| 1       | 1 | 3  |
+---------+---+----+
| 2       | 2 | 4  |
+---------+---+----+
| 3       | 7 | -3 |
+---------+---+----+
| 4       | 5 | 5  |
+---------+---+----+

或者,您可以根据 pointID 而不是 x 和 y 坐标来考虑原始表。不需要编写代码来执行此操作,但可以通过一个小示例手动完成以帮助构思。

+--------------+------------+-------+
| StartPointID | EndPointID | Score |    
+--------------+------------+-------+
| 1            | 2          |  23   |
+--------------+------------+-------+
| 1            | 3          |  87   |
+--------------+------------+-------+
| 3            | 4          |  12   |
+--------------+------------+-------+

现在,构造一个矩阵,其中第 i 行第 j 列中的条目是与从索引为 i 的点开始到索引为 j 的点结束的线段相关联的分数。

    ╔═════╦═════╦═════╦═════╗
    ║ 1   ║ 2   ║ 3   ║ 4   ║
╔═══╬═════╬═════╬═════╬═════╣
║ 1 ║ N/A | 23  | 87  | N/A |
╠═══╬-----+-----+-----+-----+
║ 2 ║ 23  | N/A | N/A | N/A |
╠═══╬-----+-----+-----+-----+
║ 3 ║ 87  | N/A | N/A | 12  |
╠═══╬-----+-----+-----+-----+
║ 4 ║ N/A | N/A | 12  | N/A |
╚═══╩-----+-----+-----+-----+

有了最后一个数组(顺便说一下,这称为adjacency matrix),您现在可以为边加权图找到shortest path

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多