Solving the Vehicle Routing Problem with Multiple Multi-Capacity Vehicles Michael Sanders
Overall Goals Create a program that given: List of delivery points Number and capacity of vehicles List of roads Return a list of routes that most efficiently utilize vehicles Efficiency undefined, but probably will be product delivered over distance traveled
Current Goals Continue to develop route creator Current assigns all customers to routes Need to randomize assignment of customers to route Need to create catch in case route finder is unsuccessful/takes too long to find route between previous and current customer
Scope Heuristics In both aspects of program A* search Based on program’s estimate of distance to target Route creator Will most likely look to minimize distance traveled
Previous Research Vehicle Routing Problem (VRP) Extensively researched Solutions Agent architecture Used agents to represent vehicles and “auctioneer” that assigned customers to routes Ant colony optimization Could solve variants of VRP
Variants of VRP Variants VRP with Time Windows (VRPTW) Requires deliveries to be in specific time ranges for each delivery Multi-Depot VRP (MDVRP) Multiple origins for vehicles
Components Route finder Given two intersections, find shortest- distance route between the two Not necessarily fastest route Would need speed limit data Delivery route creator Using list of delivery points and quantity to be delivered, utilizes other component to most efficiently deliver the product
Route Finder Program responsible finding quickest route Uses US Census road data Uses A* search with a geographic heuristic Program moves from intersection to intersection as identified by lat/long Afterwards, determines route taken by list of lat/long coordinates passed through
Demonstration of Route Finder 2 Search_A_clean.rb
Route Creator In beginning stages Goes through list of customers Assigns everyone to routes based on vehicle capacities Two classes Route Solution
tempCust=$deliveries.clone $routes=Array.new $routes << Route.new($vehicles[0]) routeCounter=0 vehicleCounter=1 while not tempCust==[] starter=true while starter currentCust=tempCust.delete_at(rand*tempCust.length-1) starter=$routes[routeCounter].add_cust(currentCust) end routeCounter+=1 $routes << Route.new($vehicles[vehicleCounter]) vehicleCounter+=1 end
Timeline Route finder is done (except for when it doesn’t work) Now writing route creator Plan to use genetic algorithm to solve problem Route class will be the “genes” of the Solution object
Testing Easiest testing was to run route finder against personal knowledge Program fails at longer distances Goes for straightest path
Other Information Language Ruby Problems Data not completely standardized
Main Points Optimum answer not necessarily goal Finding optimum is too time-intensive Drivers have personal knowledge of routes and can adapt as necessary