Creating graphics for euclidean instances of TSP

*爱你&永不变心* 提交于 2020-06-28 05:48:06

问题


I'm currently working on research centring around the Travelling Salesman Problem. More precisely I'm working with sample data using the EUC_2D edge weight type. Like the following:

1 11003.611100 42102.500000
2 11108.611100 42373.888900
3 11133.333300 42885.833300

I am able to produce a tour order. For example, 2-3-1.

I'd like to be able to create some simple graphics which represent a point set for a given problem, and then a point set with a tour over the top. Could anyone recommend a simple method of achieving this - what software should I be looking at to achieve this.

Thanks


回答1:


Just to give you a quick demo on how the usual scientific plotting-tools would work (assuming i understood your task correctly):

Plot-only code using python & matplotlib:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, sharex=True, sharey=True)         # Prepare 2 plots
ax[0].set_title('Raw nodes')
ax[1].set_title('Optimized tour')
ax[0].scatter(positions[:, 0], positions[:, 1])             # plot A
ax[1].scatter(positions[:, 0], positions[:, 1])             # plot B
start_node = 0
distance = 0.
for i in range(N):
    start_pos = positions[start_node]
    next_node = np.argmax(x_sol[start_node]) # needed because of MIP-approach used for TSP
    end_pos = positions[next_node]
    ax[1].annotate("",
            xy=start_pos, xycoords='data',
            xytext=end_pos, textcoords='data',
            arrowprops=dict(arrowstyle="->",
                            connectionstyle="arc3"))
    distance += np.linalg.norm(end_pos - start_pos)
    start_node = next_node

textstr = "N nodes: %d\nTotal length: %.3f" % (N, distance)
props = dict(boxstyle='round', facecolor='wheat', alpha=0.5)
ax[1].text(0.05, 0.95, textstr, transform=ax[1].transAxes, fontsize=14, # Textbox
        verticalalignment='top', bbox=props)

plt.tight_layout()
plt.show()

Output:

This code is based on data of the following form:

A 2d-array positions of shape (n_points, n_dimension) like:

[[  4.17022005e-01   7.20324493e-01]
 [  1.14374817e-04   3.02332573e-01]
 [  1.46755891e-01   9.23385948e-02]
 [  1.86260211e-01   3.45560727e-01]
 [  3.96767474e-01   5.38816734e-01]]

A 2d-array x_sol which is our MIP-solution marking ~1 when node x is followed by y in our solution-tour, like:

[[  0.00000000e+00   1.00000000e+00  -3.01195977e-11   2.00760084e-11
    2.41495095e-11]
 [ -2.32741108e-11   1.00000000e+00   1.00000000e+00   5.31351363e-12
   -6.12644932e-12]
 [  1.18655962e-11   6.52816609e-12   0.00000000e+00   1.00000000e+00
    1.42473796e-11]
 [ -4.19937042e-12   3.40039727e-11   2.47921345e-12   0.00000000e+00
    1.00000000e+00]
 [  1.00000000e+00  -2.65096995e-11   3.55630808e-12   7.24755899e-12
    1.00000000e+00]]

Bigger example, solved with MIP-gap = 5%; meaning: the solution is guaranteed to be at most 5% worse than the optimum (one could see the sub-optimal part in the right where some crossing is happening):

Complete code including fake TSP-data and solving available here.




回答2:


I going to recommend Baby X. (It's my own windowing system).

It's a windows system that runs on either Linux or MS Windows, and is designed for exactly this type of problem - quickly prototyping a program with a few simple graphics.

Baby X exposes rgba surfaces. You then draw into the buffer, either using your own routines, the Baby X basic routines (lines and polygons), or the Baby X graphics context (fully fledged Bezier-based 2D graphics). It's very quick to set up. You'll obviously have to scale your graph to pixel space, plot symbols for the cities, then draw lines between them to represent the tour.

https://github.com/MalcolmMcLean/babyx

However there are several graphics systems out there. You just have to choose one that runs on your hardware pltform.



来源:https://stackoverflow.com/questions/46506375/creating-graphics-for-euclidean-instances-of-tsp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!