假设我有一组形式的边(其中每个元组(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中查找了与最短路径相关的功能,但是我找不到适合我问题的功能。对此将有一定的见识!
答案 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)。从现在开始,我将它们称为循环顶点。
算法:
计算每个循环顶点之间的距离。如果您使用Dijkstra的算法,则每个循环顶点为F
,因此总共为O(E + V log V)
。
使用步骤1中的边权重来解决周期顶点上的旅行商问题,这将花费O(FE + FV log V)
。如果这成为一个明显的瓶颈,则有一些近似算法的时间复杂度要好得多。
总费用为O(F!)
。 O(max(FE, FVlogV, F!))
一词很可能会占主导地位。