Download presentation

Presentation is loading. Please wait.

Published byAxel Gradin Modified about 1 year ago

1
Click to edit Master subtitle style 31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Rich Vehicle Routing Problems - some examples Arne Løkketangen Molde University College, Specialized University in Logistics

2
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Outline This presentation will look at some recent rich (real-world based) vehicle routing problems that the author has worked on. These are all based on the standard CVRP, but with the addition of some (real-world) constraints, making classical solution methods unsuitable BCPO - Bento Gonçalves - 30/8 - 3/9 2010

3
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ The World 42 BCPO - Bento Gonçalves - 30/8 - 3/

4
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Europe 42 BCPO - Bento Gonçalves - 30/8 - 3/

5
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Norway - and Molde 42 BCPO - Bento Gonçalves - 30/8 - 3/

6
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Our Examples All the examples are based on real-world problems, and are generally solved using real- world data. The solution methods are mostly based on tabu search, but usually with some extra refinements. We also would like to emphasize that the additional effort needed to solve these types of problems is readily compensated by the resulting quality and usefulness of the generated solutions BCPO - Bento Gonçalves - 30/8 - 3/9 2010

7
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Our Examples Our set of examples contains – The livestock collection problem sequence dependent loading capacity routing with inventory constraints – Routing with ferries Examples from the Molde area (in Norway) – A pickup application in Trondheim, Norway a stochastic routing problem where some historic data are available to be used as predictors, with dynamic routing requests 7742 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

8
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Basis: The Vehicle Routing Problem Allocation of transportation tasks to a fleet of vehicles, and the simultaneous routing for each vehicle Design a least cost set of routes, all starting and ending at a depot, where each customer is visited exactly once The demand of all customers on a route must not exceed the vehicle capacity Identical vehicles in the classical formulation, no constraints on route length or duration The basic version of the VRP is NP-hard 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

9
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ The Livestock Collection Problem Construct the best possible set of routes to collect live animals from farmers to one or more slaughterhouses Each route must be feasible according to constraints on duration, vehicle capacity, mix of animal types, and visiting order of the farms The whole solution as a set of routes must adapt to the production plan and the lairage capacity at the slaughterhouse Rich VRP extended with inventory constraints Work together with Johan Oppen, also at Molde 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

10
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Route duration constraints Animals cannot stay on the vehicle for more than eight hours – Hard constraint – Time must be measured from the time of the first loading of animals until the animals are unloaded at the slaughterhouse For some animal categories, it is beneficial to keep the time on the vehicle as low as possible – Soft constraint to support animal welfare and thereby meat quality The drivers are not affected by regulations for driving period and rest period 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

11
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Vehicle fleet constraints The vehicle fleet is heterogeneous The vehicles are divided into sections (usually three), each with one or more layers The configuration of most vehicles can be changed by raising and lowering the floors in the sections Differences in size (maneuverability), capacity and the possibility to use trailers – It is not allowed to leave a trailer loaded with animals behind and collect it later Each vehicle may be used for multiple tours each day – The first tour starts from the driver’s home 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

12
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Vehicles 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

13
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Vehicles 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

14
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Vehicles 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

15
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Animal types and categories Three types – Bovine (cows, etc) – Pigs – Ovine (sheep, goats, etc) Each type divided into categories by – Gender – Size – Horns – Sheared or not 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

16
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Animal mixing rules Animals of different types cannot be mixed Grown-ups of different gender cannot be mixed Animals with and without horns cannot be mixed Pigs from different herds cannot be mixed Bovine should not be loaded onto a vehicle with pigs (they may resist because they don’t like the smell of pigs) Calves should go together with at least one buddy they already know – This is not really a mixing rule, but rather a rule to make the farmer deliver more than one calf at a time 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

17
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Animal space requirements Each animal requires a certain amount of floor space on the vehicle Differs from 0.25 to 1.4 m² per animal, depending on category – Depends on weight, but also on whether sheep are sheared or not – Sheep that are registered as sheared may turn out not to be sheared, e.g. because of bad weather, and will thus need more space – Weight is estimated for each category 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

18
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Farm visiting order Some farms are breeding farms, these must be visited by an empty and clean vehicle. – Only one per tour, must be the first stop Some herds are infected with some disease. To avoid infection to other herds, the vehicle must be emptied and cleaned before visiting other farms – Only one per tour, must be the last stop 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

19
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Sequence Dependent Vehicle capacity 3 bulls 30 pigs 2 bulls The vehicle can take pigs in 2 tiers, or pigs on top of bulls. A tour with minimal distance is not always the best. 15 pigs 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

20
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Sequence Dependent Vehicle capacity 3 bulls 30 pigs 2 bulls The vehicle can take pigs in 2 tiers, or pigs on top of bulls. A longer tour may give more capacity. 15 pigs 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

21
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Inventory and production A weekly production plan is constructed, based on – Animals registered for slaughter by the farmers (supply) – Demand from customers (meat processing, whole sale) – Customers are both internal and external Animals are lairaged at the abattoir before slaughter Maximum one overnight – The lairage is emptied on Friday – Some collection is done on Sunday to be able to start the production on Monday morning The lairage has a certain capacity for each animal type that cannot be exceeded Stopping the production is very expensive, so the lairage cannot be allowed to run empty 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

22
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Inventory and Production Inventory constraints are put on the solution as a whole, rather than on the single routes This kind of constraints are usually not present in a “normal” VRP – Makes the problem harder to solve, as we need to couple continuous time in the routes with discrete time periods in inventory and production – The number of variables in a mathematical model grows heavily 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

23
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Our Solution Attempts The following methods have been tried to solve this problem – Standard Mathematical Program using B&B This could handle at most 7 visits in a very simplified model. – Column Generation This could handle up to 25 visits in a simple model – Tabu Search Tackles the full problem 1 hour solution time No quality guarantee (but 15% better than human planner) Designed to search in infeasible space We ended up with a tabu search based implementation – Our ideas are being implemented these days in a commercial VRP solver (Transvision in DK) for the slaughterhouse company BCPO - Bento Gonçalves - 30/8 - 3/9 2010

24
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Ferries and time dependent travel times In a VRP, usually the travel times are regarded as fixed between each O-D (Origin- Destination) pair while solving the problem Most travellers experience that the travel time may differ, depending on when you leave the origin. The most common reasons are – Rush hour congestion – The presence of ferries Based on a Master thesis by Erstad and Kroknes at Molde University College BCPO - Bento Gonçalves - 30/8 - 3/9 2010

25
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Ferries We will consider the case with ferries Used a lot in Norway – on the west coast and in the north We look at the area around Molde Well published timetables Fairly precise departure times There might be capacity problems (in the rush hour) – Not considered here BCPO - Bento Gonçalves - 30/8 - 3/9 2010

26
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Route june BCPO - Bento Gonçalves - 30/8 - 3/9 2010

27
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Geiranger-fiord – Not many roads 42 BCPO - Bento Gonçalves - 30/8 - 3/

28
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Simplifications No alternative routes Obvious for islands The ferries are there for a reason – It takes too long to drive around the fiord – Often very bad roads – The distribution is day-time only, when the ferries are running This means that there is only one possible route (i.e. shortest path) kept per O-D pair BCPO - Bento Gonçalves - 30/8 - 3/9 2010

29
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Test Cases No test instances in the literature Ours are generated based on real world data from two local (Molde) companies – Nortura – Transportation of animals to slaughterhouses – Sylte Mineralvann – Distribution of soft drinks Actual road map used Actual ferry tables Real customers The capacity/demand is generated – High tightness ratio BCPO - Bento Gonçalves - 30/8 - 3/9 2010

30
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Ferry Density The density is defined as the proportion of O-D pairs that contains a ferry (or more) Note that with one ferry, and half the customers on each side, the density is ½ In our region, a density of 0.7 seems to be expected for larger cases BCPO - Bento Gonçalves - 30/8 - 3/9 2010

31
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Our Methods We made two solvers – One for CVRP – One for TDVRP These are very similar, except the extra mechanisms needed for ferries The solvers are based on the Unified Tabu Search by Laporte et al., also implemented by Oppen et al. (in the Livestock Transportation Problem) BCPO - Bento Gonçalves - 30/8 - 3/9 2010

32
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Calculation of Travel Times Important issues are – Memory usage – Precalculation time – Table loading time – Runtime calculation time Very sensitive to time granularity (or resolution) We have tried two variants – Precalculate all – Precalculate only per ferry departure BCPO - Bento Gonçalves - 30/8 - 3/9 2010

33
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ BCPO - Bento Gonçalves - 30/8 - 3/9 2010

34
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Actual use in the solver Normal O-D travel times (without ferries) as before – 2-dimensional lookup table O-D’s with ferries – Have indicator for this in the lookup table. Locate the relevant O-D table. Calculate actual travel time based on table entries (based on ferry departure times) BCPO - Bento Gonçalves - 30/8 - 3/9 2010

35
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Example: One tour from the instance OS-58 Ferry A is only once per day, and only by request 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

36
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Planned Results 3636 CVRPCVRP in TDVRP TDVRP Time WaitingTimeWaitingTours OS OS OS OS Nortura Nortura BCPO - Bento Gonçalves - 30/8 - 3/9 2010

37
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Approximations – using sailing times 3737 Approximation using sailing time – Implemented results CVRPApproximationTDVRP TimeWaitingTimeWaitingTimeWaiting OS OS OS OS Nortura Nortura BCPO - Bento Gonçalves - 30/8 - 3/9 2010

38
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Approximations – using frequencies 3838 CVRPApproximationTDVRP TimeWaitingTimeWaitingTimeWaiting OS OS OS OS Nortura Nortura BCPO - Bento Gonçalves - 30/8 - 3/9 2010

39
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Extra resources needed for ferries Partial Preprosessing – 300 seconds for the largest instance – Negligible load time Run-time – Approximately 25% extra computational time BCPO - Bento Gonçalves - 30/8 - 3/9 2010

40
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Conclusions - Ferries Not taking ferries into account can lead to excessive waiting, especially when they are present. Realistically. An extra computational effort of 25% must be expected The approach can be extended to also include TDVRP for rush-hour BCPO - Bento Gonçalves - 30/8 - 3/9 2010

41
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Deterministic vs Stochastic, Static vs Dynamic One should be careful when classifying problems as stochastic or dynamic, it can either, both or none of them Possibilities thus are – Static and Deterministic Normal deterministic mathematical program – Static and Stochastic Normal stochastic program – Dynamic and Deterministic Normal dynamic program – Dynamic and Stochastic Dynamic and stochastic program – The real world is here 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

42
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Dynamic vs. Static Vehicle Routing Problems A vehicle routing problem is static if the inputs to the problem do not change, neither during execution of the algorithm that solves it, nor during the execution of the solution. A problem is considered dynamic when inputs to the problem become known to the decision maker or are updated concurrently with the determination of the solution (i.e., the set of routes). – Psaraftis, H.N. (1988). ”Dynamic Vehicle Routing Problems”. In: Vehicle Routing: Methods and Studies, Elsevier, North-Holland, Eds.: B. L. Golden and A. A. Assad, pp – Psaraftis, H.N. (1995). ”Dynamic Vehicle Routing: Status and Prospects”. Annals of Operations Research 61, pp BCPO - Bento Gonçalves - 30/8 - 3/9 2010

43
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Last Example Solving a Dynamic and Stochastic Vehicle Routing Problem with a Sample Scenario Hedging Heuristic Joint work with – Lars M. Hvattum, NTNU, Trondheim – Gilbert Laporte, HEC Montréal BCPO - Bento Gonçalves - 30/8 - 3/9 2010

44
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Problem Description - dynamic The problem is a Vehicle Routing Problem in which customers may appear at unknown locations with random demand at any time Our work is motivated by a real-world case – Linjegods AS, Norway Services both pick-up and delivery customers, but on separate vehicles We focus here on pick-up only – At the beginning of a day, about half of the pickup orders are known – The rest is called in during the day – Must be able to modify the plans during the day to incorporate new customers The problem is dynamic 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

45
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Problem Description - stochastic How to make new plans when additional information has become known? – Use a myopic dynamic approach, where only information that is known with certainty is used – Somehow exploit historical data? The distribution company has access to historical data on customer locations, call-in times, demands, time windows, etc. In order to predict customer call-ins, one can use approximated probability distributions for the unknown elements The problem is stochastic 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

46
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Problem Description – historical data Geographical spread of customers for one of the depots of Linjegods AS Profile of call-in times of customers 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

47
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Problem Description – time discretization Choose to divide the time horizon into a number of time intervals (stages) – The customers can call in orders at any time – Re-planning is performed at the start of a time interval At the start of each time interval a plan is made for how to service the known customers over the remaining time intervals The goal is to minimize (hierarchical) – customers not serviced – number of vehicles used – travel length 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

48
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Solution Approach Must generate a plan for the remaining day at the start of each time interval Examine two different methods – Myopic Dynamic Heuristic Consider only known information when planning – Dynamic Stochastic Hedging Heuristic Take stochastic information into consideration 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

49
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ The Myopic Dynamic Heuristic 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

50
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Dynamic Stochastic Hedging Heuristic How to include stochastic information when making plans at the start of each time interval? Uses sample scenarios (i.e. possible future realizations) Inspired by Progressive Hedging – Solve sample scenarios – Find common features in solutions – Implement features in plan for the remaining day 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

51
Clique para editar o formato do texto da estrutura de tópicos 2º Nível da estrutura de tópicos 3º Nível da estrutura de tópicos 4º Nível da estrutura de tópicos 5º Nível da estrutura de tópicos 6º Nível da estrutura de tópicos 7º Nível da estrutura de tópicos 8º Nível da estrutura de tópicos 9º Nível da estrutura de tópicosClick to edit Master text styles – Second level Third level – Fourth level » Fifth level 31/08/10 42 BCPO - Bento Gonçalves - 30/8 - 3/ DSHH The outer loop of the heuristic corresponds to the dynamic aspect of the problem The subprocedure corresponds to the stochastic part 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

52
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ DSHH – the subprocedure 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

53
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ DSHH – the subprocedure Stopping criterion – stop selecting customers for service within the next time interval if not present in more than a given percentage (typically 50%) of the sample scenario solutions Solving the sample scenarios – Use a simple insertion heuristic Start with empty routes Insert customers sequentially in the cheapest way Note that the DSHH only produces routes only for the next time period (not the entire remaining day) 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

54
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Computational Testing Present results for 20 test instances, generated from distributions approximated from historical data The expected number of customers in each instance is 133 Produce solutions using the MDH, the DSHH, as well as wait-and-see solutions The total computational time for the MDH and the DSHH is about six minutes per instance – solved with an interval size of 1 hour The DSHH was set to use 30 sample scenarios 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

55
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Overall test results 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

56
Clique para editar o formato do texto da estrutura de tópicos 2º Nível da estrutura de tópicos 3º Nível da estrutura de tópicos 4º Nível da estrutura de tópicos 5º Nível da estrutura de tópicos 6º Nível da estrutura de tópicos 7º Nível da estrutura de tópicos 8º Nível da estrutura de tópicos 9º Nível da estrutura de tópicosClick to edit Master text styles – Second level Third level – Fourth level » Fifth level 31/08/10 42 BCPO - Bento Gonçalves - 30/8 - 3/ A small example (1) To illustrate the differences between the MDH and the DSHH – An instance with reduced number of customers and reduced vehicle capacity 29 customers – (expected 30) Wait-and-see solution – 2 vehicles – travel length 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

57
Clique para editar o formato do texto da estrutura de tópicos 2º Nível da estrutura de tópicos 3º Nível da estrutura de tópicos 4º Nível da estrutura de tópicos 5º Nível da estrutura de tópicos 6º Nível da estrutura de tópicos 7º Nível da estrutura de tópicos 8º Nível da estrutura de tópicos 9º Nível da estrutura de tópicosClick to edit Master text styles – Second level Third level – Fourth level » Fifth level 31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ A small example (2) Solution after two intervals MDHDSHH 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

58
Clique para editar o formato do texto da estrutura de tópicos 2º Nível da estrutura de tópicos 3º Nível da estrutura de tópicos 4º Nível da estrutura de tópicos 5º Nível da estrutura de tópicos 6º Nível da estrutura de tópicos 7º Nível da estrutura de tópicos 8º Nível da estrutura de tópicos 9º Nível da estrutura de tópicosClick to edit Master text styles – Second level Third level – Fourth level » Fifth level 31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Solution after three intervals MDHDSHH A small example (3) 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

59
Clique para editar o formato do texto da estrutura de tópicos 2º Nível da estrutura de tópicos 3º Nível da estrutura de tópicos 4º Nível da estrutura de tópicos 5º Nível da estrutura de tópicos 6º Nível da estrutura de tópicos 7º Nível da estrutura de tópicos 8º Nível da estrutura de tópicos 9º Nível da estrutura de tópicosClick to edit Master text styles – Second level Third level – Fourth level » Fifth level 31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Final solution MDHDSHH A small example (4) 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

60
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ A small example (5) MDH (Myopic Dynamic Heuristic) – 2 vehicles – Total length – CPU time: 330 seconds DSHH (Dynamic Stochastic Hedging Heuristic) – 2 vehicles – Total length – CPU time: 12 seconds (with 60 sample scenarios) 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

61
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Conclusions We have considered a VRP where customers may appear at unknown locations with random demand at any time The problem have properties associated with both DVRPs and SVRPs A heuristic solution method based on sampling and ideas from progressive hedging shows interesting results Results indicate that incorporating stochastic information in dynamic solution methods can help improving solution quality 42 BCPO - Bento Gonçalves - 30/8 - 3/9 2010

62
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/ Final Conclusions It is important to solve the real problem – More important than proving optimality on the wrong problem Other aspects – Stochastic Data – Dynamic Data – Multiple Objectives – Robustness (many definitions) – Re-planning – …… Optimality is very difficult to define with these extra aspects present 42 BCPO - Bento Gonçalves - 30/8 - 3/

63
31/08/1042 BCPO - Bento Gonçalves - 30/8 - 3/

Similar presentations

© 2017 SlidePlayer.com Inc.

All rights reserved.

Ads by Google