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

Modeling Service

  • Upload
    bethan

  • View
    30

  • Download
    0

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Page 1: Modeling Service

15.057 Spring 02 Vande Vate 11

Modeling Service

When Transport is restricted to Load-DrivenPool Points in Retail Distribution

John Vande VateSpring 2007

Page 2: Modeling Service

15.057 Spring 02 Vande Vate 22

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)

Page 3: Modeling Service

15.057 Spring 02 Vande Vate 33

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

Page 4: Modeling Service

15.057 Spring 02 Vande Vate 44

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

Page 5: Modeling Service

15.057 Spring 02 Vande Vate 55

Pool PointsAsian Port

US Port

Pool

Store

Asian Factory

US DC

Page 6: Modeling Service

15.057 Spring 02 Vande Vate 66

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

Page 7: Modeling Service

15.057 Spring 02 Vande Vate 77

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

Page 8: Modeling Service

OTD Dissected

• POS system records sale• Transmitted to DC • Orders batched for efficient picking• Order picked• Trailer filled (Load driven)• Line Haul• Delivery

Constantcost & time

Cost & Time depend on Pool Assignment

Page 9: Modeling Service

15.057 Spring 02 Vande Vate 99

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

Page 10: Modeling Service

15.057 Spring 02 Vande Vate 1010

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

Page 11: Modeling Service

15.057 Spring 02 Vande Vate 1111

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

Page 12: Modeling Service

15.057 Spring 02 Vande Vate 1212

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]

Page 13: Modeling Service

15.057 Spring 02 Vande Vate 1313

Make It LinearTrailer 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?

Page 14: Modeling Service

15.057 Spring 02 Vande Vate 1414

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?

Page 15: Modeling Service

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]

Page 16: Modeling Service

15.057 Spring 02 Vande Vate 1616

Our Simple Modelvar 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 daysConstant Order time, e.g., order processing, picking, etc.Line haul time from DC to PoolDelivery time from Pool to Store

Page 17: Modeling Service

15.057 Spring 02 Vande Vate 1717

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

Page 18: Modeling Service

15.057 Spring 02 Vande Vate 1818

A Simpler Modelvar 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;

Assign[store, pool]Open[pool]

Max Time to Fill Trailer depends on the Store and the Pool:Store Service Requirement, e.g., 3 daysConstant Order time, e.g., order processing, picking, etc.Line haul time from DC to PoolDelivery time from Pool to Store (depends on pool)

Page 19: Modeling Service

15.057 Spring 02 Vande Vate 1919

One DC Cube Only Modelvar 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 daysConstant Order time, e.g., order processing, picking, etc.Line haul time from DC to PoolDelivery time from Pool to Store (depends on pool)

Page 20: Modeling Service

15.057 Spring 02 Vande Vate 2020

More than One DCService 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?

Page 21: Modeling Service

15.057 Spring 02 Vande Vate 2121

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.

Page 22: Modeling Service

15.057 Spring 02 Vande Vate 2222

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]

Page 23: Modeling Service

15.057 Spring 02 Vande Vate 2323

What’s Wrong NowService 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]

Page 24: Modeling Service

15.057 Spring 02 Vande Vate 2424

The ProblemService 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.

Page 25: Modeling Service

15.057 Spring 02 Vande Vate 2525

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]

Page 26: Modeling Service

15.057 Spring 02 Vande Vate 2626

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]

Page 27: Modeling Service

15.057 Spring 02 Vande Vate 2727

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]

Page 28: Modeling Service

15.057 Spring 02 Vande Vate 2828

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]

Page 29: Modeling Service

15.057 Spring 02 Vande Vate 2929

Weight AND Cube

• Trailer departs when – Weight Limit is reached OR– Cubic Capacity is reached

• Don’t have to fill BOTH

Page 30: Modeling Service

15.057 Spring 02 Vande Vate 3030

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)

Page 31: Modeling Service

15.057 Spring 02 Vande Vate 3131

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

Page 32: Modeling Service

A Full Modelvar 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])

Page 33: Modeling Service

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

Page 34: Modeling Service

15.057 Spring 02 Vande Vate 3434

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•

Page 35: Modeling Service

15.057 Spring 02 Vande Vate 3535

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?

Page 36: Modeling Service

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)

Page 37: Modeling Service

15.057 Spring 02 Vande Vate 3737

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

Page 38: Modeling Service

The Whole Storyvar 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]