从无向图中动态删除顶点时,优化重新计算所有对最短路径

时间:2015-12-25 08:57:44

标签: optimization graph dijkstra shortest-path vertex

我使用以下dijkstra实现来计算无向图中的所有对最短路径。致电calculateAllPaths()后,dist[i][j]包含ij之间的最短路径长度(如果没有此类路径,则为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;
            }
        }
    }
}

1 个答案:

答案 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的单纯形求解器开始)。