我使用以下dijkstra实现来计算无向图中的所有对最短路径。致电calculateAllPaths()
后,dist[i][j]
包含i
与j
之间的最短路径长度(如果没有此类路径,则为Integer.MAX_VALUE
。)
问题是我的图形的一些顶点是动态删除的,我应该从头开始重新计算所有路径以更新dist
矩阵。我正在寻找一种解决方案来优化更新速度,避免在顶点从我的图表中删除时进行不必要的计算。我已经在搜索解决方案,现在我有一些算法,如LPA *来做这个,但它们看起来很复杂,我想一个更简单的解决方案可以解决我的问题。
public static void calculateAllPaths()
{
for(int j=graph.length/2+graph.length%2;j>=0;j--)
{
calculateAllPathsFromSource(j);
}
}
public static void calculateAllPathsFromSource(int s)
{
final boolean visited[] = new boolean[graph.length];
for (int i=0; i<dist.length; i++)
{
if(i == s)
{
continue;
}
//visit next node
int next = -1;
int minDist = Integer.MAX_VALUE;
for (int j=0; j<dist[s].length; j++)
{
if (!visited[j] && dist[s][j] < minDist)
{
next = j;
minDist = dist[s][j];
}
}
if(next == -1)
{
continue;
}
visited[next] = true;
for(int v=0;v<graph.length;v++)
{
if(v == next || graph[next][v] == -1)
{
continue;
}
int md = dist[s][next] + graph[next][v];
if(md < dist[s][v])
{
dist[s][v] = dist[v][s] = md;
}
}
}
}
答案 0 :(得分:1)
如果您知道顶点仅被动态移除,那么您还可以存储每个此类路径的排列,而不仅仅是存储最佳路径矩阵dist[i][j]
。比如说,dist[i][j]
代替myBestPathInfo
制作自定义类myBestPathInfo[i][j]
,而这个实例的数组,例如isActive
,包含成员最佳距离以及最佳路径的排列。优选地,最佳路径置换被描述为一些顶点对象的有序集合,其中后者是参考类型并且对于每个顶点是唯一的(然而在若干myBestPathInfo实例中使用)。这些对象可以包含布尔属性on-the-fly
(true / false)。
每当移除顶点时,您将遍历每个顶点 - 顶点对的最佳路径排列,以确保没有停用顶点。最后,只有破碎的路径(停用的顶点)才能重新运行Dijkstra的算法。
另一种解决方案是使用线性编程(LP)技术解决所有对的最短路径。删除的顶点可以很容易地作为程序中的附加约束实现(例如流入&lt; = 0 并且流出顶点&lt; = 0 *),之后重新解决最短路径LP:s可以使用先前的最优解作为双LP中的可行基本可行解(BFS)。此属性成立,因为在原始LP中添加约束相当于双重中的附加变量;因此,先前最优的原始BFS在附加约束之后的双重中是可行的。 (FSRef
从LP的单纯形求解器开始)。