Motivation
At the heart of any optimization model lies a set of decision
variables. Finding a convenient way to store and access these
variables can often represent the main challenge in implementing the
model. While the variables in some models map naturally to simple
programming language constructs (e.g., x[i]
for contiguous
integer values i
), other models can present a much greater
challenge. For example, consider a model that optimizes the flow of
multiple different commodities through a supply network. You might
have a variable x['Pens', 'Denver', 'New York']
that
captures the flow of a manufactured item (pens in this example) from
Denver to New York. At the same time, you might not want to
have a variable x['Pencils', 'Denver', 'Seattle']
, since not all
combinations of commodities, source cities, and destination cities
represent valid paths through the network. Representing a sparse set
of decision variables in a typical programming language can
be cumbersome.
To compound the challenge, you typically need to build constraints that involve subsets of these decision variables. For example, in our network flow model you might want to put an upper bound on the total flow that enters a particular city. You could certainly collect the relevant decision variables by iterating over all possible cities and selecting only those variables that capture possible flow from that source city into the desired destination city. However, this is clearly wasteful if not all origin-destination pairs are valid. In a large network problem, the inefficiency of this approach could lead to major performance issues. Handling this efficiently can require complex data structures.
The Gurobi Python interface has been designed to make the issues we've
just described quite easy to manage. We'll present a specific example
of how this is done shortly. Before we do, though, we'll need to
describe a few important Python constructs: lists
,
tuples
, dictionaries
, list comprehension
, and
generator expressions
. These are standard Python concepts that
are particularly important in our interface. We'll also introduce the
tuplelist
and tupledict
classes, which are custom
classes that we've added to the Gurobi Python interface.
A quick reminder: you can consult the online Python documentation for additional information on any of the Python data structures mentioned here.