我正在尝试在我的代码中实现最短路径算法,但我对如何做到这一点感到茫然。假设您有一个包含多个线段的(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
答案 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。