greedy_tsp#

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

返回从 source 开始的低成本循环及其成本。

这近似解决了旅行商问题。它找到一个包含所有节点的循环,使得销售员可以按顺序访问多个节点,同时最小化总距离。它使用一个简单的贪心算法。本质上,该函数返回一个给定源点的大循环,使得循环的总成本最小化。

Parameters:
GGraph

该图应为一个完整的加权无向图。 所有节点对之间的距离应包含在内。

weightstring, 可选 (默认=”weight”)

对应边权重的边数据键。 如果任何边没有此属性,则权重设置为1。

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

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

Returns:
cyclelist of nodes

返回销售员可以遵循以最小化旅行总权重的循环(节点列表)。

Raises:
NetworkXError

如果 G 不完整,算法会引发异常。

Notes

该贪心算法的实现基于以下内容:

  • 算法在每次迭代中向解决方案添加一个节点。

  • 算法选择一个尚未在循环中的节点,其与前一个节点的连接为循环增加了最小的成本。

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

时间复杂度:运行时间为:math:O(|V|^2)

Examples

>>> 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