The AMPL Syntax Guide
Disclaimer This is a
guide to the AMPL syntax only. For a comprehensive reference to the AMPL language see
AMPL: A Modeling Language for Mathematical Programming.
- Commenting
- Using symbolic
- Sets
- Variables
- Parameters
- Expressions
- Objective Functions
- Constraints
- Logical Statements
- Looping Statements
- Displaying and Printing
- Miscellaneous AMPL Commands
Commenting
The
#
is used for commenting, any characters on a line after the
#
are ignored by AMPL.
Examples
The Whiskas Cat Food Problem
# The set of all possible ingredients for the cat food set INGREDIENTS;
The Surfboard Production Problem
param Supply {MATERIALS}; # The supply of each raw material
param Recipe {MATERIALS, SURFBOARDS}; # The "recipe" for making surfboards
Using =symbolic
The
symbolic
keyword is used to create parameters that represent character strings. Usually they are used to represent members of 1-dimensional sets or part of a
tuple for multi-dimensional sets. However, they can also be used to represent file names or to automatically build labels (for entry in a set, for example).
Example. Searching a 1-Dimensional set
param gotcha symbolic within SET;
for {s in SET} {
if then
let gotcha := s;
} # gotcha now contains the (last) element in SET that satisfies the condition
Example. Searching a 2-Dimensional Set
set SET1;
set SET2;
set TWO_D_SET within SET1 cross SET2;
param got_one symbolic within SET1;
param got_two symbolic within SET2;
for {(s, t) in TWO_D_SET} {
if then {
let got_one := s;
let got_two := t;
}
} # (got_one, got_two) now contains the (last) element in TWO_D_SET # that satisfies the condition
To build labels for set elements you need a
symbolic
parameter and the parts of the label. You can then "glue" the parts of the label together by enclosing the label within
(
and
)
and joining the parts with
&
. The parts can be set elements, strings or numbers. Numbers are converted to strings using the
%g format from printf .
Example. Dynamically Building a Set
param name symbolic;
let SUPPLY_NODES := {};
for {s in SUPPLY_LOCATIONS} {
let name := (s & '-Woodchips');
let SUPPLY_NODES := SUPPLY_NODES union {name};
let Supply[name] := MaterialSupply[s, 'Woodchips'];
let {d in DEMAND_NODES} Cost[name, d] := TransportationCost[s, d];
let dummyDemandCost[name] := DisposalCost['Woodchips'];
}
--
MichaelOSullivan - 27 Feb 2008