Pranav Mahajan
Pranav Mahajan

Reputation: 2108

Travelling Salesman with multiple salesmen with a limit on number of cities per salesman?

Problem: I need to drop (n) employees from office to their homes(co-ordinates available). I have (x) 7-seater & (y) 4-seater cabs available.

  1. I have to design an algorithm to drop all the employees to their homes while travelling minimum distance.

  2. Also, the algorithm must tell me how many 7-seater or/and 4-seater vehicles I must choose so as to travel minimum distance.

eg. If I have 15 employees then the algorithm may tell me to use 1 (7-seater) cab & 2 (4-seater) cab & have the employees in each cab as following:

[(E2, E4, E6, E8), (E1, E3, E5, E7, E9, E10, E12), (E11, E13, E14, E15)]

Approach: I'm thinking of this as a Travelling Salesman Problem with multiple salesmen with an upper limit on number of cities each can travel. Also salesmen do not need to come back to the origin. Ant's colony problem came to my mind, but I can't really choose wisely which algorithm to choose

Requirement: I really need the ALGORITHM. Either TSP or Ant's colony, doesn't matter. I'll welcome opinions, but I really need the ALGORITHM.

Upvotes: 7

Views: 2254

Answers (4)

kpie
kpie

Reputation: 11080

From a list d destinations you can make the array of pairwise travel costs c. where c[a,b] is the travel cost from a to b...

Now you have a start point p. add to the array c2 values for p to each point in d.

So you now have the concept of groups.

You can look at this as a greedy algorithm. Given the list c2 you can take the cheapest option given your state.

Your state is the vector all you cab vectors (the costs of getting from where ever they are to where ever they could go next) .* the assignment vector where k == 0 for k in the. You find the minimum option given your state (considering adding another onerous to a cab of 4 costs the difference between the 4 person cab and the 7 person cab and adding a person to a zero person cab or adding a new cab also has a cost. Once all your people have been assigned to their cabs you have an answer.

The Idea of a greedy algorithm is most often characterized by the backpack problem but it can also be implemented for statistical methods such as feature selection.

Like @Aaron3468 this approach is not perfect and does not guarantee the best solution.

If you want the best possible solutions you can iterate through all the combinations but this becomes impractical quickly.

Upvotes: 0

radialmind
radialmind

Reputation: 277

It's a constraint satisfaction problem, not really a TSP. If you're looking for a project that may be able to help you, you could look into cspdb, which is what I wrote some time ago:

https://github.com/gtoonstra/cspdb

You'd be using a database in the backend that maintains the state and write a couple of scripts in it's own grammar that manipulates that state. A couple of examples are included to solve nqueens and classroom scheduling with multiple constraints.

Upvotes: 0

Aaron3468
Aaron3468

Reputation: 1794

This is a cost minimization problem, not a travelling salesman problem. It is related to TSP in the sense that TSP is a very specific cost minimization problem.

The solution consists of three steps:

  1. Generate a list of employee drop-off points (nodes)
  2. Create distinct paths that do not intersect, nor branch. These will be your routes and help prevent wasteful route overlaps. Use cost(path) = distance(furthest node and origin) + taxi_cost(nodes) + sum(distance between nodes) to compare paths and/or brute-force all potential networks. Networks are layouts of paths. DO NOT BRANCH THE PATHS!!

    • Total distance is a line of defense against waste ensuring that routes are not too long.
    • Sum of distances helps the algorithm converge on neighbourhoods where many employees live (when possible).
    • Because this variation of the coin problem allows imperfect solutions, it reduces to a variant of the Knapsack Problem. The utility of each taxi is capacity. If you also wish to choose the cheapest way to transport your employees, utility(taxi) = capacity/cost. From this our simplest solution is to be greedy; who cares about empty space? If you really care about filling up taxis perfectly (as opposed to cost efficiently), you'll need a much more complex solution. You only specify the least distance as your metric (with each additional taxi multiplying cost). I assume this is a proxy to say 'I don't want to pay too much'. Therefore: taxi_cost(nodes) = math.floor(amount(nodes)/max(utility(taxis)+1). This equation selects the cheapest, roomiest taxi, and figures out how many of them are required to fully service the route.
    • Be sure to calculate the cost of each network you examine as sum(cost(path))
  3. Once you've found the cheapest network to service, for each path in the chosen network:
    • make a list of employees travelling to the furthest node
    • fill the preferred taxi with those employees
    • repeat with the next furthest node until you have a full taxi, then add the filled taxi to the list. If you run out of employees, you've finished assigning taxis to the route. (The benefit of furthest-first selection is that you can ask employees in unfilled taxis to walk if that part of the route is within blocks of the office).

The algorithm above is not perfect, but it will have many desirable tendencies.

  • routes will be as short as possible and cover the greatest possible area (by not looping or branching)
  • routes will tend to service neighbourhoods, rather than trying to overlap responsibilities. This part of the algorithm isn't optimal, but is effective. This makes it really easy to remove service routes without needing to recalculate the transportation network.
  • the taxis chosen will be cost-efficient, helping to avoid paying more than necessary.
  • routes will use as few taxis as possible, taking into account the relative cost of upgrading to roomier ones with higher capacity
  • because the taxis travelling furthest will be full, it has less of an impact on your employee's ability to get to work if you decide to cancel service to emptier taxis.

Every step closer to perfection costs you many times more than the previous step, so diminished returns are acceptable if the solution provide desirable features. Although the algorithm makes some potentially sub-optimal tradeoffs, they come with huge value; your network of taxi routes becomes much easier to modify.

If you'd like to make an optimal solution, the Knapsack Problem, Coin Problem, and Change-making Problem help determine the cost of taxis and routes.

Spanning Trees are the most effective way to determine routes. Center the spanning tree at the office and calculate the cost of each branch as the maximum distance from the office. Try to keep each branch servicing areas with high density to make it easier to add and remove taxi routes.

Studying pathfinding can help you learn how to determine good cost functions so that you can numerically compare different potential paths. Remember that your network consists of a set of paths, but will require its own cost function so that you can compare different layouts.

I've written an in-depth guide to pathfinding for this answer. Pathfinding articles are few and just don't go into enough depth for a lot of problem spaces. A good cost function can get you a nearly perfect solution if you have multiple priorities. Unfortunately, good cost functions are domain specific so you will need to identify them yourself. Feel free to message me if you aren't sure how to make a path with certain traits and I'll help you figure out a good cost function.

Upvotes: 8

Kaem Jii
Kaem Jii

Reputation: 82

From my point of view your algorithm should solve 2 problems: the number of cars of each type and the shortest distance (how you number your employees depends on you or you should give more details). Sorry I'm a using a phone and I don't have have all features of the site.

For the number of cars you can use below algorithm. To solve issues related to distances, you should give more info about the paths and their lengths. A graph algorithm may then be combined with this to do the trick. Here 11=7+4.

Begin

Integer temp:= n/11
Integer rem:= n mod 11
If rem=0

    x:=temp
    y:=temp

Else if rem<=4

    x:=temp
    y:=temp+1

Else if rem<=7

    x:=temp+1
    y:=temp

Else

    x:=temp+1
    y:=temp+1

Endif

End

Upvotes: -2

Related Questions