1 / 38

Modeling Service

Modeling Service. When Transport is restricted to Load-Driven Pool Points in Retail Distribution John Vande Vate Spring 2007. Retail Inventory. Single “Product”, many SKUs Style Color Size Broad Offering attracts customers Depth in SKU avoids missed sales

bethan
Télécharger la présentation

Modeling Service

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Modeling Service When Transport is restricted to Load-Driven Pool Points in Retail Distribution John Vande Vate Spring 2007 15.057 Spring 02 Vande Vate 1

  2. Retail Inventory • Single “Product”, many SKUs • Style • Color • Size • Broad Offering attracts customers • Depth in SKU avoids missed sales • Stock enough in each SKU to cover replenishment time (OTD) 15.057 Spring 02 Vande Vate 2

  3. Service Requirement • Keep OTD short • Reduce depth without losing sales • Increase breadth to attract more customers and expand market • OTD requirements differ by store • Manhattan, NY • Manhattan, KS 15.057 Spring 02 Vande Vate 3

  4. What’s in OTD • POS system records sale • Transmitted to DC • Orders batched for efficient picking • Order picked • Trailer filled (Load driven) • Line Haul to Pool Point • Delivery 15.057 Spring 02 Vande Vate 4

  5. Pool Points Asian Port Asian Factory Store US Port US DC Pool 15.057 Spring 02 Vande Vate 5

  6. Pools Influence • Trailer Fill • The greater the volume to the pool the faster the trailer fills • Line Haul • Is determined by the distance from the DC to the Pool • Delivery • Messier 15.057 Spring 02 Vande Vate 6

  7. The Trade-offs • Too Few Pools • High Delivery Costs • More moving inventory • Less waiting inventory • Too Many Pools • Low Delivery Costs • Less moving inventory • More waiting inventory 15.057 Spring 02 Vande Vate 7

  8. Constant cost & time Cost & Time depend on Pool Assignment OTD Dissected • POS system records sale • Transmitted to DC • Orders batched for efficient picking • Order picked • Trailer filled (Load driven) • Line Haul • Delivery

  9. Line Haul • Time & Cost Depend on • The Pool Assignment • Which DC’s serve the Pool • NY DC to Chicago Pool • LA DC to Chicago Pool 15.057 Spring 02 Vande Vate 9

  10. Trailer Fill • Time Depends on • The Pool Assignments • Which pool this store is assigned to • What other stores are assigned to this pool • Rate at which the Pool draws goods • How the Pool is served • The Rate at which the Pool draws goods from each DC 15.057 Spring 02 Vande Vate 10

  11. Drilling Down on Service • Simple Model • Cube only (trailers never reach weight limit) • One DC only (don’t split volumes to Pool) • Many DC’s • Cube only • Weight & Cube and Many DC’s • Soft Constraints: • Infeasible is not an acceptable answer 15.057 Spring 02 Vande Vate 11

  12. Toward a Simple Model Trailer Fill Time (for store) * Rate Trailer Fills = Cubic Capacity of the Trailer • Rate Trailer Fills • Translate annual demand at stores assigned to the pool into cubic feet per day • Rate to pool is: sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Demand[prd,s]*Assign[s, pool] 15.057 Spring 02 Vande Vate 12

  13. Make It Linear Trailer Fill Time * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Demand[prd,s]*Assign[s, pool] = Cubic Capacity of the Trailer • Trailer Fill Time * Assign • What to do? 15.057 Spring 02 Vande Vate 13

  14. Can’t Know Trailer Fill Time Trailer Fill Time* Rate Trailer Fills = Cubic Capacity of the Trailer Max Time to Fill Trailer * Rate Trailer Fills ? Cubic Capacity of the Trailer  Why  Cubic Capacity of the Trailer? What does this accomplish? 15.057 Spring 02 Vande Vate 14

  15. What’s Wrong? Max Time to Fill Trailer to store * Rate Trailer Fills  Cubic Capacity of the Trailer Max Time to Fill Trailer* (sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Demand[prd,s]*Assign[s, pool])  Cubic Capacity of the Trailer • What if the Store is not assigned to the Pool?! Max Time to Fill Trailer * Rate Trailer Fills  Cubic Capacity of the Trailer*Assign[store,pool]

  16. Our Simple Model var Assign{STORES, POOLS} binary; Service Constraint for each store and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Demand[prd,s]*Assign[s, pool] >= Cubic Capacity of the Trailer*Assign[store, pool] Max Time to Fill Trailer depends on the Store and the Pool: Store Service Requirement, e.g., 3 days Constant Order time, e.g., order processing, picking, etc. Line haul time from DC to Pool Delivery time from Pool to Store 15.057 Spring 02 Vande Vate 16

  17. Getting Practical • There are scores of Pools and THOUSANDS of Stores • That means hundreds of thousands of service constraints! • Can we just impose them at the Pools? • If the Pools open… • Ensure we get there in reasonable time (same time from there to all stores) • May have to handle a few special stores separately 15.057 Spring 02 Vande Vate 17

  18. Assign[store, pool] Open[pool] Max Time to Fill Trailer depends on the Store and the Pool: Store Service Requirement, e.g., 3 days Constant Order time, e.g., order processing, picking, etc. Line haul time from DC to Pool Delivery time from Pool to Store (depends on pool) A Simpler Model var Assign{STORES, POOLS} binary; Service Constraint for each pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Demand[prd,s]*Assign[s, pool] >= Cubic Capacity of the Trailer*Assign[store, pool] var Open{POOLS} binary; 15.057 Spring 02 Vande Vate 18

  19. One DC Cube Only Model var Assign{STORES, POOLS} binary; Service Constraint for each pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Demand[prd,s]*Assign[s, pool] >= Cubic Capacity of the Trailer*Assign[store, pool] var Open{POOLS} binary; Max Time to Fill Trailer depends on the Pool: Store Service Requirement, e.g., 3 days Constant Order time, e.g., order processing, picking, etc. Line haul time from DC to Pool Delivery time from Pool to Store (depends on pool) 15.057 Spring 02 Vande Vate 19

  20. More than One DC Service Constraint for each pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Demand[prd,s]*Assign[s, pool] >= Cubic Capacity of the Trailer*Open[pool] • What’s wrong with this? 15.057 Spring 02 Vande Vate 20

  21. The Problem • If the pool is served by several DC’s, trailers fill more slowly • The “rate” from each DC is less than the total rate of demand at the pool. 15.057 Spring 02 Vande Vate 21

  22. How to Get the Rates • How fast does the trailer for pool fill at dc? • Not the rate of demand at the pool • The rate of shipments from the dc to the pool • Translate shipments Ship[*, dc, pool] 15.057 Spring 02 Vande Vate 22

  23. What’s Wrong Now Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Ship[prd, dc, pool] >= Cubic Capacity of the Trailer*Open[pool] 15.057 Spring 02 Vande Vate 23

  24. The Problem Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Ship[prd, dc, pool] >= Cubic Capacity of the Trailer*Open[pool] • Does the DC serve the Pool? • These constraints insist the service is good from EVERY dc to EVERY open pool. 15.057 Spring 02 Vande Vate 24

  25. Fixing the Problem var UseEdge{DCS, POOLS} binary; Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Ship[prd, dc, pool] >= Cubic Capacity of the Trailer*UseEdge[dc, pool] Define UseEdge for each prd, dc and pool: Ship[prd, dc, pool] <= sum{s in STORES (that can be assigned to the pool)} Demand[prd,s]* UseEdge[dc, pool] 15.057 Spring 02 Vande Vate 25

  26. Several DCs Cube Only var UseEdge{DCS, POOLS} binary; Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Ship[prd, dc, pool] >= Cubic Capacity of the Trailer*UseEdge[dc, pool] Define UseEdge for each prd, dc and pool: Ship[prd, dc, pool] <= sum{s in STORES (that can be assigned to the pool)} Demand[prd,s]* UseEdge[dc, pool] 15.057 Spring 02 Vande Vate 26

  27. Weight & Cube var UseEdge{DCS, POOLS} binary; Cube Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Ship[prd, dc, pool] >= Cubic Capacity of the Trailer*UseEdge[dc, pool] Weight Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} Weight[prd]/DaysPerYear*Ship[prd, dc, pool] >= Weight Limit of the Trailer*UseEdge[dc, pool] 15.057 Spring 02 Vande Vate 27

  28. What’s Wrong Now? var UseEdge{DCS, POOLS} binary; Cube Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Ship[prd, dc, pool] >= Cubic Capacity of the Trailer*UseEdge[dc, pool] Weight Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} Weight[prd]/DaysPerYear*Ship[prd, dc, pool] >= Weight Limit of the Trailer*UseEdge[dc, pool] 15.057 Spring 02 Vande Vate 28

  29. Weight AND Cube • Trailer departs when • Weight Limit is reached OR • Cubic Capacity is reached • Don’t have to fill BOTH 15.057 Spring 02 Vande Vate 29

  30. How to Fix It? • The Cubic Capacity Constraint Applies If • We use the edge from the dc to the pool: UseEdge[dc, pool] = 1 AND • We Cube Out that trailer first: New Variable CubeOut[dc,pool] = 1 • How to capture this? • (UseEdge[dc,pool] + CubeOut[dc,pool] -1) 15.057 Spring 02 Vande Vate 30

  31. How to Fix It? • The Weight Limit Constraint Applies If • We use the edge from the dc to the pool: UseEdge[dc, pool] = 1 AND • We DO NOT Cube Out that trailer first: CubeOut[dc,pool] = 0 • How to capture this? • (UseEdge[dc,pool] - CubeOut[dc,pool]) 15.057 Spring 02 Vande Vate 31

  32. A Full Model var UseEdge{DCS, POOLS} binary; var CubeOut{DCS, POOLS} binary; Cube Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Ship[prd, dc, pool] >= Cubic Capacity of the Trailer*(UseEdge[dc, pool]+ CubeOut[dc,pool]-1) Weight Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} Weight[prd]/DaysPerYear*Ship[prd, dc, pool] >= Weight Limit of the Trailer*(UseEdge[dc, pool]- CubeOut[dc,pool])

  33. Cube or Weight • How do we know which constraint should apply? ….. >= Cubic Capacity of the Trailer*(UseEdge[dc, pool]+ CubeOut[dc,pool]-1) or …. >= Weight Limit of the Trailer*(UseEdge[dc, pool]- CubeOut[dc,pool])

  34. What if it’s not feasible • Infeasible is not a very helpful answer • Want an answer that is “as close as possible” • Sequential Optimization: • Minimize Service Failures • Minimize Cost subject to Best Achievable Service 15.057 Spring 02 Vande Vate 34

  35. Service Failures • Can’t express them in terms of time • Express them in terms of Capacity • How much of the trailer is left unfilled at the end of the available time? 15.057 Spring 02 Vande Vate 35

  36. Unfilled Capacity • Max Time to Fill Trailer * Rate Trailer Fills  Cubic Capacity of the Trailer*Binary Switch • Scale this: Max Time to Fill Trailer * Rate Trailer Fills Cubic Capacity of Trailer  Binary Switch (0 or 1) - Service Failure (fraction of trailer unfilled)

  37. Sequential Optimization • First Objective: • Minimize the sum of the Service Failures • Could weight Service Failures • Second Objective: • Minimize Cost • s.t. Service Failures <= Best Possible 15.057 Spring 02 Vande Vate 37

  38. The Whole Story var UseEdge{DCS, POOLS} binary; var CubeOut{DCS, POOLS} binary; var ServFail{POOLS} >= 0; Cube Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]/DaysPerYear*Ship[prd, dc, pool] >= Cubic Capacity of the Trailer*(UseEdge[dc, pool]+ CubeOut[dc,pool]-1) - Cubic Capacity of the Trailer*ServFail[pool]; Weight Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} Weight[prd]/DaysPerYear*Ship[prd, dc, pool] >= Weight Limit of the Trailer*(UseEdge[dc, pool]- CubeOut[dc,pool]) - Weight Limit of the Trailer*ServFail[pool]

More Related