最短路径算法

Shortest Path Algorithm

我正在尝试在我的代码中实现最短路径算法,但我不知道该怎么做。假设您有一个包含多个线段的 (x,y) 坐标的矩阵。假设每条线段都有一个与之关联的分数,该分数表示 "valuable" 该线段对设计的影响。

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

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

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

在我看来你是从这样一个数组开始的:

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

在您着手寻找最短路径之前,我建议您编写代码来做一些准备工作。我建议您首先创建一个 new/separate 数组来表示作为线段端点的 x-y- 坐标对。

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

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

接下来,随便name/index这几个点

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

您可以根据 pointID 而不是 x 和 y 坐标来考虑原始 table。没有必要写代码来做这件事,但是可以用一个小例子手工完成,以帮助构思。

+--------------+------------+-------+
| 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), you are now ready to find a shortest path