
| Line: 1 to 1 | ||||||||
|---|---|---|---|---|---|---|---|---|
<-- Ready to Review - done - Lauren--> Sets in AMPL | ||||||||
| Line: 36 to 36 | ||||||||
| ||||||||
| Changed: | ||||||||
| < < | { | |||||||
| > > | { <e> in <S>, [<f> in <T>, <g> in <U>, …] : <logical expression involving e [f, g, …]>} | |||||||
| Set expressions may also involve one or more set operators: | ||||||||
| Line: 54 to 54 | ||||||||
| Sets are usually defined in a data file: | ||||||||
| Changed: | ||||||||
| < < | set NODES := Youngstown Pittsburgh Cincinnati 'Kansas City' Chicago Albany Houston Tempe Gary ; | |||||||
| > > |
set NODES := Youngstown Pittsburgh Cincinnati 'Kansas City' Chicago
Albany Houston Tempe Gary ;
| |||||||
| although they may be defined during declaration using either an explicit set literal or using a set expression: | ||||||||
| Changed: | ||||||||
| < < | set KIND := {'HOST', 'DEVICE', 'SWITCH', 'HUB', 'LINK', 'SUPERLINK'}; set COMPONENT := {C in CLASSES : (kind[C] = 'HOST' ) or (kind[C] = 'DEVICE') or (kind[C] = 'HUB' ) or (kind[C] = 'SWITCH')}; set FABRIC := NODE union LINK; | |||||||
| > > |
set KIND := {'HOST', 'DEVICE', 'SWITCH', 'HUB', 'LINK', 'SUPERLINK'};
set COMPONENT := {C in CLASSES : (kind[C] = 'HOST' ) or
(kind[C] = 'DEVICE') or
(kind[C] = 'HUB' ) or
(kind[C] = 'SWITCH')};
set FABRIC := NODE union LINK;
| |||||||
| and sets may also be defined dynamically: | ||||||||
| Changed: | ||||||||
| < < | set SEARCH within VERTICES; let SEARCH := {v in VERTICES: (v, w) in EDGES}; | |||||||
| > > |
set SEARCH within VERTICES;
let SEARCH := {v in VERTICES: (v, w) in EDGES};
| |||||||
Defining 2-Dimensional SetsThere are three different ways to define 2-dimensional sets. The "best" way to use depends on the set. | ||||||||
| Changed: | ||||||||
| < < |
| |||||||
| > > |
set ARCS:
Cincinnati 'Kansas City' Chicago Albany Houston Tempe Gary :=
Youngstown + + + + - - -
Pittsburgh + + + - - - +
Cincinnati - - - + + - -
'Kansas City' - - - - + + -
Chicago - - - - - + +
;
set ARCS := (Youngstown, *) Cincinnati ‘Kansas City’ Chicago Albany (Pittsburgh, *) Cincinnati ‘Kansas City’ Chicago Gary (Cincinnati, *) Albany Houston ... | |||||||
| Return to top | ||||||||
| Line: 82 to 117 | ||||||||
AMPL will put the elements in this set in the order they appear in the data file (or let statement). AMPL also understands the following operations for ordered sets: | ||||||||
| Changed: | ||||||||
| < < | ord(e, ORD_SET) # The position of e in ORD_SET first(ORD_SET) # The first element in ORD_SET last(ORD_SET) # The last element in ORD_SET prev(e, ORD_SET) # The element before e in ORD_SET next(e, ORD_SET) # The element after e in ORD_SET member(i, ORDSET) # The element at position i in ORD_SET | |||||||
| > > | ord(e, ORD_SET) # The position of e in ORD_SET first(ORD_SET) # The first element in ORD_SET last(ORD_SET) # The last element in ORD_SET prev(e, ORD_SET) # The element before e in ORD_SET next(e, ORD_SET) # The element after e in ORD_SET member(i, ORDSET) # The element at position i in ORD_SET | |||||||
| Return to top | ||||||||
| Line: 90 to 132 | ||||||||
Consider the following AMPL statement from the The American Steel Planning Problem. We use ord in the creation of TIME_ARCS: | ||||||||
| Changed: | ||||||||
| < < | # The set of time-staged arcs set TIME_ARCS within TIME_NODES cross TIME_NODES := { (m, t) in TIME_NODES, (n, u) in TIME_NODES : ( ( (m, n) in ARCS) and (t = u) ) or # The transportation arcs ( (m = n) and (ord(t, MONTHS) + 1 = ord(u, MONTHS)) )}; # The storage arcs | |||||||
| > > |
# The set of time-staged arcs
set TIME_ARCS within TIME_NODES cross TIME_NODES :=
{ (m, t) in TIME_NODES, (n, u) in TIME_NODES :
( ( (m, n) in ARCS) and (t = u) ) or # The transportation arcs
( (m = n) and (ord(t, MONTHS) + 1 = ord(u, MONTHS)) )}; # The storage arcs
| |||||||
| There are many concepts within this one statement, let's look at them one at a time. | ||||||||
| Line: 99 to 147 | ||||||||
There are many operations we can perform on sets (see Set Expressions). We have seen that cross creates all pairs of two sets, so TIME_NODES cross TIME_NODES creates a set of all pairs of TIME_NODES.
Some set operations may be looped over indexing sets. For example, to generate all the transportation arcs in the time-staged network you could use the following statement: | ||||||||
| Changed: | ||||||||
| < < | set TRANSPORT_ARCS := union {t in MONTHS} (union {(m, n) ARCS} {(m, t, n, t)}); or you could loop over MONTHS and ARCS simultaneously: set TRANSPORT_ARCS := union {t in MONTHS, (m, n) in ARCS} {(m, t, n, t)}; | |||||||
| > > |
set TRANSPORT_ARCS := union {t in MONTHS} (union {(m, n) ARCS} {(m, t, n, t)});
or you could loop over MONTHS and ARCS simultaneously:
set TRANSPORT_ARCS := union {t in MONTHS, (m, n) in ARCS} {(m, t, n, t)};
| |||||||
Set Membership and Subsets | ||||||||