找到遍历所需节点集并返回起点的最短路径

时间:2018-08-20 14:57:14

标签: python python-3.x networkx shortest-path graph-traversal

假设我有一组形式的边(其中每个元组(i,j)是从节点i到节点j的有向边):

E=[(1, 6), (1, 7), (2, 3), (2, 6), (3, 2), (3, 8), (4, 5), (4, 7), (5, 4), (5, 9), (6, 1), (6, 7), (6, 2), (7, 1), (7, 6), (7, 4), (8, 9), (8, 3), (9, 8), (9, 5)]

和距离矩阵:

C=[2.5, 5.5, 1.0, 2.0, 1.0, 2.0, 1.0, 2.0, 1.0, 2.0, 2.5, 5.0, 2.0, 5.59, 5.0, 2.0, 5.0, 2.0, 5.0, 2.0]

其中C中的每个元素(例如在第i个位置)对应于E中相应边缘的两个节点之间的距离(在第i个位置)。

现在,我想找到从原点(节点1)开始的最短路径,该路径经过节点2和4,然后返回原点(一个循环)。有没有办法使用Python中的 NetworkX 软件包来做到这一点?还是有其他方法(在计算上并不昂贵)来做到这一点?

我在https://networkx.github.io/documentation/stable/reference/algorithms/shortest_paths.html中查找了与最短路径相关的功能,但是我找不到适合我问题的功能。对此将有一定的见识!

1 个答案:

答案 0 :(得分:1)

您可以将其分解为更简单的问题,我认为在networkx中存在。

import matplotlib.pyplot as plt import numpy as np np.random.seed(82018) ... b1_list = [] for row in range(len(bar_data_yield)): index1 = np.arange(len(bar_data_yield[row])) - 0.2 b1_list.append(ax1.bar(left=index1, width=0.4, height=bar_data_yield[row], bottom=y_offset_yield, color=cmap_yield[row])) y_offset_yield = bar_data_yield[row] b2_list = [] for row in range(len(bar_data_yield)): index2 = np.arange(len(bar_data_yield[row])) + 0.2 b2_list.append(ax1.bar(left=index2, width=0.4, height=bar_data_cost[row], bottom=y_offset_cost, color=cmap_costs[row])) y_offset_cost = bar_data_cost[row] fig.legend(b1_list, list('ABCD'), fontsize=16, loc="upper right") fig.legend(b2_list, list('WXYZ'), fontsize=16, loc="center right") plt.show() plt.clf() plt.close() E分别是原始图形中的边和顶点数。 令V为循环中必须存在的顶点数(本例中为3:节点1、2和4)。从现在开始,我将它们称为循环顶点。

算法:

  1. 计算每个循环顶点之间的距离。如果您使用Dijkstra的算法,则每个循环顶点为F,因此总共为O(E + V log V)

  2. 使用步骤1中的边权重来解决周期顶点上的旅行商问题,这将花费O(FE + FV log V)。如果这成为一个明显的瓶颈,则有一些近似算法的时间复杂度要好得多。

总费用为O(F!)O(max(FE, FVlogV, F!))一词很可能会占主导地位。