## DisjunctiveProgramming.jl

A JuMP extension for Generalized Disjunctive Programming
Author hdavid16
Popularity
1 Star
Updated Last
2 Years Ago
Started In
July 2020

# DisjunctiveProgramming.jl

Generalized Disjunctive Programming extension to JuMP

## Installation

```using Pkg

## Disjunctions

Disjunctions can be applied to standard JuMP models with constraints of that are either `GreaterThan`, `LessThan`, or `EqualTo`. Reformulations on constraints that are `Interval` are not supported. The disjunctions can be reformulated via the Big-M method or the Convex Hull as described here. The user may provide an `M` object that represents the BigM value(s). The `M` object can be a `Number` that is applied to all constraints in the disjuncts, or a `Vector`/`Tuple` of values that are used for each of the disjuncts.

For the Convex Hull Reformulation, the perspective function proposed in Furman, et al.  is used.

## Example

The example below is from the Northwestern University Process Optimization Open Textbook.

To perform the Big-M reformulation, `:BMR` is passed to the `reformulation` keyword argument. If nothing is passed to the keyword argument `M`, tight Big-M values will be inferred from the variable bounds using IntervalArithmetic.jl. If `x` is not bounded, Big-M values must be provided for either the whole system (e.g., `M = 10`) or for each of the constraint arrays in the example (e.g., `M = ((10,10),(10,10))`).

To perform the Convex-Hull reformulation, `reformulation = :CHR`. Variables must have bounds for the reformulation to work.

```using JuMP
using DisjunctiveProgramming

m = Model()
@variable(m, 0<=x[1:2]<=10)

@constraint(m, con1[i=1:2], x[i] <= [3,4][i])
@constraint(m, con2[i=1:2], zeros(2)[i] <= x[i])
@constraint(m, con3[i=1:2], [5,4][i] <= x[i])
@constraint(m, con4[i=1:2], x[i] <= [9,6][i])

@disjunction(m,(con1,con2),(con3,con4), reformulation=:BMR)

┌ Warning: No M value passed for con1 : x <= 3.0. M = 7.0 was inferred from the variable bounds.
┌ Warning: No M value passed for con1 : x <= 4.0. M = 6.0 was inferred from the variable bounds.
┌ Warning: No M value passed for con2 : -x <= 0.0. M = 0.0 was inferred from the variable bounds.
┌ Warning: No M value passed for con2 : -x <= 0.0. M = 0.0 was inferred from the variable bounds.
┌ Warning: No M value passed for con3 : -x <= -5.0. M = 5.0 was inferred from
the variable bounds.
┌ Warning: No M value passed for con3 : -x <= -4.0. M = 4.0 was inferred from
the variable bounds.
┌ Warning: No M value passed for con4 : x <= 9.0. M = 1.0 was inferred from the variable bounds.
┌ Warning: No M value passed for con4 : x <= 6.0. M = 4.0 was inferred from the variable bounds.```

### Required Packages

View all packages

### Used By Packages

No packages found.