simulated_annealing_tsp#
- simulated_annealing_tsp(G, init_cycle, weight='weight', source=None, temp=100, move='1-1', max_iterations=10, N_inner=100, alpha=0.01, seed=None)[源代码]#
返回旅行商问题的近似解。
该函数使用模拟退火法来逼近节点的最小成本周期。从次优解开始,模拟退火会扰乱该解,偶尔会接受使解变得更糟的变化,从而逃离局部最优解。接受此类更改的机会随着迭代的进行而减少,以鼓励获得最佳结果。总之,该函数返回一个从
source
从而使总成本最小化。它还会返回成本。接受提议的变化的机会与一个被称为温度的参数有关(退火在物理上类似于钢在冷却时的硬化)。随着温度的降低,增加成本的移动的机会也会降低。
- 参数
- G图
G
should be a complete weighted undirected graph. The distance between all pairs of nodes should be included.- init_cycle所有节点的列表或“贪婪”
初始解决方案(循环遍历所有节点,返回到起点)。这一论点没有默认的理由让你去思考。如果是“贪婪”,请使用
greedy_tsp(G, weight)
。其他常见的启动周期包括list(G) + [next(iter(G))]
或者最终的结果是simulated_annealing_tsp
在做的时候threshold_accepting_tsp
。- weight字符串,可选(默认为“权重”)
与边权重对应的边数据关键点。如果任何边不具有该属性,则权重设定为1。
- source节点,可选(默认:列表中的第一个节点(G))
起始节点。如果没有,则默认为
next(iter(G))
- temp整型,可选(默认为100)
算法的温度参数。它表示温度的初始值
- move“1-1”或“1-0”或函数,可选(默认为“1-1”)
在寻找新的试验解决方案时使用什么移动的指示器。字符串表示两个特殊的内置动作:
“1-1”:1-1交换,将当前溶液中两个元素的位置互换。调用的函数为
swap_two_nodes()
。例如,如果我们在解决方案中应用1-1交换A = [3, 2, 1, 4, 3]
通过1和4元素的换位,我们可以得到以下结果:A' = [3, 2, 4, 1, 3]
“1-0”:1-0交换,将解决方案中的节点移动到新位置。调用的函数为
move_one_node()
。例如,如果我们在解决方案中应用1-0交换A = [3, 2, 1, 4, 3]
我们可以将第四个元素转移到第二个位置:A' = [3, 4, 2, 1, 3]
您可以提供自己的函数来执行从一个解决方案到相邻解决方案的移动。函数必须将解决方案作为输入,同时还必须使用
seed
控制随机数生成的输入(请参阅seed
在此输入)。您的函数应该将解保持为一个循环,第一个节点和最后一个节点相等,所有其他节点出现一次。您的函数应该返回新的解决方案。- max_iterations整型,可选(默认值=10)
当外部循环的这个连续迭代次数在最佳成本解决方案中没有任何变化时被声明为完成。
- N_inner整型,可选(默认为100)
内部循环的迭代次数。
- alpha浮动在(0,1)之间,可选(默认值=0.01)
外环每次迭代的降温百分比
- seed整数、随机状态或无(默认)
随机数生成状态的指示器。见 Randomness .
- 返回
- cycle节点列表
返回销售人员可以遵循的周期(节点列表),以最小化行程的总重量。
- 加薪
- NetworkXError
如果
G
如果未完成,则该算法将引发异常。
笔记
模拟退火法是一种元启发式局部搜索算法。该算法的主要特点是为了避开低质量的局部最优解而接受偶数解,从而导致代价的增加。
该算法需要一个初始解。如果没有提供,它是由简单的贪婪算法构造的。在每一次迭代中,算法都会仔细地选择一个邻域解。考虑 \(c(x)\) 当前解决方案的成本和 \(c(x')\) 邻居解决方案的成本。如果 \(c(x') - c(x) <= 0\) 则相邻解成为下一迭代的当前解。否则,该算法以概率接受邻域解 \(p = exp - ([c(x') - c(x)] / temp)\) 。否则,将保留当前解决方案。
temp
is a parameter of the algorithm and represents temperature.时间复杂性:用于 \(N_i\) 内部循环的迭代和 \(N_o\) 外环迭代,此算法有运行时间 \(O(N_i * N_o * |V|)\) 。
有关更多信息以及该算法的灵感来源,请参阅:http://en.wikipedia.org/wiki/Simulated_annealing
实例
>>> 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.simulated_annealing_tsp(G, "greedy", source="D") >>> cost = sum(G[n][nbr]["weight"] for n, nbr in nx.utils.pairwise(cycle)) >>> cycle ['D', 'C', 'B', 'A', 'D'] >>> cost 31 >>> incycle = ["D", "B", "A", "C", "D"] >>> cycle = approx.simulated_annealing_tsp(G, incycle, source="D") >>> cost = sum(G[n][nbr]["weight"] for n, nbr in nx.utils.pairwise(cycle)) >>> cycle ['D', 'C', 'B', 'A', 'D'] >>> cost 31