discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers package

Submodules

discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.cpsat module

CP-SAT solver for uncapacitated single-item lot sizing problem.

class discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.cpsat.CpSatUncapacitatedSingleItemSolver(problem: Problem, params_objective_function: ParamsObjectiveFunction | None = None, **kwargs: Any)[source]

Bases: OrtoolsCpSatSolver

CP-SAT solver for uncapacitated single-item lot sizing.

This solver models the problem using: - Binary setup variables Y_t ∈ {0,1} for each period - Integer production variables X_t >= 0 for each period - Integer inventory variables I_t >= 0 for each period

Constraints: - Inventory balance: I_t = I_{t-1} + X_t - d_t - Setup forcing: X_t > 0 implies Y_t = 1 - Initial inventory: I_0 = 0

Objective: - Minimize: sum_t (s_t * Y_t + v_t * X_t + c_t * I_t)

The problem is uncapacitated, so there are no capacity constraints.

init_model(**kwargs: Any) None[source]

Initialize the CP-SAT model.

Parameters:

**kwargs – Additional parameters passed to parent class

problem: UncapacitatedSingleItemLSP
retrieve_solution(cpsolvercb: CpSolverSolutionCallback) UncapacitatedSingleItemSolution[source]

Extract solution from CP-SAT solver.

Parameters:

cpsolvercb – CP-SAT solver callback

Returns:

UncapacitatedSingleItemSolution

variables: dict

discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.dp module

class discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.dp.DpUncapacitatedLotSizingSolver(problem: Problem, params_objective_function: ParamsObjectiveFunction | None = None, **kwargs: Any)[source]

Bases: DpSolver, WarmstartMixin

init_model(**kwargs: Any) None[source]

Initialize internal model used to solve.

Can initialize a ortools, milp, gurobi, … model.

problem: UncapacitatedSingleItemLSP
retrieve_solution(sol: Solution) Solution[source]
set_warm_start(solution: UncapacitatedSingleItemSolution) None[source]

Make the solver warm start from the given solution.

transition_name: dict
transition_objects: dict

discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.dp_wagner module

Wagner-Whitin dynamic programming solver for uncapacitated single-item lot sizing.

This module implements the classical Wagner-Whitin algorithm (1958) that solves the uncapacitated single-item lot sizing problem optimally in O(T²) time.

References

Wagner, H. M., & Whitin, T. M. (1958). Dynamic version of the economic lot size model. Management science, 5(1), 89-96.

class discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.dp_wagner.WagnerWhitinSolver(problem: UncapacitatedSingleItemLSP, **kwargs)[source]

Bases: SolverDO

Wagner-Whitin dynamic programming solver.

This solver computes the optimal solution for the uncapacitated single-item lot sizing problem in O(T²) time using dynamic programming.

The algorithm exploits the Zero Inventory Ordering (ZIO) property: In an optimal solution, production in period t (if any) should satisfy demand for an integer number of consecutive future periods, with zero inventory before period t.

This means we only need to consider T² possible solutions (for each period, consider producing to satisfy demand up to each future period).

The dynamic programming recurrence is:

f[t] = min over k in [0, t) of [f[k] + cost(k, t)]

Where:

f[t] = minimum cost to satisfy demands from period 0 to t-1 cost(k, t) = cost to produce in period k to satisfy demands k to t-1

= setup_cost[k] + production_cost[k] * sum(demands[k:t])
  • sum of inventory costs for holding from k to t

Base case: f[0] = 0 (no cost before first period)

Time complexity: O(T²) where T is the horizon Space complexity: O(T)

problem: UncapacitatedSingleItemLSP
solve(**kwargs) ResultStorage[source]

Solve the problem optimally using Wagner-Whitin algorithm.

Parameters:

**kwargs – Additional parameters (ignored)

Returns:

ResultStorage containing the optimal solution

discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.lp module

class discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.lp.GurobiUncapacitatedSingleItemSolver(problem: Problem, params_objective_function: ParamsObjectiveFunction | None = None, **kwargs: Any)[source]

Bases: _BaseLpUncapacitatedSingleItemSolver, GurobiMilpSolver

convert_to_variable_values(solution: UncapacitatedSingleItemSolution) dict[gurobipy.Var, float][source]

Convert a solution to a mapping between model variables and their values.

Will be used by set_warm_start().

Override it in subclasses to have a proper warm start. You can also override set_warm_start() if default behaviour is not sufficient.

class discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.lp.MathoptUncapacitatedSingleItemSolver(problem: Problem, params_objective_function: ParamsObjectiveFunction | None = None, **kwargs: Any)[source]

Bases: _BaseLpUncapacitatedSingleItemSolver, OrtoolsMathOptMilpSolver

discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.toulbar module

class discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.toulbar.ToulbarUncapacitatedSingleItemSolver(problem: Problem, params_objective_function: ParamsObjectiveFunction | None = None, **kwargs: Any)[source]

Bases: ToulbarSolver, WarmstartMixin

init_model(**kwargs) None[source]

Initialize internal model used to solve.

Can initialize a ortools, milp, gurobi, … model.

problem: UncapacitatedSingleItemLSP
retrieve_solution(solution_from_toulbar2: tuple[list, float, int]) UncapacitatedSingleItemSolution[source]
set_warm_start(solution: UncapacitatedSingleItemSolution) None[source]

Make the solver warm start from the given solution.

Module contents

Solvers for uncapacitated single-item lot sizing problem.

class discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.CpSatUncapacitatedSingleItemSolver(problem: Problem, params_objective_function: ParamsObjectiveFunction | None = None, **kwargs: Any)[source]

Bases: OrtoolsCpSatSolver

CP-SAT solver for uncapacitated single-item lot sizing.

This solver models the problem using: - Binary setup variables Y_t ∈ {0,1} for each period - Integer production variables X_t >= 0 for each period - Integer inventory variables I_t >= 0 for each period

Constraints: - Inventory balance: I_t = I_{t-1} + X_t - d_t - Setup forcing: X_t > 0 implies Y_t = 1 - Initial inventory: I_0 = 0

Objective: - Minimize: sum_t (s_t * Y_t + v_t * X_t + c_t * I_t)

The problem is uncapacitated, so there are no capacity constraints.

init_model(**kwargs: Any) None[source]

Initialize the CP-SAT model.

Parameters:

**kwargs – Additional parameters passed to parent class

problem: UncapacitatedSingleItemLSP
retrieve_solution(cpsolvercb: CpSolverSolutionCallback) UncapacitatedSingleItemSolution[source]

Extract solution from CP-SAT solver.

Parameters:

cpsolvercb – CP-SAT solver callback

Returns:

UncapacitatedSingleItemSolution

variables: dict
class discrete_optimization.lotsizing.uncapacitatedsingleitem.solvers.WagnerWhitinSolver(problem: UncapacitatedSingleItemLSP, **kwargs)[source]

Bases: SolverDO

Wagner-Whitin dynamic programming solver.

This solver computes the optimal solution for the uncapacitated single-item lot sizing problem in O(T²) time using dynamic programming.

The algorithm exploits the Zero Inventory Ordering (ZIO) property: In an optimal solution, production in period t (if any) should satisfy demand for an integer number of consecutive future periods, with zero inventory before period t.

This means we only need to consider T² possible solutions (for each period, consider producing to satisfy demand up to each future period).

The dynamic programming recurrence is:

f[t] = min over k in [0, t) of [f[k] + cost(k, t)]

Where:

f[t] = minimum cost to satisfy demands from period 0 to t-1 cost(k, t) = cost to produce in period k to satisfy demands k to t-1

= setup_cost[k] + production_cost[k] * sum(demands[k:t])
  • sum of inventory costs for holding from k to t

Base case: f[0] = 0 (no cost before first period)

Time complexity: O(T²) where T is the horizon Space complexity: O(T)

problem: UncapacitatedSingleItemLSP
solve(**kwargs) ResultStorage[source]

Solve the problem optimally using Wagner-Whitin algorithm.

Parameters:

**kwargs – Additional parameters (ignored)

Returns:

ResultStorage containing the optimal solution