Line: 1 to 1 | ||||||||
---|---|---|---|---|---|---|---|---|
<-- Ready to Review - done - Lauren--> Sets in AMPL | ||||||||
Line: 23 to 23 | ||||||||
Sets are declared using the set keyword followed by a label, possibly some attributes and either a set literal or set expression. The most common attribute is set by the within keyword. This specifies that the set will only contain elements from the following set definition: set ARCS within NODES cross NODES; # Elements of ARCS must have both elements in NODESIf you need a multi-dimensional set, but don't have the 1-dimensional sets to construct it yet you can use the dimen keyword: set ROUTES dimen 2;There are some other set attributes, but we will not use them. Set literals can be defined as a list of elements: | ||||||||
Changed: | ||||||||
< < | {'HOST', 'DEVICE', 'SWITCH', 'HUB', 'LINK', 'SUPERLINK'}or a sequence of numbers: param start; param end > start; param step; set NUMBERS := start .. end by step;If the by step is missing, the step is assumed to be 1 set NUMBERS := 1..5; # NUMBERS = {1, 2, 3, 4, 5}Note Automatic set generation can only be done in the [[AMPLProcess#model][model environment] should this be a link? - Lauren , in the data environment you must define the set explicitly: set NUMBERS := 1 2 3 4 5; # NUMBERS = {1, 2, 3, 4 5} | |||||||
> > | {'HOST', 'DEVICE', 'SWITCH', 'HUB', 'LINK', 'SUPERLINK'}or a sequence of numbers: param start; param end > start; param step; set NUMBERS := start .. end by step;If the by step is missing, the step is assumed to be 1 set NUMBERS := 1..5; # NUMBERS = {1, 2, 3, 4, 5}Note Automatic set generation can only be done in the model environment, in the data environment you must define the set explicitly: set NUMBERS := 1 2 3 4 5; # NUMBERS = {1, 2, 3, 4 5} | |||||||
Return to top | ||||||||
Line: 32 to 32 | ||||||||
| ||||||||
Changed: | ||||||||
< < | Generic Set Expression Fix underlining - Lauren
{ in , [ in , in , ...] : } Set expressions may also involve one or more _set operators_: | |||||||
> > | Generic Set Expression
{ <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:
You will see examples of set expressions throughout the rest of this page. | |||||||
Defining a Set | ||||||||
Changed: | ||||||||
< < | Sets are usually defined in a data file: 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: 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: set SEARCH within VERTICES; let SEARCH := {v in VERTICES: (v, w) in EDGES};
| |||||||
> > |
Sets are usually defined in a data file:
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:
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:
set SEARCH within VERTICES; let SEARCH := {v in VERTICES: (v, w) in EDGES}; | |||||||
Defining 2-Dimensional Sets | ||||||||
Changed: | ||||||||
< < | There are three different ways to define 2-dimensional sets. The "best" way to use depends on the set.
| |||||||
> > |
There are three different ways to define 2-dimensional sets. The "best" way to use depends on the set.
| |||||||
Ordered Sets | ||||||||
Changed: | ||||||||
< < | You can create sets where the elements are ordered using the set MONTHS ordered;AMPL will puts the elements in this set in the order they appear in the data file (or {\tt let} statement). AMPL also understands the following operations for ordered sets: 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
| |||||||
> > |
You can create sets where the elements are ordered using the ordered keyword during definition.
Up to here - Mike
set MONTHS ordered;AMPL will puts the elements in this set in the order they appear in the data file (or {\tt let} statement). AMPL also understands the following operations for ordered sets: 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
| |||||||
Set ExampleConsider the following AMPL statement from the The American Steel Planning Problem. We use # 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 arcs used for transportation ( (m = n) and (ord(t, MONTHS) + 1 = ord(u, MONTHS)) )}; # The arcs used for storageThere are many concepts within this one statement, let's look at them one at a time.
Set Operations |