1

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

sascha
  • 32,238
  • 6
  • 68
  • 110
Liam Fell
  • 1,308
  • 3
  • 21
  • 39
  • If those are xy coordinates, just pick any scientific graph-plotting tool (matplotlib @python being my favorite; but there is much more). – sascha Sep 30 '17 at 19:37

2 Answers2

2

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:

enter image description here

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

enter image description here

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

sascha
  • 32,238
  • 6
  • 68
  • 110
  • Thanks that's excellent. I have no first hand experience with plotting tools, that's a great introduction. – Liam Fell Sep 30 '17 at 21:27
  • There are many tools available. matplotlib is probably the most powerful (at least in the open-source world), although sometimes hard to learn. It's also python-based. – sascha Sep 30 '17 at 21:29
0

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.

Malcolm McLean
  • 6,258
  • 1
  • 17
  • 18
  • People usually add some disclaimer when promoting own software (i consider that good style). And to be fair: ```Usable but not really ready yet.``` sounds scary, together with no commit for a year. And what's the advantage compared to the alternatives, for example, gnuplot? – sascha Sep 30 '17 at 20:12
  • Baby X is for interactive graphics, gnuplot is a plotting tool whereby you put commands in and get a plot out. So with Baby X you develop the code and call it from a main function which also sets up the Baby X window and provides graphical callbacks. – Malcolm McLean Sep 30 '17 at 20:24