0

edit: added current solution

I am dabbling with the Travelling Salesman Problem and am using a solver to calculate the most optimal tour. The output of my linear solver gives me a table with arches in a route, however to plot the tour I require vector with all the locations chained in the right order. Is there an elegant way to chain these arches into a single tour?

One solution would be a series of (nested) joins/matches, however that is not an elegant solution in my opinion.

# output of solver (where i = 'from' and j = 'to')
solution = data.frame(i = c(6, 4, 10, 7, 1, 9, 3, 2, 8, 5),
                j = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

# transformation
??

# required output
tour = c(6, 1, 5, 10, 3, 7, 4, 2, 8, 9)

So the output I am looking for is a single chain of connected arches (from i to j) in the tour.

My current solution uses for loops and match and looks as follows:

# number of cities to visit
nCities = length(solution)

# empty matrix
tour = matrix(0, nCities, 2)

#first location to visit picked manually
tour[1, ] = solution[1, ]

# for loop to find index of next arch in tour
for(k in 2:nCities){
  ind = match(tour[k - 1, 2], solution[, 1])         
  tour[k, ] = solution[ind, ]
}
# output 'tour' is the solution but then sorted.

# I then take only the first column which is the tour
tour = tour[1, ]


However, it looks clunky and as I try to avoid for loops as much as possible I am not to happy with it. Also, my suspicion is that there are more elegant solutions out there, preferably using base R functions.

Mik3000
  • 1
  • 2

0 Answers0