最短路径算法

时间:2016-08-01 17:30:28

标签: algorithm matlab shortest-path

我正在尝试在我的代码中实现最短路径算法,但我对如何做到这一点感到茫然。假设您有一个包含多个线段的(x,y)坐标的矩阵。假设每个线段都有一个与之相关的分数,分数表示"有价值的"那个线段是一个设计。

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

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

现在,假设在上面的矩阵中没有提供连接信息,即你​​不知道基于矩阵的1行与另一行的关系。基于上面的矩阵,我想找到产生最高分的元素路径(在我的程序中它是最低分,但这是语义)。然而,问题是每个路径必须是连续的,连接线段之间没有跳跃。有谁知道如何编码?我在下面有一段代码,其中每个元素的分数都被计算并存储(在矩阵元素图中),但是一旦我有了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 个答案:

答案 0 :(得分: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