Building Applications with Python & Gurobi · } Call Model.update()once to process pending model...

23
Building Applications with Python & Gurobi Kostja Siefen

Transcript of Building Applications with Python & Gurobi · } Call Model.update()once to process pending model...

Page 1: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

Building Applications with Python & Gurobi

Kostja Siefen

Page 2: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization2

Building optimization models with Gurobi

} Option 1 – use a modeling language◦ Very easy to build models

� Optimization modeling constructs built into language◦ Attractive choice for non-programmers◦ Alternatives: AMPL, GAMS, Pyomo, …

} Option 2 – use a full programming language◦ Much more powerful and flexible development environment

� Complete access to solver functionality� Richer set of language features

◦ Natural choice when deploying models and/or integrating them into applications for others to use

◦ Alternatives: C, C++, C#, Java, MATLAB, Python, R, VB

} But what if users didn't have to choose between easy and powerful?

Page 3: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization3

Gurobi Python Environment

} High-level optimization modeling constructs embedded in Python programming language◦ Combines expressiveness of a modeling language with the power and

flexibility of a programming language

} Design goals:◦ Require minimal programming skills to get started◦ Bring "feel" of a modeling language to the Python interface◦ Allow for code that is easy to write and maintain◦ Maintain unified design across all of our interfaces◦ Remain lightweight and efficient (memory & CPU) when compared with

solver alone◦ Support all solver and programming needs

} Consistently earns high praise from our users

Page 4: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization4

Why Python?

} Fast, powerful and easy-to-use

} Extendible with vast library of prewritten modules (over 50,000)◦ Statistical analysis, visualization, GUIs, web development, web services,

data connections, file compression, data encryption, …

} One of top-10 most popular programming languages, according to TIOBE Programming Community Index◦ http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html◦ Large and rapidly growing Python community with great training resources

} Interactive shell is useful for prototyping} Can be deployed to create full-featured optimization applications◦ GUI, server, web, …

} Free and open source with license that's business-friendly

Page 5: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization5

Getting started with Python} Don't need to be an expert to start modeling in Python

} Nothing extra to buy or install◦ Gurobi distribution includes Python interpreter and basic modules

} Gurobi Interactive Shell is Python shell with Gurobi extensions◦ Powerful environment for interacting with existing models

} To launch the shell:◦ Windows

� Double-click the Gurobi icon on the desktop� Or run gurobi from a Command Prompt window

◦ Linux� Run the gurobi.sh command from a terminal

◦ Mac� Click on the Gurobi icon in the Launchpad � Or run the gurobi.sh command from a terminal

Page 6: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization6

Programming in Python} Python is a cross-platform, high-level programming language◦ Object-oriented◦ Interpreted◦ Dynamically typed◦ Automatic memory management◦ Includes a large standard library◦ Documentation tightly integrated with the code

} Python programs are typically stored in text files with .py extension

} Most functionality in Python is provided by modules◦ To use a module in Python programs, include an import statement

} To use the Gurobi interface, import the gurobipy module:from gurobipy import *

Page 7: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization7

Editing and running Python programs

} Any text editor can be used to work with .py files◦ Most programming editors have Python mode with syntax highlighting,

etc.

} To run a program:◦ Windows

� At a Command Prompt window, entergurobi [program_name]

◦ Linux/Mac� At a terminal, enter

gurobi.sh [program_name]

} Many IDEs available◦ https://wiki.python.org/moin/IntegratedDevelopmentEnvironments◦ Easy to install Gurobi in other Python distributions

Page 8: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization8

Gurobi recommends Anaconda

} Windows, Mac, Linux; 32/64-bit

} Python 2.x, 3.x — your choice} ~150 packages in the default installation

} conda package and environment management◦ ~350 packages available with a simple conda install

◦ Create isolated “silos” for multiple projects

} Gurobi provides/maintains Anaconda packages

Page 9: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization9

Essential Gurobi modeling constructs

} Model a model} Var a decision variable} Constr a constraint

} Overloaded operators◦ Basic arithmetic (+, -, ×, ÷)◦ Constraint (≤, =, ≥)

} Aggregate sum operator (quicksum)

} Python provides the rest!

Page 10: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization10

Typical steps for building a model

} Create empty Model object with Model() constructor

} Add variables with Model.addVar()

} Call Model.update() once to process pending model updates◦ Gurobi provides efficient "lazy updates"◦ Only call Model.update()when necessary to reference new elements

} Call Model.setObjective() to set objective function

} Add constraints with Model.addConstr()

} Solve the model with Model.optimize()◦ Will process any pending model updates

Page 11: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization11

Example: simple model

# Create empty Model

m = Model()

# Add variables

x = m.addVar(vtype=GRB.BINARY)

y = m.addVar(vtype=GRB.BINARY)

z = m.addVar(vtype=GRB.BINARY)

# Process pending updates

m.update()

Page 12: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization12

Example: simple model

# Set objective function

m.setObjective(x + y + 2*z, GRB.MAXIMIZE)

# Add constraints

m.addConstr(x + 2*y + 3*z <= 4)

m.addConstr(x + y >= 1)

# Solve model

m.optimize()

Page 13: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization13

Indices and subscripts in Python

} List is a mutable sequence of elements◦ Useful when representing index sets◦ Elements of any type (integers, strings, …) indexed by integers (0 to n-1)◦ Ex: cities=['CHI', 'NYC', 'ATL']; cities.append('MIA'); cities[2]='BOS'; cities.remove('NYC'); cities.sort()

} Tuple is an immutable, compound grouping of elements◦ Ideal for representing multidimensional subscripts◦ Ex: arc=('CHI','NYC'); j=arc[1]

} Dictionary is a mutable mapping from keys to values◦ Useful when representing coefficients or variables indexed by subscripts◦ Keys must be immutable (integers, strings, tuples, …)◦ Ex: cost={('CHI','NYC'):100, ('ATL','MIA'):150}; cost[('NYC','MIA')]=200; c=cost['ATL','MIA']

Page 14: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization14

Iterating in Python and aggregate sums} Loops iterate over collections of elements (list, dictionary, …)◦ Useful when representing the for-all modeling construct◦ Ex:

for c in cities:print c # must indent all statements in loop

} List comprehension efficiently builds lists via set notation◦ Ex: penaltyarcs=[a for a in arcs if cost[a]>1000]

} quicksum() is direct replacement for Python's sum() function◦ Gurobi feature that is more efficient when working with Var objects◦ Ex: obj=quicksum(cost[a]*x[a] for a in arcs)

} Combining loops with sums is ideal when building constraints

Ex: can be built with

for i in I:m.addConstr(quicksum(x[i,j] for j in J) <= 5)

xijj∈J∑ ≤ 5,∀i ∈ I

Page 15: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization15

Building a Gurobi Model: Six Steps

Create a model m = Model()

Add variables x = m.addVar(...)

Commit changes m.update()

Set objective m.setObjective(...)

Add constraints m.addConstr(...)

Optimize m.optimize()

Page 16: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization16

Spyder

} Scientific Python Development EnviRonment

} Familiar integrated development environment (IDE) for users of MATLAB, Visual Studio, etc.

} Built-in editor, file explorer, documentation browser} Graphical interface for debugging (ipdb)

} IPython console for interactive code execution

http://pythonhosted.org/spyder

Page 17: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization17

Latest Python-related enhancements in v6.5} Interactive examples for commonly faced business problems◦ http://www.gurobi.com/resources/examples/example-models-overview

} Expression building is more than 4X faster

} Lazy update mode◦ Set new UpdateMode parameter to 1◦ Refer to new variables and constraints without calling Model.update()

} More control over when Gurobi environments are created/released◦ Default environment not created until first used◦ Released with new disposeDefaultEnv()method

} New Conda package simplifies installation for the Anaconda Python distribution$ conda config --add channels http://conda.anaconda.org/gurobi$ conda install gurobi

Page 18: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization18

Interactive Examples

Page 19: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization19

Jupyter (formerly IPython)

} A web application for interactive data analysis

} Create notebooks containing live code, text, equations, and visualizations

} A great way to prototype new algorithms, document experiments, share reproducible results

} Originally for Python, now there are kernels for over 50 different languages

http://www.jupyter.org

Page 20: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization20

Pandas

} Fast and efficient DataFrame and Series objects

} Read/write CSV, HDF5, Excel, SQL, plain text} Missing data handling

} Slicing, fancy indexing, subsetting} Merges, joins

} Split-apply-combine operations (groupby)

http://pandas.pydata.org

Page 21: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization21

Bokeh

} Interactive visualization for web browsers◦ High performance with streaming data and big data◦ In-browser interactivity on otherwise static pages◦ Bindings for Python, Scala, Julia, R

http://bokeh.pydata.org

Page 22: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization22

Jupyter Demo

Page 23: Building Applications with Python & Gurobi · } Call Model.update()once to process pending model updates Gurobi provides efficient "lazy updates" Only call Model.update()when necessary

© 2015 Gurobi Optimization23

References} Visit http://www.gurobi.com/documentation/ for more information on

the Gurobi Python Interface◦ Quick Start Guide◦ Reference Manual

} Explore our functional code examples to learn more about advanced features◦ Working with sparse models: netflow, workforce◦ Accessing data sources (databases, spreadsheets, …): diet

} Visit https://docs.python.org/ learn more about Python ◦ Official Python website◦ Tutorials, documentation, examples, …

} Visit https://www.continuum.io to get started with the Anaconda Python distribution, which includes iPython and Jupyter