Skip to content

STMTS_LSLIB

Filipe Brandão edited this page May 20, 2016 · 31 revisions

LS-LIB: Library of reformulations for Lot-sizing problems

Introduction

The set of statements presented in this page came from the library of reformulations LS-LIB proposed in Production Planning by Mixed Integer Programming (Pochet and Wolsey 2006). For more details please refer to the book. The implementation of these reformulations was made in collaboration with Laurence Wolsey.

Examples

bike.mod

# PPbyMIP: A Tiny Planning Model (Section 1.1, pag. 9)
# LS-U Model (4.1)-(4.5) (Section 4.1, pag. 117)
$PARAM[NT]{8};
param p := 100;
param q := 5000;
param h := 5;
param s_ini := 200;
$PARAM[d]{[400, 400, 800, 800, 1200, 1200, 1200, 1200],i0=1};

var x{1..NT}, >= 0;
var y{1..NT}, binary;
var s{0..NT}, >= 0;
param C{t in 1..NT} := sum{tt in t..NT} d[tt]; 
# enough capacity to procude everything => LS-U problem

minimize cost:
    sum{t in 1..NT} (p * x[t] + q * y[t]) + sum{t in 1..NT-1} (h * s[t]);

s.t. dem_sat{t in 1..NT}: s[t-1] + x[t] = d[t] + s[t];
s.t. s0: s[0] = s_ini;
s.t. sNT: s[NT] = 0;
s.t. vub{t in 1..NT}: x[t] <= C[t] * y[t];

$EXEC{
def mrange(a, b):
    return range(a, b+1)

NT = _params["NT"]
demand = _params["d"]

s = ["s[{}]".format(t) for t in mrange(0, NT)]
x = ["x[{}]".format(t) for t in mrange(1, NT)]
y = ["y[{}]".format(t) for t in mrange(1, NT)]
d = [demand[t] for t in mrange(1, NT)]
LS_U(s, x, y, d, NT)
};
end;

clb.mod

# Consumer Goods Production (pag. 195)
$EXEC{
def mrange(a, b):
    return range(a, b+1)

BACKLOG = True
};

$PARAM[NI]{4}; # number of items
$PARAM[NT]{30}; # number of shifts

# set-up costs for each period:
$PARAM[q]{[100, 100, 100, 9999, 100, 100, 100, 100, 100, 9999,
           100, 100, 100, 100, 100, 100, 100, 100, 9999, 100,
           100, 100, 100, 100, 9999, 100, 100, 100, 100, 100], i0=1};

# production per hour for each item:
$PARAM[a]{[807, 608, 1559, 1622], i0=1};

# storage costs per hour for each item:
$PARAM[h]{[0.0025, 0.0030, 0.0022, 0.0022], i0=1};

$PARAM[g]{50};     # start-up cost
$PARAM[gamma]{50}; # switch-off cost
$PARAM[rho]{2};    # backlog cost/storage cost ratio

$PARAM[L]{7};  # production lower-bound
$PARAM[C]{16}; # production upper-bound

# demand:
$PARAM[d]{read_demand("data/cldemand.dat", _params["NI"], _params["NT"])};

# production time:
var x{1..NI, 1..NT}, >= 0;

# storage variables:
var s{1..NI, 1..NT}, >= 0;

# backlog variables:
var r{1..NI, 1..NT}, ${">= 0" if BACKLOG else "== 0"}$;

# production variables:
var y{1..NI, 1..NT}, binary;

# start-up of item i at the beginning of period t:
var z{1..NI, 1..NT}, binary;

# switch-off of item i at the end of period t:
var w{1..NI, 1..NT}, binary;

minimize cost:
    sum{i in 1..NI, t in 1..NT}
        (h[i]*a[i]*s[i, t] + h[i]*rho*a[i]*r[i, t] +
         q[t]*y[i, t] + g*z[i, t] + gamma*w[i, t]);

s.t. dem_sat{i in 1..NI, t in 1..NT}:
    (if t > 1 then s[i, t-1] - r[i, t-1]) + x[i, t] = d[i, t] + s[i, t] - r[i, t];

s.t. upper_bound{i in 1..NI, t in 1..NT}: x[i, t] <= C*y[i, t];
s.t. lower_bound{i in 1..NI, t in 1..NT}: x[i, t] >= L*y[i, t];

s.t. setups1{i in 1..NI, t in 1..NT}:
    z[i, t] - (if t > 1 then w[i, t-1]) = y[i, t] - (if t > 1 then y[i, t-1]);
s.t. setups2{i in 1..NI, t in 1..NT}:
    z[i, t] <= y[i, t];

s.t. one_at_time{t in 1..NT}: sum{i in 1..NI} y[i, t] <= 1;

$EXEC{
NI = _params["NI"]
NT = _params["NT"]
L = _params["L"]
C = _params["C"]
demand = _params["d"]
for i in mrange(1, NI):
    s = ["s[{},{}]".format(i, t) for t in mrange(1, NT)]
    x = ["x[{},{}]".format(i, t) for t in mrange(1, NT)]
    y = ["y[{},{}]".format(i, t) for t in mrange(1, NT)]
    z = ["z[{},{}]".format(i, t) for t in mrange(1, NT)]
    d = [demand[i, t] for t in mrange(1, NT)]
    if BACKLOG is False:
        WW_U(s, y, d, NT)
    else:
        r = ["r[{},{}]".format(i, t) for t in mrange(1, NT)]
        w = ["w[{},{}]".format(i, t) for t in mrange(1, NT)]
        LS_U_B(s, r, x, y, d, NT)
        WW_U_SCB(s, r, y, z, w, d, NT, Tk=5)
};
end;

Parameters

  • NT- number of periods;
  • s- list of size NT (s0=0) or NT+1 with the stock variables for each period;
  • r- list of size NT with the backlog variables for each period;
  • y- list of size NT with the set-up variables for each period;
  • z- list of size NT with the start-up variables for each period;
  • w- list of size NT with the switch-off variables for each period;
  • d- list of size NT with the demand for each period;
  • L- production lower-bound;
  • C- production capacity;
  • s0- initial stock;
  • Tk- approximation parameter (default: NT).

For more details please refer to the book Production Planning by Mixed Integer Programming.

Wagner-Whitin models

WW_U

Usage: $WW_U{s, y, d, NT, Tk=None};

Description: Basic Wagner-Whitin.

Parameters: see parameter description.

WW_U_B

Usage: $WW_U_B{s, r, y, d, NT, Tk=None};

Description: Wagner-Whitin and Backlogging.

Parameters: see parameter description.

WW_U_SC

Usage: $WW_U_SC{s, y, z, d, NT, Tk=None};

Description: Wagner-Whitin and Start-up.

Parameters: see parameter description.

WW_U_SCB

Usage: $WW_U_SCB{s, r, y, z, w, d, NT, Tk=None};

Description: Wagner-Whitin, Backlogging and Start-up.

Parameters: see parameter description.

WW_U_LB

Usage: $WW_U_LB{s, y, d, L, NT, Tk=None};

Description: Wagner-Whitin, Constant Lower Bound.

Parameters: see parameter description.

WW_CC

Usage: $WW_CC{s, y, d, C, NT, Tk=None};

Description: Wagner-Whitin, Constant Capacity.

Parameters: see parameter description.

WW_CC_B

Usage: $WW_CC_B{s, r, y, d, C, NT, Tk=None};

Description: Wagner-Whitin, Constant Capacity and Backlogging.

Parameters: see parameter description.

Lot-sizing models

LS_U or LS_U1

Usage: $LS_U{s, x, y, d, NT, Tk=None}; or LS_U1{s, x, y, d, NT, Tk=None};

Description: Multi-commodity formulation for LS-U.

Parameters: see parameter description.

LS_U2

Usage: $LS_U2{s, x, y, d, NT, Tk=None};

Description: Shortest path formulation for LS-U.

Notes:

  • Assumes s[NT] = 0;
  • Not compatible with the LB variant.

Parameters: see parameter description.

LS_U_B

Usage: $LS_U_B{s, r, x, y, d, NT, Tk=None};

Description: Multi-commodity formulation for LS-U-B.

Parameters: see parameter description.

LS_U_SC

Usage: $LS_U_SC{s, x, y, z, d, NT, Tk=None};

Description: Extended formulation for LS-U-SC.

Notes:

  • Assumes s[NT] = 0;
  • Not compatible with the LB variant.

Parameters: see parameter description.

LS_U_SCB

Usage: $LS_U_SCB{s, x, y, z, w, d, NT, Tk=None};

Description: Extended formulation for LS-U-SC,B.

Notes:

  • Assumes s[NT] = 0;
  • Not compatible with the LB variant.

Parameters: see parameter description.

Discrete lot-sizing models

DLSI_CC

Usage: $DLSI_CC{s0, y, d, C, NT, Tk=None};

Description: Discrete lot-sizing with variable initial stock.

Parameters: see parameter description.

DLSI_CC_B

Usage: $DLSI_CC_B{s0, r, y, d, C, NT, Tk=None};

Description: Discrete lot-sizing with variable initial stock and backlogging.

Parameters: see parameter description.

DLS_CC_B

Usage: $DLS_CC_B{r, y, d, C, NT, Tk=None};

Description: Discrete lot-sizing (without initial stock) with backlogging.

Parameters: see parameter description.

DLS_CC_SC

Usage: $DLS_CC_SC{s, y, z, d, C, NT, Tk=None};

Description: Discrete lot-sizing (without initial stock) with start-up costs.

Notes:

  • DLS_CC_SC is only valid if demands are in {0, C}.

Parameters: see parameter description.


Copyright © 2015-2016 Filipe Brandão < [email protected] >. All rights reserved.