|
|
""" |
|
|
========================== |
|
|
Traveling Salesman Problem |
|
|
========================== |
|
|
|
|
|
This is an example of a drawing solution of the traveling salesman problem |
|
|
|
|
|
The function is used to produce the solution is christofides, |
|
|
where given a set of nodes, it calculates the route of the nodes |
|
|
that the traveler has to follow in order to minimize the total cost. |
|
|
""" |
|
|
|
|
|
import matplotlib.pyplot as plt |
|
|
import networkx as nx |
|
|
import networkx.algorithms.approximation as nx_app |
|
|
import math |
|
|
|
|
|
G = nx.random_geometric_graph(20, radius=0.4, seed=3) |
|
|
pos = nx.get_node_attributes(G, "pos") |
|
|
|
|
|
|
|
|
pos[0] = (0.5, 0.5) |
|
|
|
|
|
H = G.copy() |
|
|
|
|
|
|
|
|
|
|
|
for i in range(len(pos)): |
|
|
for j in range(i + 1, len(pos)): |
|
|
dist = math.hypot(pos[i][0] - pos[j][0], pos[i][1] - pos[j][1]) |
|
|
dist = dist |
|
|
G.add_edge(i, j, weight=dist) |
|
|
|
|
|
cycle = nx_app.christofides(G, weight="weight") |
|
|
edge_list = list(nx.utils.pairwise(cycle)) |
|
|
|
|
|
|
|
|
nx.draw_networkx_edges(H, pos, edge_color="blue", width=0.5) |
|
|
|
|
|
|
|
|
nx.draw_networkx( |
|
|
G, |
|
|
pos, |
|
|
with_labels=True, |
|
|
edgelist=edge_list, |
|
|
edge_color="red", |
|
|
node_size=200, |
|
|
width=3, |
|
|
) |
|
|
|
|
|
print("The route of the traveller is:", cycle) |
|
|
plt.show() |
|
|
|