Presentation is loading. Please wait.

Presentation is loading. Please wait.

Modeling Service When Transport is restricted to Load-Driven

Similar presentations


Presentation on theme: "Modeling Service When Transport is restricted to Load-Driven"— Presentation transcript:

1 Modeling Service When Transport is restricted to Load-Driven
Pool Points in Retail Distribution John Vande Vate Spring 2007 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) 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 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 Spring 02 Vande Vate 4

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

6 Pools Influence Trailer Fill Line Haul Delivery
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 Spring 02 Vande Vate 6

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

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

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 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 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 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]*(Demand[prd,s]/DaysPerYear)*Assign[s, pool] Reworded for clarity Spring 02 Vande Vate 12

13 = Cubic Capacity of the Trailer
Make It Linear Trailer Fill Time * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]*(Demand[prd,s]/DaysPerYear)*Assign[s, pool] = Cubic Capacity of the Trailer Trailer Fill Time * Assign What to do? Reworded for clarity 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? 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]*(Demand[prd,s]/DaysPerYear)*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 >= Cubic Capacity of the Trailer*Assign[store, pool]
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]*(Demand[prd,s]/DaysPerYear)*Assign[s, pool] >= Cubic Capacity of the Trailer*Assign[store, pool] Reworded for clarity 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 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 Pool is open… Ensure we get there in reasonable time (same time from there to all stores) May have to handle a few special stores separately Spring 02 Vande Vate 17

18 >= Cubic Capacity of the Trailer*Assign[store, 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]*(Demand[prd,s]/DayPerYear)*Assign[s, pool] >= Cubic Capacity of the Trailer*Assign[store, pool] Moved var Open{POOLS} binary; Reworded for clarity 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) Spring 02 Vande Vate 18

19 >= Cubic Capacity of the Trailer*Assign[store, pool]
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]*(Demand[prd,s]/DaysPerYear)*Assign[s, pool] >= Cubic Capacity of the Trailer*Assign[store, pool] Moved var Open{POOLS} binary; Reworded for clarity 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) Spring 02 Vande Vate 19

20 >= Cubic Capacity of the Trailer*Open[pool]
More than One DC Service Constraint for each pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]*(Demand[prd,s]/DaysPerYear)*Assign[s, pool] >= Cubic Capacity of the Trailer*Open[pool] What’s wrong with this? Reworded for clarity 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. 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] 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]*(Ship[prd, dc, pool]/DaysPerYear) >= Cubic Capacity of the Trailer*Open[pool] Corrected Reworded for clarity Spring 02 Vande Vate 23

24 The Problem Does the DC serve the Pool?
Service Constraint for each dc and pool: Max Time to Fill Trailer * sum{prd in PRODUCTS, s in STORES} CubicFt[prd]*Ship[prd, dc, pool]/DaysPerYear >= 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. Corrected Reworded for clarity 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]*Ship[prd, dc, pool] /DaysPerYear >= 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] Corrected Reworded for clarity 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]*Ship[prd, dc, pool]/DaysPerYear >= 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] Corrected Reworded for clarity 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]*Ship[prd, dc, pool]/DaysPerYear >= Cubic Capacity of the Trailer*UseEdge[dc, pool] Weight Service Constraint for each dc and pool: Weight[prd]*Ship[prd, dc, pool]/DaysPerYear >= Weight Limit of the Trailer*UseEdge[dc, pool] Corrected Reworded for clarity Corrected Reworded for clarity 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]*Ship[prd, dc, pool]/DaysPerYear >= Cubic Capacity of the Trailer*UseEdge[dc, pool] Weight Service Constraint for each dc and pool: Weight[prd]*Ship[prd, dc, pool]/DaysPerYear >= Weight Limit of the Trailer*UseEdge[dc, pool] Corrected Reworded for clarity Corrected Reworded for clarity Spring 02 Vande Vate 28

29 Weight AND Cube Trailer departs when Don’t have to fill BOTH
Weight Limit is reached OR Cubic Capacity is reached Don’t have to fill BOTH 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) 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]) 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]*Ship[prd, dc, pool]/DaysPerYear >= Cubic Capacity of the Trailer*(UseEdge[dc, pool]+ CubeOut[dc,pool]-1) Weight Service Constraint for each dc and pool: Weight[prd]*Ship[prd, dc, pool]/DaysPerYear >= Weight Limit of the Trailer*(UseEdge[dc, pool]- CubeOut[dc,pool])

33 Added Detail The rest of the model
var Assign{STORES, POOLS} binary; Meet Demand at each pool for each prd: Sum{dc in DCS}Ship[prd, dc, pool] >= Sum{s in STORES} Demand[prd,s]*Assign[s, 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] Spring 02 Vande Vate 33

34 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])

35 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 Spring 02 Vande Vate 35

36 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? Spring 02 Vande Vate 36

37 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)

38 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 Spring 02 Vande Vate 38

39 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: 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]

40 Added Detail The rest of the model
var Assign{STORES, POOLS} binary; Meet Demand at each pool for each prd: Sum{dc in DCS}Ship[prd, dc, pool] >= Sum{s in STORES} Demand[prd,s]*Assign[s, 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] Spring 02 Vande Vate 40


Download ppt "Modeling Service When Transport is restricted to Load-Driven"

Similar presentations


Ads by Google