greedy_tsp#

greedy_tsp(G, weight='weight', source=None)[源代码]#

从以下位置开始返回低成本周期 source 以及它的成本。

这近似于旅行商问题的解。它找出推销员可以访问的所有节点的循环,以便在最小化总距离的情况下访问多个节点。它使用一种简单的贪婪算法。本质上,这个函数返回一个大的周期,给定一个源点,周期的总成本是最小的。

参数
G

图应该是一个完全的加权无向图。应包括所有节点对之间的距离。

weight字符串,可选(默认为“权重”)

与边权重对应的边数据关键点。如果任何边不具有该属性,则权重设定为1。

source节点,可选(默认:列表中的第一个节点(G))

起始节点。如果没有,则默认为 next(iter(G))

返回
cycle节点列表

返回销售人员可以遵循的周期(节点列表),以最小化行程的总重量。

加薪
NetworkXError

如果 G 不完整,则该算法将引发异常。

笔记

贪婪算法的这种实现基于以下内容:

  • 该算法在每次迭代时向解中添加一个节点。

  • 该算法选择一个不在该周期中的节点,该节点与前一个节点的连接给该周期增加的成本最小。

贪婪的算法并不总是给出最好的解决方案。然而,它可以构造第一个可行解,该可行解可以作为参数传递给迭代改进算法,例如模拟退火法或阈值接受法。

时间复杂性:它有一个运行时间 \(O(|V|^2)\)

实例

>>> from networkx.algorithms import approximation as approx
>>> G = nx.DiGraph()
>>> G.add_weighted_edges_from({
...     ("A", "B", 3), ("A", "C", 17), ("A", "D", 14), ("B", "A", 3),
...     ("B", "C", 12), ("B", "D", 16), ("C", "A", 13),("C", "B", 12),
...     ("C", "D", 4), ("D", "A", 14), ("D", "B", 15), ("D", "C", 2)
... })
>>> cycle = approx.greedy_tsp(G, source="D")
>>> cost = sum(G[n][nbr]["weight"] for n, nbr in nx.utils.pairwise(cycle))
>>> cycle
['D', 'C', 'B', 'A', 'D']
>>> cost
31