|
1 %* gmpl.tex *% |
|
2 |
|
3 %*********************************************************************** |
|
4 % This code is part of GLPK (GNU Linear Programming Kit). |
|
5 % |
|
6 % Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, |
|
7 % 2009, 2010 Andrew Makhorin, Department for Applied Informatics, |
|
8 % Moscow Aviation Institute, Moscow, Russia. All rights reserved. |
|
9 % E-mail: <mao@gnu.org>. |
|
10 % |
|
11 % GLPK is free software: you can redistribute it and/or modify it |
|
12 % under the terms of the GNU General Public License as published by |
|
13 % the Free Software Foundation, either version 3 of the License, or |
|
14 % (at your option) any later version. |
|
15 % |
|
16 % GLPK is distributed in the hope that it will be useful, but WITHOUT |
|
17 % ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
|
18 % or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
|
19 % License for more details. |
|
20 % |
|
21 % You should have received a copy of the GNU General Public License |
|
22 % along with GLPK. If not, see <http://www.gnu.org/licenses/>. |
|
23 %*********************************************************************** |
|
24 |
|
25 \documentclass[10pt]{article} |
|
26 \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue]{hyperref} |
|
27 |
|
28 \begin{document} |
|
29 |
|
30 \thispagestyle{empty} |
|
31 |
|
32 \begin{center} |
|
33 |
|
34 \vspace*{1in} |
|
35 |
|
36 \begin{huge} |
|
37 \sf\bfseries Modeling Language GNU MathProg |
|
38 \end{huge} |
|
39 |
|
40 \vspace{0.5in} |
|
41 |
|
42 \begin{LARGE} |
|
43 \sf Language Reference |
|
44 \end{LARGE} |
|
45 |
|
46 \vspace{0.5in} |
|
47 |
|
48 \begin{LARGE} |
|
49 \sf for GLPK Version 4.45 |
|
50 \end{LARGE} |
|
51 |
|
52 \vspace{0.5in} |
|
53 \begin{Large} |
|
54 \sf (DRAFT, December 2010) |
|
55 \end{Large} |
|
56 |
|
57 \end{center} |
|
58 |
|
59 \newpage |
|
60 |
|
61 \vspace*{1in} |
|
62 |
|
63 \vfill |
|
64 |
|
65 \noindent |
|
66 The GLPK package is part of the GNU Project released under the aegis of |
|
67 GNU. |
|
68 |
|
69 \medskip\noindent |
|
70 Copyright \copyright{} 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, |
|
71 2008, 2009, 2010 Andrew Makhorin, Department for Applied Informatics, |
|
72 Moscow Aviation Institute, Moscow, Russia. All rights reserved. |
|
73 |
|
74 \medskip\noindent |
|
75 Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, |
|
76 MA 02110-1301, USA. |
|
77 |
|
78 \medskip\noindent |
|
79 Permission is granted to make and distribute verbatim copies of this |
|
80 manual provided the copyright notice and this permission notice are |
|
81 preserved on all copies. |
|
82 |
|
83 \medskip\noindent |
|
84 Permission is granted to copy and distribute modified versions of this |
|
85 manual under the conditions for verbatim copying, provided also that |
|
86 the entire resulting derived work is distributed under the terms of |
|
87 a permission notice identical to this one. |
|
88 |
|
89 \medskip\noindent |
|
90 Permission is granted to copy and distribute translations of this |
|
91 manual into another language, under the above conditions for modified |
|
92 versions. |
|
93 |
|
94 \newpage |
|
95 |
|
96 \tableofcontents |
|
97 |
|
98 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
99 |
|
100 \newpage |
|
101 |
|
102 \section{Introduction} |
|
103 |
|
104 {\it GNU MathProg} is a modeling language intended for describing |
|
105 linear mathematical programming models.\footnote{The GNU MathProg |
|
106 language is a subset of the AMPL language. Its GLPK implementation is |
|
107 mainly based on the paper: {\it Robert Fourer}, {\it David M. Gay}, and |
|
108 {\it Brian W. Kernighan}, ``A Modeling Language for Mathematical |
|
109 Programming.'' {\it Management Science} 36 (1990)\linebreak pp. 519-54.} |
|
110 |
|
111 Model descriptions written in the GNU MathProg language consist of |
|
112 a set of statements and data blocks constructed by the user from the |
|
113 language elements described in this document. |
|
114 |
|
115 In a process called {\it translation}, a program called the {\it model |
|
116 translator} analyzes the model description and translates it into |
|
117 internal data structures, which may be then used either for generating |
|
118 mathematical programming problem instance or directly by a program |
|
119 called the {\it solver} to obtain numeric solution of the problem. |
|
120 |
|
121 \subsection{Linear programming problem} |
|
122 \label{problem} |
|
123 |
|
124 In MathProg the linear programming (LP) problem is stated as follows: |
|
125 |
|
126 \medskip |
|
127 |
|
128 \noindent\hspace{.7in}minimize (or maximize) |
|
129 $$z=c_1x_1+c_2x_2+\dots+c_nx_n+c_0\eqno(1.1)$$ |
|
130 \noindent\hspace{.7in}subject to linear constraints |
|
131 $$ |
|
132 \begin{array}{l@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }l} |
|
133 L_1&\leq&a_{11}x_1&+&a_{12}x_2&+\dots+&a_{1n}x_n&\leq&U_1\\ |
|
134 L_2&\leq&a_{21}x_1&+&a_{22}x_2&+\dots+&a_{2n}x_n&\leq&U_2\\ |
|
135 \multicolumn{9}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ |
|
136 L_m&\leq&a_{m1}x_1&+&a_{m2}x_2&+\dots+&a_{mn}x_n&\leq&U_m\\ |
|
137 \end{array}\eqno(1.2) |
|
138 $$ |
|
139 \noindent\hspace{.7in}and bounds of variables |
|
140 $$ |
|
141 \begin{array}{l@{\ }c@{\ }c@{\ }c@{\ }l} |
|
142 l_1&\leq&x_1&\leq&u_1\\ |
|
143 l_2&\leq&x_2&\leq&u_2\\ |
|
144 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .}\\ |
|
145 l_n&\leq&x_n&\leq&u_n\\ |
|
146 \end{array}\eqno(1.3) |
|
147 $$ |
|
148 where $x_1$, $x_2$, \dots, $x_n$ are variables; $z$ is the objective |
|
149 function; $c_1$, $c_2$, \dots, $c_n$ are objective coefficients; $c_0$ |
|
150 is the constant term (``shift'') of the objective function; $a_{11}$, |
|
151 $a_{12}$, \dots, $a_{mn}$ are constraint coefficients; $L_1$, $L_2$, |
|
152 \dots, $L_m$ are lower constraint bounds; $U_1$, $U_2$, \dots, $U_m$ |
|
153 are upper constraint bounds; $l_1$, $l_2$, \dots, $l_n$ are lower |
|
154 bounds of variables; $u_1$, $u_2$, \dots, $u_n$ are upper bounds of |
|
155 variables. |
|
156 |
|
157 Bounds of variables and constraint bounds can be finite as well as |
|
158 infinite. Besides, lower bounds can be equal to corresponding upper |
|
159 bounds. Thus, the following types of variables and constraints are |
|
160 allowed: |
|
161 |
|
162 \newpage |
|
163 |
|
164 \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{38pt}}l} |
|
165 $-\infty$&$<$&$x$&$<$&$+\infty$&Free (unbounded) variable\\ |
|
166 $l$&$\leq$&$x$&$<$&$+\infty$&Variable with lower bound\\ |
|
167 $-\infty$&$<$&$x$&$\leq$&$u$&Variable with upper bound\\ |
|
168 $l$&$\leq$&$x$&$\leq$&$u$&Double-bounded variable\\ |
|
169 $l$&$=$&$x$&=&$u$&Fixed variable\\ |
|
170 \end{tabular} |
|
171 |
|
172 \bigskip |
|
173 |
|
174 \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll} |
|
175 $-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Free (unbounded) linear |
|
176 form\\ |
|
177 $L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Inequality constraint ``greater |
|
178 than or equal to''\\ |
|
179 $-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Inequality constraint ``less |
|
180 than or equal to''\\ |
|
181 $L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Double-bounded inequality |
|
182 constraint\\ |
|
183 $L$&$=$&$\sum a_jx_j$&=&$U$&Equality constraint\\ |
|
184 \end{tabular} |
|
185 |
|
186 \bigskip |
|
187 |
|
188 In addition to pure LP problems MathProg also allows mixed integer |
|
189 linear programming (MIP) problems, where some or all variables are |
|
190 restricted to be integer or binary. |
|
191 |
|
192 \subsection{Model objects} |
|
193 |
|
194 In MathProg the model is described in terms of sets, parameters, |
|
195 variables, constraints, and objectives, which are called {\it model |
|
196 objects}. |
|
197 |
|
198 The user introduces particular model objects using the language |
|
199 statements. Each model object is provided with a symbolic name that |
|
200 uniquely identifies the object and is intended for referencing purposes. |
|
201 |
|
202 Model objects, including sets, can be multidimensional arrays built |
|
203 over indexing sets. Formally, $n$-dimensional array $A$ is the mapping: |
|
204 $$A:\Delta\rightarrow\Xi,\eqno(1.4)$$ |
|
205 where $\Delta\subseteq S_1\times\dots\times S_n$ is a subset of the |
|
206 Cartesian product of indexing sets,\linebreak $\Xi$ is a set of array members. |
|
207 In MathProg the set $\Delta$ is called the {\it subscript domain}. Its |
|
208 members are $n$-tuples $(i_1,\dots,i_n)$, where $i_1\in S_1$, \dots, |
|
209 $i_n\in S_n$. |
|
210 |
|
211 If $n=0$, the Cartesian product above has exactly one member (namely, |
|
212 \linebreak 0-tuple), so it is convenient to think scalar objects as |
|
213 0-dimensional arrays having one member. |
|
214 |
|
215 The type of array members is determined by the type of corresponding |
|
216 model object as follows: |
|
217 |
|
218 \medskip |
|
219 |
|
220 \noindent\hfil |
|
221 \begin{tabular}{@{}ll@{}} |
|
222 Model object&Array member\\ |
|
223 \hline |
|
224 Set&Elemental plain set\\ |
|
225 Parameter&Number or symbol\\ |
|
226 Variable&Elemental variable\\ |
|
227 Constraint&Elemental constraint\\ |
|
228 Objective&Elemental objective\\ |
|
229 \end{tabular} |
|
230 |
|
231 \medskip |
|
232 |
|
233 In order to refer to a particular object member the object should be |
|
234 provided with {\it subscripts}. For example, if $a$ is a 2-dimensional |
|
235 parameter defined over $I\times J$, a reference to its particular |
|
236 member can be written as $a[i,j]$, where $i\in I$ and $j\in J$. It is |
|
237 understood that scalar objects being 0-dimensional need no subscripts. |
|
238 |
|
239 \subsection{Structure of model description} |
|
240 |
|
241 It is sometimes desirable to write a model which, at various points, |
|
242 may require different data for each problem instance to be solved using |
|
243 that model. For this reason in MathProg the model description consists |
|
244 of two parts: the {\it model section} and the {\it data section}. |
|
245 |
|
246 The model section is a main part of the model description that contains |
|
247 declarations of model objects and is common for all problems based on |
|
248 the corresponding model. |
|
249 |
|
250 The data section is an optional part of the model description that |
|
251 contains data specific for a particular problem instance. |
|
252 |
|
253 Depending on what is more convenient the model and data sections can be |
|
254 placed either in one file or in two separate files. The latter feature |
|
255 allows having arbitrary number of different data sections to be used |
|
256 with the same model section. |
|
257 |
|
258 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
259 |
|
260 \newpage |
|
261 |
|
262 \section{Coding model description} |
|
263 \label{coding} |
|
264 |
|
265 The model description is coded in plain text format using ASCII |
|
266 character set. Characters valid in the model description are the |
|
267 following: |
|
268 |
|
269 \begin{itemize} |
|
270 \item alphabetic characters:\\ |
|
271 \verb|A B C D E F G H I J K L M N O P Q R S T U V W X Y Z|\\ |
|
272 \verb|a b c d e f g h i j k l m n o p q r s t u v w x y z _| |
|
273 \item numeric characters:\\ |
|
274 \verb|0 1 2 3 4 5 6 7 8 9| |
|
275 \item special characters:\\ |
|
276 \verb?! " # & ' ( ) * + , - . / : ; < = > [ ] ^ { | }? |
|
277 \item white-space characters:\\ |
|
278 \verb|SP HT CR NL VT FF| |
|
279 \end{itemize} |
|
280 |
|
281 Within string literals and comments any ASCII characters (except |
|
282 control characters) are valid. |
|
283 |
|
284 White-space characters are non-significant. They can be used freely |
|
285 between lexical units to improve readability of the model description. |
|
286 They are also used to separate lexical units from each other if there |
|
287 is no other way to do that. |
|
288 |
|
289 Syntactically model description is a sequence of lexical units in the |
|
290 following categories: |
|
291 |
|
292 \begin{itemize} |
|
293 \item symbolic names; |
|
294 \item numeric literals; |
|
295 \item string literals; |
|
296 \item keywords; |
|
297 \item delimiters; |
|
298 \item comments. |
|
299 \end{itemize} |
|
300 |
|
301 The lexical units of the language are discussed below. |
|
302 |
|
303 \subsection{Symbolic names} |
|
304 |
|
305 A {\it symbolic name} consists of alphabetic and numeric characters, |
|
306 the first of which must be alphabetic. All symbolic names are distinct |
|
307 (case sensitive). |
|
308 |
|
309 \medskip |
|
310 |
|
311 \noindent{\bf Examples} |
|
312 |
|
313 \medskip |
|
314 |
|
315 \noindent\verb|alpha123| |
|
316 |
|
317 \noindent\verb|This_is_a_name| |
|
318 |
|
319 \noindent\verb|_P123_abc_321| |
|
320 |
|
321 \newpage |
|
322 |
|
323 Symbolic names are used to identify model objects (sets, parameters, |
|
324 variables, constraints, objectives) and dummy indices. |
|
325 |
|
326 All symbolic names (except names of dummy indices) must be unique, i.e. |
|
327 the model description must have no objects with identical names. |
|
328 Symbolic names of dummy indices must be unique within the scope, where |
|
329 they are valid. |
|
330 |
|
331 \subsection{Numeric literals} |
|
332 |
|
333 A {\it numeric literal} has the form {\it xx}{\tt E}{\it syy}, where |
|
334 {\it xx} is a number with optional decimal point, {\it s} is the sign |
|
335 {\tt+} or {\tt-}, {\it yy} is a decimal exponent. The letter {\tt E} is |
|
336 case insensitive and can be coded as {\tt e}. |
|
337 |
|
338 \medskip |
|
339 |
|
340 \noindent{\bf Examples} |
|
341 |
|
342 \medskip |
|
343 |
|
344 \noindent\verb|123| |
|
345 |
|
346 \noindent\verb|3.14159| |
|
347 |
|
348 \noindent\verb|56.E+5| |
|
349 |
|
350 \noindent\verb|.78| |
|
351 |
|
352 \noindent\verb|123.456e-7| |
|
353 |
|
354 \medskip |
|
355 |
|
356 Numeric literals are used to represent numeric quantities. They have |
|
357 obvious fixed meaning. |
|
358 |
|
359 \subsection{String literals} |
|
360 |
|
361 A {\it string literal} is a sequence of arbitrary characters enclosed |
|
362 either in single quotes or in double quotes. Both these forms are |
|
363 equivalent. |
|
364 |
|
365 If the single quote is part of a string literal enclosed in single |
|
366 quotes, it must be coded twice. Analogously, if the double quote is |
|
367 part of a string literal enclosed in double quotes, it must be coded |
|
368 twice. |
|
369 |
|
370 \medskip |
|
371 |
|
372 \noindent{\bf Examples} |
|
373 |
|
374 \medskip |
|
375 |
|
376 \noindent\verb|'This is a string'| |
|
377 |
|
378 \noindent\verb|"This is another string"| |
|
379 |
|
380 \noindent\verb|'1 + 2 = 3'| |
|
381 |
|
382 \noindent\verb|'That''s all'| |
|
383 |
|
384 \noindent\verb|"She said: ""No"""| |
|
385 |
|
386 \medskip |
|
387 |
|
388 String literals are used to represent symbolic quantities. |
|
389 |
|
390 \subsection{Keywords} |
|
391 |
|
392 A {\it keyword} is a sequence of alphabetic characters and possibly |
|
393 some special characters. |
|
394 |
|
395 All keywords fall into two categories: {\it reserved keywords}, which |
|
396 cannot be used as symbolic names, and {\it non-reserved keywords}, |
|
397 which being recognized by context can be used as symbolic names. |
|
398 |
|
399 \newpage |
|
400 |
|
401 The reserved keywords are the following: |
|
402 |
|
403 \medskip |
|
404 |
|
405 \noindent\hfil |
|
406 \begin{tabular}{@{}p{.7in}p{.7in}p{.7in}p{.7in}@{}} |
|
407 {\tt and}&{\tt else}&{\tt mod}&{\tt union}\\ |
|
408 {\tt by}&{\tt if}&{\tt not}&{\tt within}\\ |
|
409 {\tt cross}&{\tt in}&{\tt or}\\ |
|
410 {\tt diff}&{\tt inter}&{\tt symdiff}\\ |
|
411 {\tt div}&{\tt less}&{\tt then}\\ |
|
412 \end{tabular} |
|
413 |
|
414 \medskip |
|
415 |
|
416 Non-reserved keywords are described in following sections. |
|
417 |
|
418 All the keywords have fixed meaning, which will be explained on |
|
419 discussion of corresponding syntactic constructions, where the keywords |
|
420 are used. |
|
421 |
|
422 \subsection{Delimiters} |
|
423 |
|
424 A {\it delimiter} is either a single special character or a sequence of |
|
425 two special characters as follows: |
|
426 |
|
427 \medskip |
|
428 |
|
429 \noindent\hfil |
|
430 \begin{tabular}{@{}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}@{}} |
|
431 {\tt+}&{\tt\textasciicircum}&{\tt==}&{\tt!}&{\tt:}&{\tt)}\\ |
|
432 {\tt-}&{\tt\&}&{\tt>=}&{\tt\&\&}&{\tt;}&{\tt[}\\ |
|
433 {\tt*}&{\tt<}&{\tt>}&{\tt||}&{\tt:=}&{\tt|}\\ |
|
434 {\tt/}&{\tt<=}&{\tt<>}&{\tt.}&{\tt..}&{\tt\{}\\ |
|
435 {\tt**}&{\tt=}&{\tt!=}&{\tt,}&{\tt(}&{\tt\}}\\ |
|
436 \end{tabular} |
|
437 |
|
438 \medskip |
|
439 |
|
440 If the delimiter consists of two characters, there must be no spaces |
|
441 between the characters. |
|
442 |
|
443 All the delimiters have fixed meaning, which will be explained on |
|
444 discussion corresponding syntactic constructions, where the delimiters |
|
445 are used. |
|
446 |
|
447 \subsection{Comments} |
|
448 |
|
449 For documenting purposes the model description can be provided with |
|
450 {\it comments}, which may have two different forms. The first form is |
|
451 a {\it single-line comment}, which begins with the character {\tt\#} |
|
452 and extends until end of line. The second form is a {\it comment |
|
453 sequence}, which is a sequence of any characters enclosed within |
|
454 {\tt/*} and {\tt*/}. |
|
455 |
|
456 \medskip |
|
457 |
|
458 \noindent{\bf Examples} |
|
459 |
|
460 \medskip |
|
461 |
|
462 \noindent\verb|param n := 10; # This is a comment| |
|
463 |
|
464 \noindent\verb|/* This is another comment */| |
|
465 |
|
466 \medskip |
|
467 |
|
468 Comments are ignored by the model translator and can appear anywhere in |
|
469 the model description, where white-space characters are allowed. |
|
470 |
|
471 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
472 |
|
473 \newpage |
|
474 |
|
475 \section{Expressions} |
|
476 |
|
477 An {\it expression} is a rule for computing a value. In model |
|
478 description expressions are used as constituents of certain statements. |
|
479 |
|
480 In general case expressions consist of operands and operators. |
|
481 |
|
482 Depending on the type of the resultant value all expressions fall into |
|
483 the following categories: |
|
484 |
|
485 \begin{itemize} |
|
486 \item numeric expressions; |
|
487 \item symbolic expressions; |
|
488 \item indexing expressions; |
|
489 \item set expressions; |
|
490 \item logical expressions; |
|
491 \item linear expressions. |
|
492 \end{itemize} |
|
493 |
|
494 \subsection{Numeric expressions} |
|
495 |
|
496 A {\it numeric expression} is a rule for computing a single numeric |
|
497 value represented as a floating-point number. |
|
498 |
|
499 The primary numeric expression may be a numeric literal, dummy index, |
|
500 unsubscripted parameter, subscripted parameter, built-in function |
|
501 reference, iterated numeric expression, conditional numeric expression, |
|
502 or another numeric expression enclosed in parentheses. |
|
503 |
|
504 \medskip |
|
505 |
|
506 \noindent{\bf Examples} |
|
507 |
|
508 \medskip |
|
509 |
|
510 \noindent |
|
511 \begin{tabular}{@{}ll@{}} |
|
512 \verb|1.23|&(numeric literal)\\ |
|
513 \verb|j|&(dummy index)\\ |
|
514 \verb|time|&(unsubscripted parameter)\\ |
|
515 \verb|a['May 2003',j+1]|&(subscripted parameter)\\ |
|
516 \verb|abs(b[i,j])|&(function reference)\\ |
|
517 \verb|sum{i in S diff T} alpha[i] * b[i,j]|&(iterated expression)\\ |
|
518 \verb|if i in I then 2 * p else q[i+1]|&(conditional expression)\\ |
|
519 \verb|(b[i,j] + .5 * c)|&(parenthesized expression)\\ |
|
520 \end{tabular} |
|
521 |
|
522 \medskip |
|
523 |
|
524 More general numeric expressions containing two or more primary numeric |
|
525 expressions may be constructed by using certain arithmetic operators. |
|
526 |
|
527 \medskip |
|
528 |
|
529 \noindent{\bf Examples} |
|
530 |
|
531 \medskip |
|
532 |
|
533 \noindent\verb|j+1| |
|
534 |
|
535 \noindent\verb|2 * a[i-1,j+1] - b[i,j]| |
|
536 |
|
537 \noindent\verb|sum{j in J} a[i,j] * x[j] + sum{k in K} b[i,k] * x[k]| |
|
538 |
|
539 \noindent\verb|(if i in I then 2 * p else q[i+1]) / (a[i,j] + 1.5)| |
|
540 |
|
541 \subsubsection{Numeric literals} |
|
542 |
|
543 If the primary numeric expression is a numeric literal, the resultant |
|
544 value is obvious. |
|
545 |
|
546 \subsubsection{Dummy indices} |
|
547 |
|
548 If the primary numeric expression is a dummy index, the resultant value |
|
549 is current value assigned to that dummy index. |
|
550 |
|
551 \subsubsection{Unsubscripted parameters} |
|
552 |
|
553 If the primary numeric expression is an unsubscripted parameter (which |
|
554 must be 0-dimensional), the resultant value is the value of that |
|
555 parameter. |
|
556 |
|
557 \subsubsection{Subscripted parameters} |
|
558 |
|
559 The primary numeric expression, which refers to a subscripted parameter, |
|
560 has the following syntactic form: |
|
561 |
|
562 \medskip |
|
563 |
|
564 \noindent\hfil |
|
565 {\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]} |
|
566 |
|
567 \medskip |
|
568 |
|
569 \noindent where {\it name} is the symbolic name of the parameter, |
|
570 $i_1$, $i_2$, \dots, $i_n$ are subscripts. |
|
571 |
|
572 Each subscript must be a numeric or symbolic expression. The number of |
|
573 subscripts in the subscript list must be the same as the dimension of |
|
574 the parameter with which the subscript list is associated. |
|
575 |
|
576 Actual values of subscript expressions are used to identify |
|
577 a particular member of the parameter that determines the resultant |
|
578 value of the primary expression. |
|
579 |
|
580 \subsubsection{Function references} |
|
581 |
|
582 In MathProg there exist the following built-in functions which may be |
|
583 used in numeric expressions: |
|
584 |
|
585 \medskip |
|
586 |
|
587 \begin{tabular}{@{}p{96pt}p{222pt}@{}} |
|
588 {\tt abs(}$x${\tt)}&$|x|$, absolute value of $x$\\ |
|
589 {\tt atan(}$x${\tt)}&$\arctan x$, principal value of the arc tangent of |
|
590 $x$ (in radians)\\ |
|
591 {\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, principal value of the |
|
592 arc tangent of $y/x$ (in radians). In this case the signs of both |
|
593 arguments $y$ and $x$ are used to determine the quadrant of the |
|
594 resultant value\\ |
|
595 {\tt card(}$X${\tt)}&$|X|$, cardinality (the number of elements) of |
|
596 set $X$\\ |
|
597 {\tt ceil(}$x${\tt)}&$\lceil x\rceil$, smallest integer not less than |
|
598 $x$ (``ceiling of $x$'')\\ |
|
599 {\tt cos(}$x${\tt)}&$\cos x$, cosine of $x$ (in radians)\\ |
|
600 {\tt exp(}$x${\tt)}&$e^x$, base-$e$ exponential of $x$\\ |
|
601 {\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, largest integer not greater |
|
602 than $x$ (``floor of $x$'')\\ |
|
603 \end{tabular} |
|
604 |
|
605 \begin{tabular}{@{}p{96pt}p{222pt}@{}} |
|
606 {\tt gmtime()}&the number of seconds elapsed since 00:00:00~Jan~1, 1970, |
|
607 Coordinated Universal Time (for details see Subsection \ref{gmtime}, |
|
608 page \pageref{gmtime})\\ |
|
609 {\tt length(}$s${\tt)}&$|s|$, length of character string $s$\\ |
|
610 {\tt log(}$x${\tt)}&$\log x$, natural logarithm of $x$\\ |
|
611 {\tt log10(}$x${\tt)}&$\log_{10}x$, common (decimal) logarithm of $x$\\ |
|
612 {\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the largest |
|
613 of values $x_1$, $x_2$, \dots, $x_n$\\ |
|
614 {\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the smallest |
|
615 of values $x_1$, $x_2$, \dots, $x_n$\\ |
|
616 {\tt round(}$x${\tt)}&rounding $x$ to nearest integer\\ |
|
617 {\tt round(}$x${\tt,} $n${\tt)}&rounding $x$ to $n$ fractional decimal |
|
618 digits\\ |
|
619 {\tt sin(}$x${\tt)}&$\sin x$, sine of $x$ (in radians)\\ |
|
620 {\tt sqrt(}$x${\tt)}&$\sqrt{x}$, non-negative square root of $x$\\ |
|
621 {\tt str2time(}$s${\tt,} $f${\tt)}&converting character string $s$ to |
|
622 calendar time (for details see Subsection \ref{str2time}, page |
|
623 \pageref{str2time})\\ |
|
624 {\tt trunc(}$x${\tt)}&truncating $x$ to nearest integer\\ |
|
625 {\tt trunc(}$x${\tt,} $n${\tt)}&truncating $x$ to $n$ fractional |
|
626 decimal digits\\ |
|
627 {\tt Irand224()}&generating pseudo-random integer uniformly distributed |
|
628 in $[0,2^{24})$\\ |
|
629 {\tt Uniform01()}&generating pseudo-random number uniformly distributed |
|
630 in $[0,1)$\\ |
|
631 {\tt Uniform(}$a${\tt,} $b${\tt)}&generating pseudo-random number |
|
632 uniformly distributed in $[a,b)$\\ |
|
633 {\tt Normal01()}&generating Gaussian pseudo-random variate with |
|
634 $\mu=0$ and $\sigma=1$\\ |
|
635 {\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&generating Gaussian |
|
636 pseudo-random variate with given $\mu$ and $\sigma$\\ |
|
637 \end{tabular} |
|
638 |
|
639 \medskip |
|
640 |
|
641 Arguments of all built-in functions, except {\tt card}, {\tt length}, |
|
642 and {\tt str2time}, must be numeric expressions. The argument of |
|
643 {\tt card} must be a set expression. The argument of {\tt length} and |
|
644 both arguments of {\tt str2time} must be symbolic expressions. |
|
645 |
|
646 The resultant value of the numeric expression, which is a function |
|
647 reference, is the result of applying the function to its argument(s). |
|
648 |
|
649 Note that each pseudo-random generator function has a latent argument |
|
650 (i.e. some internal state), which is changed whenever the function has |
|
651 been applied. Thus, if the function is applied repeatedly even to |
|
652 identical arguments, due to the side effect different resultant values |
|
653 are always produced. |
|
654 |
|
655 \subsubsection{Iterated expressions} |
|
656 \label{itexpr} |
|
657 |
|
658 An {\it iterated numeric expression} is a primary numeric expression, |
|
659 which has the following syntactic form: |
|
660 |
|
661 \medskip |
|
662 |
|
663 \noindent\hfil |
|
664 {\it iterated-operator indexing-expression integrand} |
|
665 |
|
666 \medskip |
|
667 |
|
668 \noindent where {\it iterated-operator} is the symbolic name of the |
|
669 iterated operator to be performed (see below), {\it indexing-expression} |
|
670 is an indexing expression which introduces dummy indices and controls |
|
671 iterating, {\it integrand} is a numeric expression that participates in |
|
672 the operation. |
|
673 |
|
674 In MathProg there exist four iterated operators, which may be used in |
|
675 numeric expressions: |
|
676 |
|
677 \medskip |
|
678 |
|
679 \noindent\hfil |
|
680 \begin{tabular}{@{}lll@{}} |
|
681 {\tt sum}&summation&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta} |
|
682 f(i_1,\dots,i_n)$\\ |
|
683 {\tt prod}&production&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta} |
|
684 f(i_1,\dots,i_n)$\\ |
|
685 {\tt min}&minimum&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta} |
|
686 f(i_1,\dots,i_n)$\\ |
|
687 {\tt max}&maximum&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta} |
|
688 f(i_1,\dots,i_n)$\\ |
|
689 \end{tabular} |
|
690 |
|
691 \medskip |
|
692 |
|
693 \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in |
|
694 the indexing expression, $\Delta$ is the domain, a set of $n$-tuples |
|
695 specified by the indexing expression which defines particular values |
|
696 assigned to the dummy indices on performing the iterated operation, |
|
697 $f(i_1,\dots,i_n)$ is the integrand, a numeric expression whose |
|
698 resultant value depends on the dummy indices. |
|
699 |
|
700 The resultant value of an iterated numeric expression is the result of |
|
701 applying of the iterated operator to its integrand over all $n$-tuples |
|
702 contained in the domain. |
|
703 |
|
704 \subsubsection{Conditional expressions} |
|
705 \label{ifthen} |
|
706 |
|
707 A {\it conditional numeric expression} is a primary numeric expression, |
|
708 which has one of the following two syntactic forms: |
|
709 |
|
710 \medskip |
|
711 |
|
712 \noindent\hfil |
|
713 {\tt if} $b$ {\tt then} $x$ {\tt else} $y$ |
|
714 |
|
715 \medskip |
|
716 |
|
717 \noindent\hspace{126.5pt} |
|
718 {\tt if} $b$ {\tt then} $x$ |
|
719 |
|
720 \medskip |
|
721 |
|
722 \noindent where $b$ is an logical expression, $x$ and $y$ are numeric |
|
723 expressions. |
|
724 |
|
725 The resultant value of the conditional expression depends on the value |
|
726 of the logical expression that follows the keyword {\tt if}. If it |
|
727 takes on the value {\it true}, the value of the conditional expression |
|
728 is the value of the expression that follows the keyword {\tt then}. |
|
729 Otherwise, if the logical expression takes on the value {\it false}, |
|
730 the value of the conditional expression is the value of the expression |
|
731 that follows the keyword {\it else}. If the second, reduced form of the |
|
732 conditional expression is used and the logical expression takes on the |
|
733 value {\it false}, the resultant value of the conditional expression is |
|
734 zero. |
|
735 |
|
736 \subsubsection{Parenthesized expressions} |
|
737 |
|
738 Any numeric expression may be enclosed in parentheses that |
|
739 syntactically makes it a primary numeric expression. |
|
740 |
|
741 Parentheses may be used in numeric expressions, as in algebra, to |
|
742 specify the desired order in which operations are to be performed. |
|
743 Where parentheses are used, the expression within the parentheses is |
|
744 evaluated before the resultant value is used. |
|
745 |
|
746 The resultant value of the parenthesized expression is the same as the |
|
747 value of the expression enclosed within parentheses. |
|
748 |
|
749 \subsubsection{Arithmetic operators} |
|
750 |
|
751 In MathProg there exist the following arithmetic operators, which may |
|
752 be used in numeric expressions: |
|
753 |
|
754 \medskip |
|
755 |
|
756 \begin{tabular}{@{}p{96pt}p{222pt}@{}} |
|
757 {\tt +} $x$&unary plus\\ |
|
758 {\tt -} $x$&unary minus\\ |
|
759 $x$ {\tt +} $y$&addition\\ |
|
760 $x$ {\tt -} $y$&subtraction\\ |
|
761 $x$ {\tt less} $y$&positive difference (if $x<y$ then 0 else $x-y$)\\ |
|
762 $x$ {\tt *} $y$&multiplication\\ |
|
763 $x$ {\tt /} $y$&division\\ |
|
764 $x$ {\tt div} $y$"ient of exact division\\ |
|
765 $x$ {\tt mod} $y$&remainder of exact division\\ |
|
766 $x$ {\tt **} $y$, $x$ {\tt\textasciicircum} $y$&exponentiation (raising |
|
767 to power)\\ |
|
768 \end{tabular} |
|
769 |
|
770 \medskip |
|
771 |
|
772 \noindent where $x$ and $y$ are numeric expressions. |
|
773 |
|
774 If the expression includes more than one arithmetic operator, all |
|
775 operators are performed from left to right according to the hierarchy |
|
776 of operations (see below) with the only exception that the |
|
777 exponentiaion operators are performed from right to left. |
|
778 |
|
779 The resultant value of the expression, which contains arithmetic |
|
780 operators, is the result of applying the operators to their operands. |
|
781 |
|
782 \subsubsection{Hierarchy of operations} |
|
783 \label{hierarchy} |
|
784 |
|
785 The following list shows the hierarchy of operations in numeric |
|
786 expressions: |
|
787 |
|
788 \medskip |
|
789 |
|
790 \noindent\hfil |
|
791 \begin{tabular}{@{}ll@{}} |
|
792 Operation&Hierarchy\\ |
|
793 \hline |
|
794 Evaluation of functions ({\tt abs}, {\tt ceil}, etc.)&1st\\ |
|
795 Exponentiation ({\tt**}, {\tt\textasciicircum})&2nd\\ |
|
796 Unary plus and minus ({\tt+}, {\tt-})&3rd\\ |
|
797 Multiplication and division ({\tt*}, {\tt/}, {\tt div}, {\tt mod})&4th\\ |
|
798 Iterated operations ({\tt sum}, {\tt prod}, {\tt min}, {\tt max})&5th\\ |
|
799 Addition and subtraction ({\tt+}, {\tt-}, {\tt less})&6th\\ |
|
800 Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})& |
|
801 7th\\ |
|
802 \end{tabular} |
|
803 |
|
804 \medskip |
|
805 |
|
806 This hierarchy is used to determine which of two consecutive operations |
|
807 is performed first. If the first operator is higher than or equal to |
|
808 the second, the first operation is performed. If it is not, the second |
|
809 operator is compared to the third, etc. When the end of the expression |
|
810 is reached, all of the remaining operations are performed in the |
|
811 reverse order. |
|
812 |
|
813 \newpage |
|
814 |
|
815 \subsection{Symbolic expressions} |
|
816 |
|
817 A {\it symbolic expression} is a rule for computing a single symbolic |
|
818 value represented as a character string. |
|
819 |
|
820 The primary symbolic expression may be a string literal, dummy index, |
|
821 unsubscripted parameter, subscripted parameter, built-in function |
|
822 reference, conditional symbolic expression, or another symbolic |
|
823 expression enclosed in parentheses. |
|
824 |
|
825 It is also allowed to use a numeric expression as the primary symbolic |
|
826 expression, in which case the resultant value of the numeric expression |
|
827 is automatically converted to the symbolic type. |
|
828 |
|
829 \medskip |
|
830 |
|
831 \noindent{\bf Examples} |
|
832 |
|
833 \medskip |
|
834 |
|
835 \noindent |
|
836 \begin{tabular}{@{}ll@{}} |
|
837 \verb|'May 2003'|&(string literal)\\ |
|
838 \verb|j|&(dummy index)\\ |
|
839 \verb|p|&(unsubscripted parameter)\\ |
|
840 \verb|s['abc',j+1]|&(subscripted parameter)\\ |
|
841 \verb|substr(name[i],k+1,3)|&(function reference)\\ |
|
842 \verb|if i in I then s[i,j] else t[i+1]|&(conditional expression)\\ |
|
843 \verb|((10 * b[i,j]) & '.bis')|&(parenthesized expression)\\ |
|
844 \end{tabular} |
|
845 |
|
846 \medskip |
|
847 |
|
848 More general symbolic expressions containing two or more primary |
|
849 symbolic expressions may be constructed by using the concatenation |
|
850 operator. |
|
851 |
|
852 \medskip |
|
853 |
|
854 \noindent{\bf Examples} |
|
855 |
|
856 \medskip |
|
857 |
|
858 \noindent\verb|'abc[' & i & ',' & j & ']'| |
|
859 |
|
860 \noindent\verb|"from " & city[i] & " to " & city[j]| |
|
861 |
|
862 \medskip |
|
863 |
|
864 The principles of evaluation of symbolic expressions are completely |
|
865 analogous to the ones given for numeric expressions (see above). |
|
866 |
|
867 \subsubsection{Function references} |
|
868 |
|
869 In MathProg there exist the following built-in functions which may be |
|
870 used in symbolic expressions: |
|
871 |
|
872 \medskip |
|
873 |
|
874 \begin{tabular}{@{}p{96pt}p{222pt}@{}} |
|
875 {\tt substr(}$s${\tt,} $x${\tt)}&substring of $s$ starting from |
|
876 position $x$\\ |
|
877 {\tt substr(}$s${\tt,} $x${\tt,} $y${\tt)}&substring of $s$ starting |
|
878 from position $x$ and having length $y$\\ |
|
879 {\tt time2str(}$t${\tt,} $f${\tt)}&converting calendar time to |
|
880 character string (for details see Subsection \ref{time2str}, page |
|
881 \pageref{time2str})\\ |
|
882 \end{tabular} |
|
883 |
|
884 \medskip |
|
885 |
|
886 The first argument of {\tt substr} must be a symbolic expression while |
|
887 its second and optional third arguments must be numeric expressions. |
|
888 |
|
889 The first argument of {\tt time2str} must be a numeric expression, and |
|
890 its second argument must be a symbolic expression. |
|
891 |
|
892 The resultant value of the symbolic expression, which is a function |
|
893 reference, is the result of applying the function to its arguments. |
|
894 |
|
895 \subsubsection{Symbolic operators} |
|
896 |
|
897 Currently in MathProg there exists the only symbolic operator: |
|
898 |
|
899 \medskip |
|
900 |
|
901 \noindent\hfil |
|
902 {\tt s \& t} |
|
903 |
|
904 \medskip |
|
905 |
|
906 \noindent where $s$ and $t$ are symbolic expressions. This operator |
|
907 means concatenation of its two symbolic operands, which are character |
|
908 strings. |
|
909 |
|
910 \subsubsection{Hierarchy of operations} |
|
911 |
|
912 The following list shows the hierarchy of operations in symbolic |
|
913 expressions: |
|
914 |
|
915 \medskip |
|
916 |
|
917 \noindent\hfil |
|
918 \begin{tabular}{@{}ll@{}} |
|
919 Operation&Hierarchy\\ |
|
920 \hline |
|
921 Evaluation of numeric operations&1st-7th\\ |
|
922 Concatenation ({\tt\&})&8th\\ |
|
923 Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})& |
|
924 7th\\ |
|
925 \end{tabular} |
|
926 |
|
927 \medskip |
|
928 |
|
929 This hierarchy has the same meaning as was explained above for numeric |
|
930 expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}). |
|
931 |
|
932 \subsection{Indexing expressions and dummy indices} |
|
933 \label{indexing} |
|
934 |
|
935 An {\it indexing expression} is an auxiliary construction, which |
|
936 specifies a plain set of $n$-tuples and introduces dummy indices. It |
|
937 has two syntactic forms: |
|
938 |
|
939 \medskip |
|
940 |
|
941 \noindent\hspace{73.5pt} |
|
942 {\tt\{} {\it entry}$_1${\tt,} {\it entry}$_2${\tt,} \dots{\tt,} |
|
943 {\it entry}$_m$ {\tt\}} |
|
944 |
|
945 \medskip |
|
946 |
|
947 \noindent\hfil |
|
948 {\tt\{} {\it entry}$_1${\tt,} {\it entry}$_2${\tt,} \dots{\tt,} |
|
949 {\it entry}$_m$ {\tt:} {\it predicate} {\tt\}} |
|
950 |
|
951 \medskip |
|
952 |
|
953 \noindent where {\it entry}{$_1$}, {\it entry}{$_2$}, \dots, |
|
954 {\it entry}{$_m$} are indexing entries, {\it predicate} is a logical |
|
955 expression that specifies an optional predicate (logical condition). |
|
956 |
|
957 Each {\it indexing entry} in the indexing expression has one of the |
|
958 following three forms: |
|
959 |
|
960 \medskip |
|
961 |
|
962 \noindent\hspace{123pt} |
|
963 $i$ {\tt in} $S$ |
|
964 |
|
965 \medskip |
|
966 |
|
967 \noindent\hfil |
|
968 {\tt(}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}$i_n${\tt)} {\tt in} $S$ |
|
969 |
|
970 \medskip |
|
971 |
|
972 \noindent\hspace{123pt} |
|
973 $S$ |
|
974 |
|
975 \medskip |
|
976 |
|
977 \noindent where $i_1$, $i_2$, \dots, $i_n$ are indices, $S$ is a set |
|
978 expression (discussed in the next section) that specifies the basic set. |
|
979 |
|
980 The number of indices in the indexing entry must be the same as the |
|
981 dimension of the basic set $S$, i.e. if $S$ consists of 1-tuples, the |
|
982 first form must be used, and if $S$ consists of $n$-tuples, where |
|
983 $n>1$, the second form must be used. |
|
984 |
|
985 If the first form of the indexing entry is used, the index $i$ can be |
|
986 a dummy index only (see below). If the second form is used, the indices |
|
987 $i_1$, $i_2$, \dots, $i_n$ can be either dummy indices or some numeric |
|
988 or symbolic expressions, where at least one index must be a dummy index. |
|
989 The third, reduced form of the indexing entry has the same effect as if |
|
990 there were $i$ (if $S$ is 1-dimensional) or $i_1$, $i_2$, \dots, $i_n$ |
|
991 (if $S$ is $n$-dimensional) all specified as dummy indices. |
|
992 |
|
993 A {\it dummy index} is an auxiliary model object, which acts like an |
|
994 individual variable. Values assigned to dummy indices are components of |
|
995 $n$-tuples from basic sets, i.e. some numeric and symbolic quantities. |
|
996 |
|
997 For referencing purposes dummy indices can be provided with symbolic |
|
998 names. However, unlike other model objects (sets, parameters, etc.) |
|
999 dummy indices need not be explicitly declared. Each {\it undeclared} |
|
1000 symbolic name being used in the indexing position of an indexing entry |
|
1001 is recognized as the symbolic name of corresponding dummy index. |
|
1002 |
|
1003 Symbolic names of dummy indices are valid only within the scope of the |
|
1004 indexing expression, where the dummy indices were introduced. Beyond |
|
1005 the scope the dummy indices are completely inaccessible, so the same |
|
1006 symbolic names may be used for other purposes, in particular, to |
|
1007 represent dummy indices in other indexing expressions. |
|
1008 |
|
1009 The scope of indexing expression, where implicit declarations of dummy |
|
1010 indices are valid, depends on the context, in which the indexing |
|
1011 expression is used: |
|
1012 |
|
1013 \begin{enumerate} |
|
1014 \item If the indexing expression is used in iterated operator, its |
|
1015 scope extends until the end of the integrand. |
|
1016 \item If the indexing expression is used as a primary set expression, |
|
1017 its scope extends until the end of that indexing expression. |
|
1018 \item If the indexing expression is used to define the subscript domain |
|
1019 in declarations of some model objects, its scope extends until the end |
|
1020 of the corresponding statement. |
|
1021 \end{enumerate} |
|
1022 |
|
1023 The indexing mechanism implemented by means of indexing expressions is |
|
1024 best explained by some examples discussed below. |
|
1025 |
|
1026 Let there be given three sets: |
|
1027 |
|
1028 \medskip |
|
1029 |
|
1030 \noindent\hspace{33.5pt} |
|
1031 $A=\{4,7,9\}$, |
|
1032 |
|
1033 \medskip |
|
1034 |
|
1035 \noindent\hfil |
|
1036 $B=\{(1,Jan),(1,Feb),(2,Mar),(2,Apr),(3,May),(3,Jun)\}$, |
|
1037 |
|
1038 \medskip |
|
1039 |
|
1040 \noindent\hspace{33.5pt} |
|
1041 $C=\{a,b,c\}$, |
|
1042 |
|
1043 \medskip |
|
1044 |
|
1045 \noindent where $A$ and $C$ consist of 1-tuples (singlets), $B$ |
|
1046 consists of 2-tuples (doublets). Consider the following indexing |
|
1047 expression: |
|
1048 |
|
1049 \medskip |
|
1050 |
|
1051 \noindent\hfil |
|
1052 {\tt\{i in A, (j,k) in B, l in C\}} |
|
1053 |
|
1054 \medskip |
|
1055 |
|
1056 \noindent where {\tt i}, {\tt j}, {\tt k}, and {\tt l} are dummy |
|
1057 indices. |
|
1058 |
|
1059 Although MathProg is not a procedural language, for any indexing |
|
1060 expression an equivalent algorithmic description can be given. In |
|
1061 particular, the algorithmic description of the indexing expression |
|
1062 above could look like follows: |
|
1063 |
|
1064 \medskip |
|
1065 |
|
1066 \noindent\hfil |
|
1067 \begin{tabular}{@{}l@{}} |
|
1068 {\bf for all} $i\in A$ {\bf do}\\ |
|
1069 \hspace{12pt}{\bf for all} $(j,k)\in B$ {\bf do}\\ |
|
1070 \hspace{24pt}{\bf for all} $l\in C$ {\bf do}\\ |
|
1071 \hspace{36pt}{\it action};\\ |
|
1072 \end{tabular} |
|
1073 |
|
1074 \newpage |
|
1075 |
|
1076 \noindent where the dummy indices $i$, $j$, $k$, $l$ are consecutively |
|
1077 assigned corresponding components of $n$-tuples from the basic sets $A$, |
|
1078 $B$, $C$, and {\it action} is some action that depends on the context, |
|
1079 where the indexing expression is used. For example, if the action were |
|
1080 printing current values of dummy indices, the printout would look like |
|
1081 follows: |
|
1082 |
|
1083 \medskip |
|
1084 |
|
1085 \noindent\hfil |
|
1086 \begin{tabular}{@{}llll@{}} |
|
1087 $i=4$&$j=1$&$k=Jan$&$l=a$\\ |
|
1088 $i=4$&$j=1$&$k=Jan$&$l=b$\\ |
|
1089 $i=4$&$j=1$&$k=Jan$&$l=c$\\ |
|
1090 $i=4$&$j=1$&$k=Feb$&$l=a$\\ |
|
1091 $i=4$&$j=1$&$k=Feb$&$l=b$\\ |
|
1092 \multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ |
|
1093 $i=9$&$j=3$&$k=Jun$&$l=b$\\ |
|
1094 $i=9$&$j=3$&$k=Jun$&$l=c$\\ |
|
1095 \end{tabular} |
|
1096 |
|
1097 \medskip |
|
1098 |
|
1099 Let the example indexing expression be used in the following iterated |
|
1100 operation: |
|
1101 |
|
1102 \medskip |
|
1103 |
|
1104 \noindent\hfil |
|
1105 {\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]} |
|
1106 |
|
1107 \medskip |
|
1108 |
|
1109 \noindent where {\tt p} is a 4-dimensional numeric parameter or some |
|
1110 numeric expression whose resultant value depends on {\tt i}, {\tt j}, |
|
1111 {\tt k}, and {\tt l}. In this case the action is summation, so the |
|
1112 resultant value of the primary numeric expression is: |
|
1113 $$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$ |
|
1114 |
|
1115 Now let the example indexing expression be used as a primary set |
|
1116 expression. In this case the action is gathering all 4-tuples |
|
1117 (quadruplets) of the form $(i,j,k,l)$ in one set, so the resultant |
|
1118 value of such operation is simply the Cartesian product of the basic |
|
1119 sets: |
|
1120 $$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$ |
|
1121 Note that in this case the same indexing expression might be written in |
|
1122 the reduced form: |
|
1123 |
|
1124 \medskip |
|
1125 |
|
1126 \noindent\hfil |
|
1127 {\tt\{A, B, C\}} |
|
1128 |
|
1129 \medskip |
|
1130 |
|
1131 \noindent because the dummy indices $i$, $j$, $k$, and $l$ are not |
|
1132 referenced and therefore their symbolic names need not be specified. |
|
1133 |
|
1134 Finally, let the example indexing expression be used as the subscript |
|
1135 domain in the declaration of a 4-dimensional model object, say, |
|
1136 a numeric parameter: |
|
1137 |
|
1138 \medskip |
|
1139 |
|
1140 \noindent\hfil |
|
1141 {\tt param p\{i in A, (j,k) in B, l in C\}} \dots {\tt;} |
|
1142 |
|
1143 \medskip |
|
1144 |
|
1145 \noindent In this case the action is generating the parameter members, |
|
1146 where each member has the form $p[i,j,k,l]$. |
|
1147 |
|
1148 As was said above, some indices in the second form of indexing entries |
|
1149 may be numeric or symbolic expressions, not only dummy indices. In this |
|
1150 case resultant values of such expressions play role of some logical |
|
1151 conditions to select only that $n$-tuples from the Cartesian product of |
|
1152 basic sets that satisfy these conditions. |
|
1153 |
|
1154 Consider, for example, the following indexing expression: |
|
1155 |
|
1156 \medskip |
|
1157 |
|
1158 \noindent\hfil |
|
1159 {\tt\{i in A, (i-1,k) in B, l in C\}} |
|
1160 |
|
1161 \medskip |
|
1162 |
|
1163 \noindent where {\tt i}, {\tt k}, {\tt l} are dummy indices, and |
|
1164 {\tt i-1} is a numeric expression. The algorithmic decsription of this |
|
1165 indexing expression is the following: |
|
1166 |
|
1167 \medskip |
|
1168 |
|
1169 \noindent\hfil |
|
1170 \begin{tabular}{@{}l@{}} |
|
1171 {\bf for all} $i\in A$ {\bf do}\\ |
|
1172 \hspace{12pt}{\bf for all} $(j,k)\in B$ {\bf and} $j=i-1$ {\bf do}\\ |
|
1173 \hspace{24pt}{\bf for all} $l\in C$ {\bf do}\\ |
|
1174 \hspace{36pt}{\it action};\\ |
|
1175 \end{tabular} |
|
1176 |
|
1177 \medskip |
|
1178 |
|
1179 \noindent Thus, if this indexing expression were used as a primary set |
|
1180 expression, the resultant set would be the following: |
|
1181 $$\{(4,May,a),(4,May,b),(4,May,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$ |
|
1182 Should note that in this case the resultant set consists of 3-tuples, |
|
1183 not of 4-tuples, because in the indexing expression there is no dummy |
|
1184 index that corresponds to the first component of 2-tuples from the set |
|
1185 $B$. |
|
1186 |
|
1187 The general rule is: the number of components of $n$-tuples defined by |
|
1188 an indexing expression is the same as the number of dummy indices in |
|
1189 that expression, where the correspondence between dummy indices and |
|
1190 components on $n$-tuples in the resultant set is positional, i.e. the |
|
1191 first dummy index corresponds to the first component, the second dummy |
|
1192 index corresponds to the second component, etc. |
|
1193 |
|
1194 In some cases it is needed to select a subset from the Cartesian |
|
1195 product of some sets. This may be attained by using an optional logical |
|
1196 predicate, which is specified in the indexing expression. |
|
1197 |
|
1198 Consider, for example, the following indexing expression: |
|
1199 |
|
1200 \medskip |
|
1201 |
|
1202 \noindent\hfil |
|
1203 {\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}} |
|
1204 |
|
1205 \medskip |
|
1206 |
|
1207 \noindent where the logical expression following the colon is a |
|
1208 predicate. The algorithmic description of this indexing expression is |
|
1209 the following: |
|
1210 |
|
1211 \medskip |
|
1212 |
|
1213 \noindent\hfil |
|
1214 \begin{tabular}{@{}l@{}} |
|
1215 {\bf for all} $i\in A$ {\bf do}\\ |
|
1216 \hspace{12pt}{\bf for all} $(j,k)\in B$ {\bf do}\\ |
|
1217 \hspace{24pt}{\bf for all} $l\in C$ {\bf do}\\ |
|
1218 \hspace{36pt}{\bf if} $i\leq 5$ {\bf and} $l\neq`Mar'$ {\bf then}\\ |
|
1219 \hspace{48pt}{\it action};\\ |
|
1220 \end{tabular} |
|
1221 |
|
1222 \medskip |
|
1223 |
|
1224 \noindent Thus, if this indexing expression were used as a primary set |
|
1225 expression, the resultant set would be the following: |
|
1226 $$\{(4,1,Jan,a),(4,1,Feb,a),(4,2,Apr,a),\dots,(4,3,Jun,c)\}.$$ |
|
1227 |
|
1228 If no predicate is specified in the indexing expression, one, which |
|
1229 takes on the value {\it true}, is assumed. |
|
1230 |
|
1231 \subsection{Set expressions} |
|
1232 |
|
1233 A {\it set expression} is a rule for computing an elemental set, i.e. |
|
1234 a collection of $n$-tuples, where components of $n$-tuples are numeric |
|
1235 and symbolic quantities. |
|
1236 |
|
1237 The primary set expression may be a literal set, unsubscripted set, |
|
1238 subscripted set, ``arithmetic'' set, indexing expression, iterated set |
|
1239 expression, conditional set expression, or another set expression |
|
1240 enclosed in parentheses. |
|
1241 |
|
1242 \medskip |
|
1243 |
|
1244 \noindent{\bf Examples} |
|
1245 |
|
1246 \medskip |
|
1247 |
|
1248 \noindent |
|
1249 \begin{tabular}{@{}ll@{}} |
|
1250 \verb|{(123,'aa'), (i,'bb'), (j-1,'cc')}|&(literal set)\\ |
|
1251 \verb|I|&(unsubscripted set)\\ |
|
1252 \verb|S[i-1,j+1]|&(subscripted set)\\ |
|
1253 \verb|1..t-1 by 2|&(``arithmetic'' set)\\ |
|
1254 \verb|{t in 1..T, (t+1,j) in S: (t,j) in F}|&(indexing expression)\\ |
|
1255 \verb|setof{i in I, j in J}(i+1,j-1)|&(iterated expression)\\ |
|
1256 \verb|if i < j then S[i] else F diff S[j]|&(conditional expression)\\ |
|
1257 \verb|(1..10 union 21..30)|&(parenthesized expression)\\ |
|
1258 \end{tabular} |
|
1259 |
|
1260 \medskip |
|
1261 |
|
1262 More general set expressions containing two or more primary set |
|
1263 expressions may be constructed by using certain set operators. |
|
1264 |
|
1265 \medskip |
|
1266 |
|
1267 \noindent{\bf Examples} |
|
1268 |
|
1269 \medskip |
|
1270 |
|
1271 \noindent\verb|(A union B) inter (I cross J)| |
|
1272 |
|
1273 \noindent |
|
1274 \verb|1..10 cross (if i < j then {'a', 'b', 'c'} else {'d', 'e', 'f'})| |
|
1275 |
|
1276 \subsubsection{Literal sets} |
|
1277 |
|
1278 A {\it literal set} is a primary set expression, which has the |
|
1279 following two syntactic forms: |
|
1280 |
|
1281 \medskip |
|
1282 |
|
1283 \noindent\hspace{39pt} |
|
1284 {\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}} |
|
1285 |
|
1286 \medskip |
|
1287 |
|
1288 \noindent\hfil |
|
1289 {\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),} |
|
1290 {\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,} |
|
1291 {\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}} |
|
1292 |
|
1293 \medskip |
|
1294 |
|
1295 \noindent where $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ are |
|
1296 numeric or symbolic expressions. |
|
1297 |
|
1298 If the first form is used, the resultant set consists of 1-tuples |
|
1299 (singlets) enumerated within the curly braces. It is allowed to specify |
|
1300 an empty set as {\tt\{\ \}}, which has no 1-tuples. If the second form |
|
1301 is used, the resultant set consists of $n$-tuples enumerated within the |
|
1302 curly braces, where a particular $n$-tuple consists of corresponding |
|
1303 components enumerated within the parentheses. All $n$-tuples must have |
|
1304 the same number of components. |
|
1305 |
|
1306 \subsubsection{Unsubscripted sets} |
|
1307 |
|
1308 If the primary set expression is an unsubscripted set (which must be |
|
1309 0-dimen\-sional), the resultant set is an elemental set associated with |
|
1310 the corresponding set object. |
|
1311 |
|
1312 \newpage |
|
1313 |
|
1314 \subsubsection{Subscripted sets} |
|
1315 |
|
1316 The primary set expression, which refers to a subscripted set, has the |
|
1317 following syntactic form: |
|
1318 |
|
1319 \medskip |
|
1320 |
|
1321 \noindent\hfil |
|
1322 {\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]} |
|
1323 |
|
1324 \medskip |
|
1325 |
|
1326 \noindent where {\it name} is the symbolic name of the set object, |
|
1327 $i_1$, $i_2$, \dots, $i_n$ are subscripts. |
|
1328 |
|
1329 Each subscript must be a numeric or symbolic expression. The number of |
|
1330 subscripts in the subscript list must be the same as the dimension of |
|
1331 the set object with which the subscript list is associated. |
|
1332 |
|
1333 Actual values of subscript expressions are used to identify a |
|
1334 particular member of the set object that determines the resultant set. |
|
1335 |
|
1336 \subsubsection{``Arithmetic'' sets} |
|
1337 |
|
1338 The primary set expression, which is an ``arithmetic'' set, has the |
|
1339 following two syntactic forms: |
|
1340 |
|
1341 \medskip |
|
1342 |
|
1343 \noindent\hfil |
|
1344 $t_0$ {\tt..} $t_1$ {\tt by} $\delta t$ |
|
1345 |
|
1346 \medskip |
|
1347 |
|
1348 \noindent\hspace{138.5pt} |
|
1349 $t_0$ {\tt..} $t_1$ |
|
1350 |
|
1351 \medskip |
|
1352 |
|
1353 \noindent where $t_0$, $t_1$, and $\delta t$ are numeric expressions |
|
1354 (the value of $\delta t$ must not be zero). The second form is |
|
1355 equivalent to the first form, where $\delta t=1$. |
|
1356 |
|
1357 If $\delta t>0$, the resultant set is determined as follows: |
|
1358 $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$ |
|
1359 Otherwise, if $\delta t<0$, the resultant set is determined as follows: |
|
1360 $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$ |
|
1361 |
|
1362 \subsubsection{Indexing expressions} |
|
1363 |
|
1364 If the primary set expression is an indexing expression, the resultant |
|
1365 set is determined as described above in Subsection \ref{indexing}, page |
|
1366 \pageref{indexing}. |
|
1367 |
|
1368 \subsubsection{Iterated expressions} |
|
1369 |
|
1370 An {\it iterated set expression} is a primary set expression, which has |
|
1371 the following syntactic form: |
|
1372 |
|
1373 \medskip |
|
1374 |
|
1375 \noindent\hfil |
|
1376 {\tt setof} {\it indexing-expression} {\it integrand} |
|
1377 |
|
1378 \medskip |
|
1379 |
|
1380 \noindent where {\it indexing-expression} is an indexing expression, |
|
1381 which introduces dummy indices and controls iterating, {\it integrand} |
|
1382 is either a single numeric or symbolic expression or a list of numeric |
|
1383 and symbolic expressions separated by commae and enclosed in |
|
1384 parentheses. |
|
1385 |
|
1386 If the integrand is a single numeric or symbolic expression, the |
|
1387 resultant set consists of 1-tuples and is determined as follows: |
|
1388 $$\{x:(i_1,\dots,i_n)\in\Delta\},$$ |
|
1389 \noindent where $x$ is a value of the integrand, $i_1$, \dots, $i_n$ |
|
1390 are dummy indices introduced in the indexing expression, $\Delta$ is |
|
1391 the domain, a set of $n$-tuples specified by the indexing expression, |
|
1392 which defines particular values assigned to the dummy indices on |
|
1393 performing the iterated operation. |
|
1394 |
|
1395 If the integrand is a list containing $m$ numeric and symbolic |
|
1396 expressions, the resultant set consists of $m$-tuples and is determined |
|
1397 as follows: |
|
1398 $$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$ |
|
1399 where $x_1$, \dots, $x_m$ are values of the expressions in the |
|
1400 integrand list, $i_1$, \dots, $i_n$ and $\Delta$ have the same meaning |
|
1401 as above. |
|
1402 |
|
1403 \subsubsection{Conditional expressions} |
|
1404 |
|
1405 A {\it conditional set expression} is a primary set expression that has |
|
1406 the following syntactic form: |
|
1407 |
|
1408 \medskip |
|
1409 |
|
1410 \noindent\hfil |
|
1411 {\tt if} $b$ {\tt then} $X$ {\tt else} $Y$ |
|
1412 |
|
1413 \medskip |
|
1414 |
|
1415 \noindent where $b$ is an logical expression, $X$ and $Y$ are set |
|
1416 expressions, which must define sets of the same dimension. |
|
1417 |
|
1418 The resultant value of the conditional expression depends on the value |
|
1419 of the logical expression that follows the keyword {\tt if}. If it |
|
1420 takes on the value {\it true}, the resultant set is the value of the |
|
1421 expression that follows the keyword {\tt then}. Otherwise, if the |
|
1422 logical expression takes on the value {\it false}, the resultant set is |
|
1423 the value of the expression that follows the keyword {\tt else}. |
|
1424 |
|
1425 \subsubsection{Parenthesized expressions} |
|
1426 |
|
1427 Any set expression may be enclosed in parentheses that syntactically |
|
1428 makes it a primary set expression. |
|
1429 |
|
1430 Parentheses may be used in set expressions, as in algebra, to specify |
|
1431 the desired order in which operations are to be performed. Where |
|
1432 parentheses are used, the expression within the parentheses is |
|
1433 evaluated before the resultant value is used. |
|
1434 |
|
1435 The resultant value of the parenthesized expression is the same as the |
|
1436 value of the expression enclosed within parentheses. |
|
1437 |
|
1438 \subsubsection{Set operators} |
|
1439 |
|
1440 In MathProg there exist the following set operators, which may be used |
|
1441 in set expressions: |
|
1442 |
|
1443 \medskip |
|
1444 |
|
1445 \begin{tabular}{@{}p{96pt}p{222pt}@{}} |
|
1446 $X$ {\tt union} $Y$&union $X\cup Y$\\ |
|
1447 $X$ {\tt diff} $Y$&difference $X\backslash Y$\\ |
|
1448 $X$ {\tt symdiff} $Y$&symmetric difference $X\oplus Y$\\ |
|
1449 $X$ {\tt inter} $Y$&intersection $X\cap Y$\\ |
|
1450 $X$ {\tt cross} $Y$&cross (Cartesian) product $X\times Y$\\ |
|
1451 \end{tabular} |
|
1452 |
|
1453 \medskip |
|
1454 |
|
1455 \noindent where $X$ and Y are set expressions, which must define sets |
|
1456 of the identical dimension (except the Cartesian product). |
|
1457 |
|
1458 If the expression includes more than one set operator, all operators |
|
1459 are performed from left to right according to the hierarchy of |
|
1460 operations (see below). |
|
1461 |
|
1462 The resultant value of the expression, which contains set operators, is |
|
1463 the result of applying the operators to their operands. |
|
1464 |
|
1465 The dimension of the resultant set, i.e. the dimension of $n$-tuples, |
|
1466 of which the resultant set consists of, is the same as the dimension of |
|
1467 the operands, except the Cartesian product, where the dimension of the |
|
1468 resultant set is the sum of the dimensions of its operands. |
|
1469 |
|
1470 \subsubsection{Hierarchy of operations} |
|
1471 |
|
1472 The following list shows the hierarchy of operations in set |
|
1473 expressions: |
|
1474 |
|
1475 \medskip |
|
1476 |
|
1477 \noindent\hfil |
|
1478 \begin{tabular}{@{}ll@{}} |
|
1479 Operation&Hierarchy\\ |
|
1480 \hline |
|
1481 Evaluation of numeric operations&1st-7th\\ |
|
1482 Evaluation of symbolic operations&8th-9th\\ |
|
1483 Evaluation of iterated or ``arithmetic'' set ({\tt setof}, {\tt..})& |
|
1484 10th\\ |
|
1485 Cartesian product ({\tt cross})&11th\\ |
|
1486 Intersection ({\tt inter})&12th\\ |
|
1487 Union and difference ({\tt union}, {\tt diff}, {\tt symdiff})&13th\\ |
|
1488 Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})& |
|
1489 14th\\ |
|
1490 \end{tabular} |
|
1491 |
|
1492 \medskip |
|
1493 |
|
1494 This hierarchy has the same meaning as was explained above for numeric |
|
1495 expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}). |
|
1496 |
|
1497 \subsection{Logical expressions} |
|
1498 |
|
1499 A {\it logical expression} is a rule for computing a single logical |
|
1500 value, which can be either {\it true} or {\it false}. |
|
1501 |
|
1502 The primary logical expression may be a numeric expression, relational |
|
1503 expression, iterated logical expression, or another logical expression |
|
1504 enclosed in parentheses. |
|
1505 |
|
1506 \medskip |
|
1507 |
|
1508 \noindent{\bf Examples} |
|
1509 |
|
1510 \medskip |
|
1511 |
|
1512 \noindent |
|
1513 \begin{tabular}{@{}ll@{}} |
|
1514 \verb|i+1|&(numeric expression)\\ |
|
1515 \verb|a[i,j] < 1.5|&(relational expression)\\ |
|
1516 \verb|s[i+1,j-1] <> 'Mar'|&(relational expression)\\ |
|
1517 \verb|(i+1,'Jan') not in I cross J|&(relational expression)\\ |
|
1518 \verb|S union T within A[i] inter B[j]|&(relational expression)\\ |
|
1519 \verb|forall{i in I, j in J} a[i,j] < .5 * b|&(iterated expression)\\ |
|
1520 \verb|(a[i,j] < 1.5 or b[i] >= a[i,j])|&(parenthesized expression)\\ |
|
1521 \end{tabular} |
|
1522 |
|
1523 \medskip |
|
1524 |
|
1525 More general logical expressions containing two or more primary logical |
|
1526 expressions may be constructed by using certain logical operators. |
|
1527 |
|
1528 \newpage |
|
1529 |
|
1530 \noindent{\bf Examples} |
|
1531 |
|
1532 \medskip |
|
1533 |
|
1534 \noindent\verb|not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S| |
|
1535 |
|
1536 \noindent\verb|(i,j) in S or (i,j) not in T diff U| |
|
1537 |
|
1538 \subsubsection{Numeric expressions} |
|
1539 |
|
1540 The resultant value of the primary logical expression, which is a |
|
1541 numeric expression, is {\it true}, if the resultant value of the |
|
1542 numeric expression is non-zero. Otherwise the resultant value of the |
|
1543 logical expression is {\it false}. |
|
1544 |
|
1545 \subsubsection{Relational operators} |
|
1546 |
|
1547 In MathProg there exist the following relational operators, which may |
|
1548 be used in logical expressions: |
|
1549 |
|
1550 \medskip |
|
1551 |
|
1552 \begin{tabular}{@{}ll@{}} |
|
1553 $x$ {\tt<} $y$&test on $x<y$\\ |
|
1554 $x$ {\tt<=} $y$&test on $x\leq y$\\ |
|
1555 $x$ {\tt=} $y$, $x$ {\tt==} $y$&test on $x=y$\\ |
|
1556 $x$ {\tt>=} $y$&test on $x\geq y$\\ |
|
1557 $x$ {\tt>} $y$&test on $x>y$\\ |
|
1558 $x$ {\tt<>} $y$, $x$ {\tt!=} $y$&test on $x\neq y$\\ |
|
1559 $x$ {\tt in} $Y$&test on $x\in Y$\\ |
|
1560 {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&test on |
|
1561 $(x_1,\dots,x_n)\in Y$\\ |
|
1562 $x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&test on $x\not\in Y$\\ |
|
1563 {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$, |
|
1564 {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&test on |
|
1565 $(x_1,\dots,x_n)\not\in Y$\\ |
|
1566 $X$ {\tt within} $Y$&test on $X\subseteq Y$\\ |
|
1567 $X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&test on |
|
1568 $X\not\subseteq Y$\\ |
|
1569 \end{tabular} |
|
1570 |
|
1571 \medskip |
|
1572 |
|
1573 \noindent where $x$, $x_1$, \dots, $x_n$, $y$ are numeric or symbolic |
|
1574 expressions, $X$ and $Y$ are set expression. |
|
1575 |
|
1576 {\it Notes:} |
|
1577 |
|
1578 1. In the operations {\tt in}, {\tt not in}, and {\tt !in} the |
|
1579 number of components in the first operands must be the same as the |
|
1580 dimension of the second operand. |
|
1581 |
|
1582 2. In the operations {\tt within}, {\tt not within}, and {\tt !within} |
|
1583 both operands must have identical dimension. |
|
1584 |
|
1585 All the relational operators listed above have their conventional |
|
1586 mathematical meaning. The resultant value is {\it true}, if |
|
1587 corresponding relation is satisfied for its operands, otherwise |
|
1588 {\it false}. (Note that symbolic values are ordered lexicographically, |
|
1589 and any numeric value precedes any symbolic value.) |
|
1590 |
|
1591 \subsubsection{Iterated expressions} |
|
1592 |
|
1593 An {\it iterated logical expression} is a primary logical expression, |
|
1594 which has the following syntactic form: |
|
1595 |
|
1596 \medskip |
|
1597 |
|
1598 \noindent\hfil |
|
1599 {\it iterated-operator} {\it indexing-expression} {\it integrand} |
|
1600 |
|
1601 \medskip |
|
1602 |
|
1603 \noindent where {\it iterated-operator} is the symbolic name of the |
|
1604 iterated operator to be performed (see below), {\it indexing-expression} |
|
1605 is an indexing expression which introduces dummy indices and controls |
|
1606 iterating, {\it integrand} is a numeric expression that participates in |
|
1607 the operation. |
|
1608 |
|
1609 In MathProg there exist two iterated operators, which may be used in |
|
1610 logical expressions: |
|
1611 |
|
1612 \medskip |
|
1613 |
|
1614 \noindent\hfil |
|
1615 \begin{tabular}{@{}lll@{}} |
|
1616 {\tt forall}&$\forall$-quantification&$\displaystyle |
|
1617 \forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ |
|
1618 {\tt exists}&$\exists$-quantification&$\displaystyle |
|
1619 \exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\ |
|
1620 \end{tabular} |
|
1621 |
|
1622 \medskip |
|
1623 |
|
1624 \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in |
|
1625 the indexing expression, $\Delta$ is the domain, a set of $n$-tuples |
|
1626 specified by the indexing expression which defines particular values |
|
1627 assigned to the dummy indices on performing the iterated operation, |
|
1628 $f(i_1,\dots,i_n)$ is the integrand, a logical expression whose |
|
1629 resultant value depends on the dummy indices. |
|
1630 |
|
1631 For $\forall$-quantification the resultant value of the iterated |
|
1632 logical expression is {\it true}, if the value of the integrand is |
|
1633 {\it true} for all $n$-tuples contained in the domain, otherwise |
|
1634 {\it false}. |
|
1635 |
|
1636 For $\exists$-quantification the resultant value of the iterated |
|
1637 logical expression is {\it false}, if the value of the integrand is |
|
1638 {\it false} for all $n$-tuples contained in the domain, otherwise |
|
1639 {\it true}. |
|
1640 |
|
1641 \subsubsection{Parenthesized expressions} |
|
1642 |
|
1643 Any logical expression may be enclosed in parentheses that |
|
1644 syntactically makes it a primary logical expression. |
|
1645 |
|
1646 Parentheses may be used in logical expressions, as in algebra, to |
|
1647 specify the desired order in which operations are to be performed. |
|
1648 Where parentheses are used, the expression within the parentheses is |
|
1649 evaluated before the resultant value is used. |
|
1650 |
|
1651 The resultant value of the parenthesized expression is the same as the |
|
1652 value of the expression enclosed within parentheses. |
|
1653 |
|
1654 \subsubsection{Logical operators} |
|
1655 |
|
1656 In MathProg there exist the following logical operators, which may be |
|
1657 used in logical expressions: |
|
1658 |
|
1659 \medskip |
|
1660 |
|
1661 \begin{tabular}{@{}p{96pt}p{222pt}@{}} |
|
1662 {\tt not} $x$, {\tt!}$x$&negation $\neg\ x$\\ |
|
1663 $x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunction (logical ``and'') |
|
1664 $x\;\&\;y$\\ |
|
1665 $x$ {\tt or} $y$, $x$ {\tt||} $y$&disjunction (logical ``or'') |
|
1666 $x\vee y$\\ |
|
1667 \end{tabular} |
|
1668 |
|
1669 \medskip |
|
1670 |
|
1671 \noindent where $x$ and $y$ are logical expressions. |
|
1672 |
|
1673 If the expression includes more than one logical operator, all |
|
1674 operators are performed from left to right according to the hierarchy |
|
1675 of the operations (see below). The resultant value of the expression, |
|
1676 which contains logical operators, is the result of applying the |
|
1677 operators to their operands. |
|
1678 |
|
1679 \subsubsection{Hierarchy of operations} |
|
1680 |
|
1681 The following list shows the hierarchy of operations in logical |
|
1682 expressions: |
|
1683 |
|
1684 \medskip |
|
1685 |
|
1686 \noindent\hfil |
|
1687 \begin{tabular}{@{}ll@{}} |
|
1688 Operation&Hierarchy\\ |
|
1689 \hline |
|
1690 Evaluation of numeric operations&1st-7th\\ |
|
1691 Evaluation of symbolic operations&8th-9th\\ |
|
1692 Evaluation of set operations&10th-14th\\ |
|
1693 Relational operations ({\tt<}, {\tt<=}, etc.)&15th\\ |
|
1694 Negation ({\tt not}, {\tt!})&16th\\ |
|
1695 Conjunction ({\tt and}, {\tt\&\&})&17th\\ |
|
1696 $\forall$- and $\exists$-quantification ({\tt forall}, {\tt exists})& |
|
1697 18th\\ |
|
1698 Disjunction ({\tt or}, {\tt||})&19th\\ |
|
1699 \end{tabular} |
|
1700 |
|
1701 \medskip |
|
1702 |
|
1703 This hierarchy has the same meaning as was explained above for numeric |
|
1704 expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}). |
|
1705 |
|
1706 \subsection{Linear expressions} |
|
1707 |
|
1708 An {\it linear expression} is a rule for computing so called |
|
1709 a {\it linear form} or simply a {\it formula}, which is a linear (or |
|
1710 affine) function of elemental variables. |
|
1711 |
|
1712 The primary linear expression may be an unsubscripted variable, |
|
1713 subscripted variable, iterated linear expression, conditional linear |
|
1714 expression, or another linear expression enclosed in parentheses. |
|
1715 |
|
1716 It is also allowed to use a numeric expression as the primary linear |
|
1717 expression, in which case the resultant value of the numeric expression |
|
1718 is automatically converted to a formula that includes the constant term |
|
1719 only. |
|
1720 |
|
1721 \medskip |
|
1722 |
|
1723 \noindent{\bf Examples} |
|
1724 |
|
1725 \medskip |
|
1726 |
|
1727 \noindent |
|
1728 \begin{tabular}{@{}ll@{}} |
|
1729 \verb|z|&(unsubscripted variable)\\ |
|
1730 \verb|x[i,j]|&(subscripted variable)\\ |
|
1731 \verb|sum{j in J} (a[i] * x[i,j] + 3 * y)|&(iterated expression)\\ |
|
1732 \verb|if i in I then x[i,j] else 1.5 * z + 3|&(conditional expression)\\ |
|
1733 \verb|(a[i,j] * x[i,j] + y[i-1] + .1)|&(parenthesized expression)\\ |
|
1734 \end{tabular} |
|
1735 |
|
1736 \medskip |
|
1737 |
|
1738 More general linear expressions containing two or more primary linear |
|
1739 expressions may be constructed by using certain arithmetic operators. |
|
1740 |
|
1741 \medskip |
|
1742 |
|
1743 \noindent{\bf Examples} |
|
1744 |
|
1745 \medskip |
|
1746 |
|
1747 \noindent\verb|2 * x[i-1,j+1] + 3.5 * y[k] + .5 * z| |
|
1748 |
|
1749 \noindent\verb|(- x[i,j] + 3.5 * y[k]) / sum{t in T} abs(d[i,j,t])| |
|
1750 |
|
1751 \subsubsection{Unsubscripted variables} |
|
1752 |
|
1753 If the primary linear expression is an unsubscripted variable (which |
|
1754 must be 0-dimensional), the resultant formula is that unsubscripted |
|
1755 variable. |
|
1756 |
|
1757 \subsubsection{Subscripted variables} |
|
1758 |
|
1759 The primary linear expression, which refers to a subscripted variable, |
|
1760 has the following syntactic form: |
|
1761 |
|
1762 \medskip |
|
1763 |
|
1764 \noindent\hfil |
|
1765 {\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]} |
|
1766 |
|
1767 \medskip |
|
1768 |
|
1769 \noindent where {\it name} is the symbolic name of the model variable, |
|
1770 $i_1$, $i_2$, \dots, $i_n$ are subscripts. |
|
1771 |
|
1772 Each subscript must be a numeric or symbolic expression. The number of |
|
1773 subscripts in the subscript list must be the same as the dimension of |
|
1774 the model variable with which the subscript list is associated. |
|
1775 |
|
1776 Actual values of the subscript expressions are used to identify a |
|
1777 particular member of the model variable that determines the resultant |
|
1778 formula, which is an elemental variable associated with corresponding |
|
1779 member. |
|
1780 |
|
1781 \subsubsection{Iterated expressions} |
|
1782 |
|
1783 An {\it iterated linear expression} is a primary linear expression, |
|
1784 which has the following syntactic form: |
|
1785 |
|
1786 \medskip |
|
1787 |
|
1788 \noindent\hfil |
|
1789 {\tt sum} {\it indexing-expression} {\it integrand} |
|
1790 |
|
1791 \medskip |
|
1792 |
|
1793 \noindent where {\it indexing-expression} is an indexing expression, |
|
1794 which introduces dummy indices and controls iterating, {\it integrand} |
|
1795 is a linear expression that participates in the operation. |
|
1796 |
|
1797 The iterated linear expression is evaluated exactly in the same way as |
|
1798 the iterated numeric expression (see Subection \ref{itexpr}, page |
|
1799 \pageref{itexpr}) with exception that the integrand participated in the |
|
1800 summation is a formula, not a numeric value. |
|
1801 |
|
1802 \subsubsection{Conditional expressions} |
|
1803 |
|
1804 A {\it conditional linear expression} is a primary linear expression, |
|
1805 which has one of the following two syntactic forms: |
|
1806 |
|
1807 \medskip |
|
1808 |
|
1809 \noindent\hfil |
|
1810 {\tt if} $b$ {\tt then} $f$ {\tt else} $g$ |
|
1811 |
|
1812 \medskip |
|
1813 |
|
1814 \noindent\hspace{127pt} |
|
1815 {\tt if} $b$ {\tt then} $f$ |
|
1816 |
|
1817 \medskip |
|
1818 |
|
1819 \noindent where $b$ is an logical expression, $f$ and $g$ are linear |
|
1820 expressions. |
|
1821 |
|
1822 The conditional linear expression is evaluated exactly in the same way |
|
1823 as the conditional numeric expression (see Subsection \ref{ifthen}, |
|
1824 page \pageref{ifthen}) with exception that operands participated in the |
|
1825 operation are formulae, not numeric values. |
|
1826 |
|
1827 \subsubsection{Parenthesized expressions} |
|
1828 |
|
1829 Any linear expression may be enclosed in parentheses that syntactically |
|
1830 makes it a primary linear expression. |
|
1831 |
|
1832 Parentheses may be used in linear expressions, as in algebra, to |
|
1833 specify the desired order in which operations are to be performed. |
|
1834 Where parentheses are used, the expression within the parentheses is |
|
1835 evaluated before the resultant formula is used. |
|
1836 |
|
1837 The resultant value of the parenthesized expression is the same as the |
|
1838 value of the expression enclosed within parentheses. |
|
1839 |
|
1840 \subsubsection{Arithmetic operators} |
|
1841 |
|
1842 In MathProg there exists the following arithmetic operators, which may |
|
1843 be used in linear expressions: |
|
1844 |
|
1845 \medskip |
|
1846 |
|
1847 \begin{tabular}{@{}p{96pt}p{222pt}@{}} |
|
1848 {\tt+} $f$&unary plus\\ |
|
1849 {\tt-} $f$&unary minus\\ |
|
1850 $f$ {\tt+} $g$&addition\\ |
|
1851 $f$ {\tt-} $g$&subtraction\\ |
|
1852 $x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplication\\ |
|
1853 $f$ {\tt/} $x$&division |
|
1854 \end{tabular} |
|
1855 |
|
1856 \medskip |
|
1857 |
|
1858 \noindent where $f$ and $g$ are linear expressions, $x$ is a numeric |
|
1859 expression (more precisely, a linear expression containing only the |
|
1860 constant term). |
|
1861 |
|
1862 If the expression includes more than one arithmetic operator, all |
|
1863 operators are performed from left to right according to the hierarchy |
|
1864 of operations (see below). The resultant value of the expression, which |
|
1865 contains arithmetic operators, is the result of applying the operators |
|
1866 to their operands. |
|
1867 |
|
1868 \subsubsection{Hierarchy of operations} |
|
1869 |
|
1870 The hierarchy of arithmetic operations used in linear expressions is |
|
1871 the same as for numeric expressions (see Subsection \ref{hierarchy}, |
|
1872 page \pageref{hierarchy}). |
|
1873 |
|
1874 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1875 |
|
1876 \newpage |
|
1877 |
|
1878 \section{Statements} |
|
1879 |
|
1880 {\it Statements} are basic units of the model description. In MathProg |
|
1881 all statements are divided into two categories: declaration statements |
|
1882 and functional statements. |
|
1883 |
|
1884 {\it Declaration statements} (set statement, parameter statement, |
|
1885 variable statement, constraint statement, and objective statement) are |
|
1886 used to declare model objects of certain kinds and define certain |
|
1887 properties of such objects. |
|
1888 |
|
1889 {\it Functional statements} (solve statement, check statement, display |
|
1890 statement, printf statement, loop statement) are intended for |
|
1891 performing some specific actions. |
|
1892 |
|
1893 Note that declaration statements may follow in arbitrary order, which |
|
1894 does not affect the result of translation. However, any model object |
|
1895 must be declared before it is referenced in other statements. |
|
1896 |
|
1897 \subsection{Set statement} |
|
1898 |
|
1899 \medskip |
|
1900 |
|
1901 \framebox[345pt][l]{ |
|
1902 \parbox[c][24pt]{345pt}{ |
|
1903 \hspace{6pt} {\tt set} {\it name} {\it alias} {\it domain} {\tt,} |
|
1904 {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} |
|
1905 }} |
|
1906 |
|
1907 \setlength{\leftmargini}{60pt} |
|
1908 |
|
1909 \begin{description} |
|
1910 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the |
|
1911 set; |
|
1912 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which |
|
1913 specifies an alias of the set; |
|
1914 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression, |
|
1915 which specifies a subscript domain of the set; |
|
1916 \item[\hspace*{54pt}] {\it attrib}, \dots, {\it attrib} are optional |
|
1917 attributes of the set. (Commae preceding attributes may be omitted.) |
|
1918 \end{description} |
|
1919 |
|
1920 \noindent Optional attributes: |
|
1921 |
|
1922 \begin{description} |
|
1923 \item[{\tt dimen} $n$\hspace*{19pt}] specifies the dimension of |
|
1924 $n$-tuples, which the set consists of; |
|
1925 \item[{\tt within} {\it expression}]\hspace*{0pt}\\ |
|
1926 specifies a superset which restricts the set or all its members |
|
1927 (elemental sets) to be within that superset; |
|
1928 \item[{\tt:=} {\it expression}]\hspace*{0pt}\\ |
|
1929 specifies an elemental set assigned to the set or its members; |
|
1930 \item[{\tt default} {\it expression}]\hspace*{0pt}\\ |
|
1931 specifies an elemental set assigned to the set or its members whenever |
|
1932 no appropriate data are available in the data section. |
|
1933 \end{description} |
|
1934 |
|
1935 \newpage |
|
1936 |
|
1937 \noindent{\bf Examples} |
|
1938 |
|
1939 \begin{verbatim} |
|
1940 set V; |
|
1941 set E within V cross V; |
|
1942 set step{s in 1..maxiter} dimen 2 := if s = 1 then E else |
|
1943 step[s-1] union setof{k in V, (i,k) in step[s-1], (k,j) |
|
1944 in step[s-1]}(i,j); |
|
1945 set A{i in I, j in J}, within B[i+1] cross C[j-1], within |
|
1946 D diff E, default {('abc',123), (321,'cba')}; |
|
1947 \end{verbatim} |
|
1948 |
|
1949 The set statement declares a set. If the subscript domain is not |
|
1950 specified, the set is a simple set, otherwise it is an array of |
|
1951 elemental sets. |
|
1952 |
|
1953 The {\tt dimen} attribute specifies the dimension of $n$-tuples, which |
|
1954 the set (if it is a simple set) or its members (if the set is an array |
|
1955 of elemental sets) consist of, where $n$ must be unsigned integer from |
|
1956 1 to 20. At most one {\tt dimen} attribute can be specified. If the |
|
1957 {\tt dimen} attribute is not specified, the dimension of\linebreak |
|
1958 $n$-tuples is implicitly determined by other attributes (for example, |
|
1959 if there is a set expression that follows {\tt:=} or the keyword |
|
1960 {\tt default}, the dimension of $n$-tuples of corresponding elemental |
|
1961 set is used). If no dimension information is available, {\tt dimen 1} |
|
1962 is assumed. |
|
1963 |
|
1964 The {\tt within} attribute specifies a set expression whose resultant |
|
1965 value is a superset used to restrict the set (if it is a simple set) or |
|
1966 its members (if the set is an array of elemental sets) to be within |
|
1967 that superset. Arbitrary number of {\tt within} attributes may be |
|
1968 specified in the same set statement. |
|
1969 |
|
1970 The assign ({\tt:=}) attribute specifies a set expression used to |
|
1971 evaluate elemental set(s) assigned to the set (if it is a simple set) |
|
1972 or its members (if the set is an array of elemental sets). If the |
|
1973 assign attribute is specified, the set is {\it computable} and |
|
1974 therefore needs no data to be provided in the data section. If the |
|
1975 assign attribute is not specified, the set must be provided with data |
|
1976 in the data section. At most one assign or default attribute can be |
|
1977 specified for the same set. |
|
1978 |
|
1979 The {\tt default} attribute specifies a set expression used to evaluate |
|
1980 elemental set(s) assigned to the set (if it is a simple set) or its |
|
1981 members (if the set is an array of elemental sets) whenever |
|
1982 no appropriate data are available in the data section. If neither |
|
1983 assign nor default attribute is specified, missing data will cause an |
|
1984 error. |
|
1985 |
|
1986 \subsection{Parameter statement} |
|
1987 |
|
1988 \medskip |
|
1989 |
|
1990 \framebox[345pt][l]{ |
|
1991 \parbox[c][24pt]{345pt}{ |
|
1992 \hspace{6pt} {\tt param} {\it name} {\it alias} {\it domain} {\tt,} |
|
1993 {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} |
|
1994 }} |
|
1995 |
|
1996 \setlength{\leftmargini}{60pt} |
|
1997 |
|
1998 \begin{description} |
|
1999 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the |
|
2000 parameter; |
|
2001 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which |
|
2002 specifies an alias of the parameter; |
|
2003 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression, |
|
2004 which specifies a subscript domain of the parameter; |
|
2005 \item[\hspace*{54pt}] {\it attrib}, \dots, {\it attrib} are optional |
|
2006 attributes of the parameter. (Commae preceding attributes may be |
|
2007 omitted.) |
|
2008 \end{description} |
|
2009 |
|
2010 \noindent Optional attributes: |
|
2011 |
|
2012 \begin{description} |
|
2013 \item[{\tt integer}\hspace*{18.5pt}] specifies that the parameter is |
|
2014 integer; |
|
2015 \item[{\tt binary}\hspace*{24pt}] specifies that the parameter is |
|
2016 binary; |
|
2017 \item[{\tt symbolic}\hspace*{13.5pt}] specifies that the parameter is |
|
2018 symbolic; |
|
2019 \item[{\it relation expression}]\hspace*{0pt}\\ |
|
2020 (where {\it relation} is one of: {\tt<}, {\tt<=}, {\tt=}, {\tt==}, |
|
2021 {\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\ |
|
2022 specifies a condition that restricts the parameter or its members to |
|
2023 satisfy that condition; |
|
2024 \item[{\tt in} {\it expression}]\hspace*{0pt}\\ |
|
2025 specifies a superset that restricts the parameter or its members to be |
|
2026 in that superset; |
|
2027 \item[{\tt:=} {\it expression}]\hspace*{0pt}\\ |
|
2028 specifies a value assigned to the parameter or its members; |
|
2029 \item[{\tt default} {\it expression}]\hspace*{0pt}\\ |
|
2030 specifies a value assigned to the parameter or its members whenever |
|
2031 no appropriate data are available in the data section. |
|
2032 \end{description} |
|
2033 |
|
2034 \noindent{\bf Examples} |
|
2035 |
|
2036 \begin{verbatim} |
|
2037 param units{raw, prd} >= 0; |
|
2038 param profit{prd, 1..T+1}; |
|
2039 param N := 20, integer, >= 0, <= 100; |
|
2040 param comb 'n choose k' {n in 0..N, k in 0..n} := |
|
2041 if k = 0 or k = n then 1 else comb[n-1,k-1] + comb[n-1,k]; |
|
2042 param p{i in I, j in J}, integer, >= 0, <= i+j, |
|
2043 in A[i] symdiff B[j], in C[i,j], default 0.5 * (i + j); |
|
2044 param month symbolic default 'May' in {'Mar', 'Apr', 'May'}; |
|
2045 \end{verbatim} |
|
2046 |
|
2047 The parameter statement declares a parameter. If a subscript domain is |
|
2048 not specified, the parameter is a simple (scalar) parameter, otherwise |
|
2049 it is a $n$-dimensional array. |
|
2050 |
|
2051 The type attributes {\tt integer}, {\tt binary}, and {\tt symbolic} |
|
2052 qualify the type of values that can be assigned to the parameter as |
|
2053 shown below: |
|
2054 |
|
2055 \medskip |
|
2056 |
|
2057 \noindent\hfil |
|
2058 \begin{tabular}{@{}ll@{}} |
|
2059 Type attribute&Assigned values\\ |
|
2060 \hline |
|
2061 (not specified)&Any numeric values\\ |
|
2062 {\tt integer}&Only integer numeric values\\ |
|
2063 {\tt binary}&Either 0 or 1\\ |
|
2064 {\tt symbolic}&Any numeric and symbolic values\\ |
|
2065 \end{tabular} |
|
2066 |
|
2067 \newpage |
|
2068 |
|
2069 The {\tt symbolic} attribute cannot be specified along with other type |
|
2070 attributes. Being specified it must precede all other attributes. |
|
2071 |
|
2072 The condition attribute specifies an optional condition that restricts |
|
2073 values assigned to the parameter to satisfy that condition. This |
|
2074 attribute has the following syntactic forms: |
|
2075 |
|
2076 \medskip |
|
2077 |
|
2078 \begin{tabular}{@{}ll@{}} |
|
2079 {\tt<} $v$&check for $x<v$\\ |
|
2080 {\tt<=} $v$&check for $x\leq v$\\ |
|
2081 {\tt=} $v$, {\tt==} $v$&check for $x=v$\\ |
|
2082 {\tt>=} $v$&check for $x\geq v$\\ |
|
2083 {\tt>} $v$&check for $x\geq v$\\ |
|
2084 {\tt<>} $v$, {\tt!=} $v$&check for $x\neq v$\\ |
|
2085 \end{tabular} |
|
2086 |
|
2087 \medskip |
|
2088 |
|
2089 \noindent where $x$ is a value assigned to the parameter, $v$ is the |
|
2090 resultant value of a numeric or symbolic expression specified in the |
|
2091 condition attribute. Arbitrary number of condition attributes can be |
|
2092 specified for the same parameter. If a value being assigned to the |
|
2093 parameter during model evaluation violates at least one of specified |
|
2094 conditions, an error is raised. (Note that symbolic values are ordered |
|
2095 lexicographically, and any numeric value precedes any symbolic value.) |
|
2096 |
|
2097 The {\tt in} attribute is similar to the condition attribute and |
|
2098 specifies a set expression whose resultant value is a superset used to |
|
2099 restrict numeric or symbolic values assigned to the parameter to be in |
|
2100 that superset. Arbitrary number of the {\tt in} attributes can be |
|
2101 specified for the same parameter. If a value being assigned to the |
|
2102 parameter during model evaluation is not in at least one of specified |
|
2103 supersets, an error is raised. |
|
2104 |
|
2105 The assign ({\tt:=}) attribute specifies a numeric or symbolic |
|
2106 expression used to compute a value assigned to the parameter (if it is |
|
2107 a simple parameter) or its member (if the parameter is an array). If |
|
2108 the assign attribute is specified, the parameter is {\it computable} |
|
2109 and therefore needs no data to be provided in the data section. If the |
|
2110 assign attribute is not specified, the parameter must be provided with |
|
2111 data in the data section. At most one assign or {\tt default} attribute |
|
2112 can be specified for the same parameter. |
|
2113 |
|
2114 The {\tt default} attribute specifies a numeric or symbolic expression |
|
2115 used to compute a value assigned to the parameter or its member |
|
2116 whenever no appropriate data are available in the data section. If |
|
2117 neither assign nor {\tt default} attribute is specified, missing data |
|
2118 will cause an error. |
|
2119 |
|
2120 \subsection{Variable statement} |
|
2121 |
|
2122 \medskip |
|
2123 |
|
2124 \framebox[345pt][l]{ |
|
2125 \parbox[c][24pt]{345pt}{ |
|
2126 \hspace{6pt} {\tt var} {\it name} {\it alias} {\it domain} {\tt,} |
|
2127 {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;} |
|
2128 }} |
|
2129 |
|
2130 \setlength{\leftmargini}{60pt} |
|
2131 |
|
2132 \begin{description} |
|
2133 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the |
|
2134 variable; |
|
2135 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which |
|
2136 specifies an alias of the variable; |
|
2137 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression, |
|
2138 which specifies a subscript domain of the variable; |
|
2139 \item[\hspace*{54pt}] {\it attrib}, \dots, {\it attrib} are optional |
|
2140 attributes of the variable. (Commae preceding attributes may be |
|
2141 omitted.) |
|
2142 \end{description} |
|
2143 |
|
2144 \noindent Optional attributes: |
|
2145 |
|
2146 \begin{description} |
|
2147 \item[{\tt integer}\hspace*{18.5pt}] restricts the variable to be |
|
2148 integer; |
|
2149 \item[{\tt binary}\hspace*{24pt}] restricts the variable to be binary; |
|
2150 \item[{\tt>=} {\it expression}]\hspace*{0pt}\\ |
|
2151 specifies an lower bound of the variable; |
|
2152 \item[{\tt<=} {\it expression}]\hspace*{0pt}\\ |
|
2153 specifies an upper bound of the variable; |
|
2154 \item[{\tt=} {\it expression}]\hspace*{0pt}\\ |
|
2155 specifies a fixed value of the variable; |
|
2156 \end{description} |
|
2157 |
|
2158 \noindent{\bf Examples} |
|
2159 |
|
2160 \begin{verbatim} |
|
2161 var x >= 0; |
|
2162 var y{I,J}; |
|
2163 var make{p in prd}, integer, >= commit[p], <= market[p]; |
|
2164 var store{raw, 1..T+1} >= 0; |
|
2165 var z{i in I, j in J} >= i+j; |
|
2166 \end{verbatim} |
|
2167 |
|
2168 The variable statement declares a variable. If a subscript domain is |
|
2169 not specified, the variable is a simple (scalar) variable, otherwise it |
|
2170 is a $n$-dimensional array of elemental variables. |
|
2171 |
|
2172 Elemental variable(s) associated with the model variable (if it is a |
|
2173 simple variable) or its members (if it is an array) correspond to the |
|
2174 variables in the LP/MIP problem formulation (see Subsection |
|
2175 \ref{problem}, page \pageref{problem}). Note that only elemental |
|
2176 variables actually referenced in some constraints and/or objectives are |
|
2177 included in the LP/MIP problem instance to be generated. |
|
2178 |
|
2179 The type attributes {\tt integer} and {\tt binary} restrict the |
|
2180 variable to be integer or binary, respectively. If no type attribute is |
|
2181 specified, the variable is continuous. If all variables in the model |
|
2182 are continuous, the corresponding problem is of LP class. If there is |
|
2183 at least one integer or binary variable, the problem is of MIP class. |
|
2184 |
|
2185 The lower bound ({\tt>=}) attribute specifies a numeric expression for |
|
2186 computing an lower bound of the variable. At most one lower bound can |
|
2187 be specified. By default all variables (except binary ones) have no |
|
2188 lower bound, so if a variable is required to be non-negative, its zero |
|
2189 lower bound should be explicitly specified. |
|
2190 |
|
2191 The upper bound ({\tt<=}) attribute specifies a numeric expression for |
|
2192 computing an upper bound of the variable. At most one upper bound |
|
2193 attribute can be specified. |
|
2194 |
|
2195 The fixed value ({\tt=}) attribute specifies a numeric expression for |
|
2196 computing a value, at which the variable is fixed. This attribute |
|
2197 cannot be specified along with the bound attributes. |
|
2198 |
|
2199 \subsection{Constraint statement} |
|
2200 |
|
2201 \medskip |
|
2202 |
|
2203 \framebox[345pt][l]{ |
|
2204 \parbox[c][96pt]{345pt}{ |
|
2205 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} |
|
2206 {\it expression} {\tt,} {\tt=} {\it expression} {\tt;} |
|
2207 |
|
2208 \medskip |
|
2209 |
|
2210 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} |
|
2211 {\it expression} {\tt,} {\tt<=} {\it expression} {\tt;} |
|
2212 |
|
2213 \medskip |
|
2214 |
|
2215 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} |
|
2216 {\it expression} {\tt,} {\tt>=} {\it expression} {\tt;} |
|
2217 |
|
2218 \medskip |
|
2219 |
|
2220 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} |
|
2221 {\it expression} {\tt,} {\tt<=} {\it expression} {\tt,} {\tt<=} |
|
2222 {\it expression} {\tt;} |
|
2223 |
|
2224 \medskip |
|
2225 |
|
2226 \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:} |
|
2227 {\it expression} {\tt,} {\tt>=} {\it expression} {\tt,} {\tt>=} |
|
2228 {\it expression} {\tt;} |
|
2229 }} |
|
2230 |
|
2231 \setlength{\leftmargini}{60pt} |
|
2232 |
|
2233 \begin{description} |
|
2234 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the |
|
2235 constraint; |
|
2236 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which |
|
2237 specifies an alias of the constraint; |
|
2238 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression, |
|
2239 which specifies a subscript domain of the constraint; |
|
2240 \item[\hspace*{54pt}] {\it expression} is a linear expression used to |
|
2241 compute a component of the constraint. (Commae following expressions |
|
2242 may be omitted.) |
|
2243 \end{description} |
|
2244 |
|
2245 \begin{description} |
|
2246 \item[{\rm Note:}\hspace*{31pt}] The keyword {\tt s.t.} may be written |
|
2247 as {\tt subject to} or as {\tt subj to}, or may be omitted at all. |
|
2248 \end{description} |
|
2249 |
|
2250 \noindent{\bf Examples} |
|
2251 |
|
2252 \begin{verbatim} |
|
2253 s.t. r: x + y + z, >= 0, <= 1; |
|
2254 limit{t in 1..T}: sum{j in prd} make[j,t] <= max_prd; |
|
2255 subject to balance{i in raw, t in 1..T}: store[i,t+1] - |
|
2256 store[i,t] - sum{j in prd} units[i,j] * make[j,t]; |
|
2257 subject to rlim 'regular-time limit' {t in time}: |
|
2258 sum{p in prd} pt[p] * rprd[p,t] <= 1.3 * dpp[t] * crews[t]; |
|
2259 \end{verbatim} |
|
2260 |
|
2261 The constraint statement declares a constraint. If a subscript domain |
|
2262 is not specified, the constraint is a simple (scalar) constraint, |
|
2263 otherwise it is a $n$-dimensional array of elemental constraints. |
|
2264 |
|
2265 Elemental constraint(s) associated with the model constraint (if it is |
|
2266 a simple constraint) or its members (if it is an array) correspond to |
|
2267 the linear constraints in the LP/MIP problem formulation (see |
|
2268 Subsection \ref{problem}, page \pageref{problem}). |
|
2269 |
|
2270 If the constraint has the form of equality or single inequality, i.e. |
|
2271 includes two expressions, one of which follows the colon and other |
|
2272 follows the relation sign {\tt=}, {\tt<=}, or {\tt>=}, both expressions |
|
2273 in the statement can be linear expressions. If the constraint has the |
|
2274 form of double inequality, i.e. includes three expressions, the middle |
|
2275 expression can be a linear expression while the leftmost and rightmost |
|
2276 ones can be only numeric expressions. |
|
2277 |
|
2278 Generating the model is, roughly speaking, generating its constraints, |
|
2279 which are always evaluated for the entire subscript domain. Evaluation |
|
2280 of the constraints leads, in turn, to evaluation of other model objects |
|
2281 such as sets, parameters, and variables. |
|
2282 |
|
2283 Constructing an actual linear constraint included in the problem |
|
2284 instance, which (constraint) corresponds to a particular elemental |
|
2285 constraint, is performed as follows. |
|
2286 |
|
2287 If the constraint has the form of equality or single inequality, |
|
2288 evaluation of both linear expressions gives two resultant linear forms: |
|
2289 $$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r} |
|
2290 f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\ |
|
2291 g&=&b_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&b_0,\\ |
|
2292 \end{array}$$ |
|
2293 where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$, |
|
2294 \dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ are numeric coefficients; |
|
2295 $a_0$ and $b_0$ are constant terms. Then all linear terms of $f$ and |
|
2296 $g$ are carried to the left-hand side, and the constant terms are |
|
2297 carried to the right-hand side, that gives the final elemental |
|
2298 constraint in the standard form: |
|
2299 $$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{ |
|
2300 \begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$ |
|
2301 |
|
2302 If the constraint has the form of double inequality, evaluation of the |
|
2303 middle linear expression gives the resultant linear form: |
|
2304 $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$ |
|
2305 and evaluation of the leftmost and rightmost numeric expressions gives |
|
2306 two numeric values $l$ and $u$, respectively. Then the constant term of |
|
2307 the linear form is carried to both left-hand and right-handsides that |
|
2308 gives the final elemental constraint in the standard form: |
|
2309 $$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$ |
|
2310 |
|
2311 \subsection{Objective statement} |
|
2312 |
|
2313 \medskip |
|
2314 |
|
2315 \framebox[345pt][l]{ |
|
2316 \parbox[c][44pt]{345pt}{ |
|
2317 \hspace{6pt} {\tt minimize} {\it name} {\it alias} {\it domain} {\tt:} |
|
2318 {\it expression} {\tt;} |
|
2319 |
|
2320 \medskip |
|
2321 |
|
2322 \hspace{6pt} {\tt maximize} {\it name} {\it alias} {\it domain} {\tt:} |
|
2323 {\it expression} {\tt;} |
|
2324 }} |
|
2325 |
|
2326 \setlength{\leftmargini}{60pt} |
|
2327 |
|
2328 \begin{description} |
|
2329 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the |
|
2330 objective; |
|
2331 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which |
|
2332 specifies an alias of the objective; |
|
2333 \item[\hspace*{54pt}] {\it domain} is an optional indexing expression, |
|
2334 which specifies a subscript domain of the objective; |
|
2335 \item[\hspace*{54pt}] {\it expression} is a linear expression used to |
|
2336 compute the linear form of the objective. |
|
2337 \end{description} |
|
2338 |
|
2339 \noindent{\bf Examples} |
|
2340 |
|
2341 \begin{verbatim} |
|
2342 minimize obj: x + 1.5 * (y + z); |
|
2343 maximize total_profit: sum{p in prd} profit[p] * make[p]; |
|
2344 \end{verbatim} |
|
2345 |
|
2346 The objective statement declares an objective. If a subscript domain is |
|
2347 not specified, the objective is a simple (scalar) objective. Otherwise |
|
2348 it is a $n$-dimensional array of elemental objectives. |
|
2349 |
|
2350 Elemental objective(s) associated with the model objective (if it is a |
|
2351 simple objective) or its members (if it is an array) correspond to |
|
2352 general linear constraints in the LP/MIP problem formulation (see |
|
2353 Subsection \ref{problem}, page \pageref{problem}). However, unlike |
|
2354 constraints the corresponding linear forms are free (unbounded). |
|
2355 |
|
2356 Constructing an actual linear constraint included in the problem |
|
2357 instance, which (constraint) corresponds to a particular elemental |
|
2358 constraint, is performed as follows. The linear expression specified in |
|
2359 the objective statement is evaluated that, gives the resultant linear |
|
2360 form: |
|
2361 $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$ |
|
2362 where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$, |
|
2363 \dots, $a_n$ are numeric coefficients; $a_0$ is the constant term. Then |
|
2364 the linear form is used to construct the final elemental constraint in |
|
2365 the standard form: |
|
2366 $$-\infty<a_1x_1+a_2x_2+\dots+a_nx_n+a_0<+\infty.$$ |
|
2367 |
|
2368 As a rule the model description contains only one objective statement |
|
2369 that defines the objective function used in the problem instance. |
|
2370 However, it is allowed to declare arbitrary number of objectives, in |
|
2371 which case the actual objective function is the first objective |
|
2372 encountered in the model description. Other objectives are also |
|
2373 included in the problem instance, but they do not affect the objective |
|
2374 function. |
|
2375 |
|
2376 \subsection{Solve statement} |
|
2377 |
|
2378 \medskip |
|
2379 |
|
2380 \framebox[345pt][l]{ |
|
2381 \parbox[c][24pt]{345pt}{ |
|
2382 \hspace{6pt} {\tt solve} {\tt;} |
|
2383 }} |
|
2384 |
|
2385 \setlength{\leftmargini}{60pt} |
|
2386 |
|
2387 \begin{description} |
|
2388 \item[{\rm Note:}\hspace*{31pt}] The solve statement is optional and |
|
2389 can be used only once. If no solve statement is used, one is assumed at |
|
2390 the end of the model section. |
|
2391 \end{description} |
|
2392 |
|
2393 The solve statement causes the model to be solved, that means computing |
|
2394 numeric values of all model variables. This allows using variables in |
|
2395 statements below the solve statement in the same way as if they were |
|
2396 numeric parameters. |
|
2397 |
|
2398 Note that the variable, constraint, and objective statements cannot be |
|
2399 used below the solve statement, i.e. all principal components of the |
|
2400 model must be declared above the solve statement. |
|
2401 |
|
2402 \subsection{Check statement} |
|
2403 |
|
2404 \medskip |
|
2405 |
|
2406 \framebox[345pt][l]{ |
|
2407 \parbox[c][24pt]{345pt}{ |
|
2408 \hspace{6pt} {\tt check} {\it domain} {\tt:} {\it expression} {\tt;} |
|
2409 }} |
|
2410 |
|
2411 \setlength{\leftmargini}{60pt} |
|
2412 |
|
2413 \begin{description} |
|
2414 \item[{\rm Where:}\hspace*{23pt}] {\it domain} is an optional indexing |
|
2415 expression, which specifies a subscript domain of the check statement; |
|
2416 \item[\hspace*{54pt}] {\it expression} is an logical expression which |
|
2417 specifies the logical condition to be checked. (The colon preceding |
|
2418 {\it expression} may be omitted.) |
|
2419 \end{description} |
|
2420 |
|
2421 \noindent{\bf Examples} |
|
2422 |
|
2423 \begin{verbatim} |
|
2424 check: x + y <= 1 and x >= 0 and y >= 0; |
|
2425 check sum{i in ORIG} supply[i] = sum{j in DEST} demand[j]; |
|
2426 check{i in I, j in 1..10}: S[i,j] in U[i] union V[j]; |
|
2427 \end{verbatim} |
|
2428 |
|
2429 The check statement allows checking the resultant value of an logical |
|
2430 expression specified in the statement. If the value is {\it false}, an |
|
2431 error is reported. |
|
2432 |
|
2433 If the subscript domain is not specified, the check is performed only |
|
2434 once. Specifying the subscript domain allows performing multiple checks |
|
2435 for every\linebreak $n$-tuple in the domain set. In the latter case the |
|
2436 logical expression may include dummy indices introduced in |
|
2437 corresponding indexing expression. |
|
2438 |
|
2439 \subsection{Display statement} |
|
2440 |
|
2441 \medskip |
|
2442 |
|
2443 \framebox[345pt][l]{ |
|
2444 \parbox[c][24pt]{345pt}{ |
|
2445 \hspace{6pt} {\tt display} {\it domain} {\tt:} {\it item} {\tt,} |
|
2446 \dots {\tt,} {\it item} {\tt;} |
|
2447 }} |
|
2448 |
|
2449 \setlength{\leftmargini}{60pt} |
|
2450 |
|
2451 \begin{description} |
|
2452 \item[{\rm Where:}\hspace*{23pt}] {\it domain} is an optional indexing |
|
2453 expression, which specifies a subscript domain of the check statement; |
|
2454 \item[\hspace*{54pt}] {\it item}, \dots, {\it item} are items to be |
|
2455 displayed. (The colon preceding the first item may be omitted.) |
|
2456 \end{description} |
|
2457 |
|
2458 \noindent{\bf Examples} |
|
2459 |
|
2460 \begin{verbatim} |
|
2461 display: 'x =', x, 'y =', y, 'z =', z; |
|
2462 display sqrt(x ** 2 + y ** 2 + z ** 2); |
|
2463 display{i in I, j in J}: i, j, a[i,j], b[i,j]; |
|
2464 \end{verbatim} |
|
2465 |
|
2466 \newpage |
|
2467 |
|
2468 The display statement evaluates all items specified in the statement |
|
2469 and writes their values to the terminal in plain text format. |
|
2470 |
|
2471 If a subscript domain is not specified, items are evaluated and then |
|
2472 displayed only once. Specifying the subscript domain causes items to be |
|
2473 evaluated and displayed for every $n$-tuple in the domain set. In the |
|
2474 latter case items may include dummy indices introduced in corresponding |
|
2475 indexing expression. |
|
2476 |
|
2477 An item to be displayed can be a model object (set, parameter, variable, |
|
2478 constraint, objective) or an expression. |
|
2479 |
|
2480 If the item is a computable object (i.e. a set or parameter provided |
|
2481 with the assign attribute), the object is evaluated over the entire |
|
2482 domain and then its content (i.e. the content of the object array) is |
|
2483 displayed. Otherwise, if the item is not a computable object, only its |
|
2484 current content (i.e. members actually generated during the model |
|
2485 evaluation) is displayed. |
|
2486 |
|
2487 If the item is an expression, the expression is evaluated and its |
|
2488 resultant value is displayed. |
|
2489 |
|
2490 \subsection{Printf statement} |
|
2491 |
|
2492 \medskip |
|
2493 |
|
2494 \framebox[345pt][l]{ |
|
2495 \parbox[c][60pt]{345pt}{ |
|
2496 \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,} |
|
2497 {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt;} |
|
2498 |
|
2499 \medskip |
|
2500 |
|
2501 \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,} |
|
2502 {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>} |
|
2503 {\it filename} {\tt;} |
|
2504 |
|
2505 \medskip |
|
2506 |
|
2507 \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,} |
|
2508 {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>>} |
|
2509 {\it filename} {\tt;} |
|
2510 }} |
|
2511 |
|
2512 \setlength{\leftmargini}{60pt} |
|
2513 |
|
2514 \begin{description} |
|
2515 \item[{\rm Where:}\hspace*{23pt}] {\it domain} is an optional indexing |
|
2516 expression, which specifies a subscript domain of the printf statement; |
|
2517 \item[\hspace*{54pt}] {\it format} is a symbolic expression whose value |
|
2518 specifies a format control string. (The colon preceding the format |
|
2519 expression may be omitted.) |
|
2520 \item[\hspace*{54pt}] {\it expression}, \dots, {\it expression} are |
|
2521 zero or more expressions whose values have to be formatted and printed. |
|
2522 Each expression must be of numeric, symbolic, or logical type. |
|
2523 \item[\hspace*{54pt}] {\it filename} is a symbolic expression whose |
|
2524 value specifies a name of a text file, to which the output is |
|
2525 redirected. The flag {\tt>} means creating a new empty file while the |
|
2526 flag {\tt>>} means appending the output to an existing file. If no file |
|
2527 name is specified, the output is written to the terminal. |
|
2528 \end{description} |
|
2529 |
|
2530 \noindent{\bf Examples} |
|
2531 |
|
2532 \begin{verbatim} |
|
2533 printf 'Hello, world!\n'; |
|
2534 printf: "x = %.3f; y = %.3f; z = %.3f\n", |
|
2535 x, y, z > "result.txt"; |
|
2536 printf{i in I, j in J}: "flow from %s to %s is %d\n", |
|
2537 i, j, x[i,j] >> result_file & ".txt"; |
|
2538 \end{verbatim} |
|
2539 |
|
2540 \newpage |
|
2541 |
|
2542 \begin{verbatim} |
|
2543 printf{i in I} 'total flow from %s is %g\n', |
|
2544 i, sum{j in J} x[i,j]; |
|
2545 printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"), |
|
2546 k, x[k]; |
|
2547 \end{verbatim} |
|
2548 |
|
2549 The printf statement is similar to the display statement, however, it |
|
2550 allows formatting data to be written. |
|
2551 |
|
2552 If a subscript domain is not specified, the printf statement is |
|
2553 executed only once. Specifying a subscript domain causes executing the |
|
2554 printf statement for every $n$-tuple in the domain set. In the latter |
|
2555 case the format and expression may include dummy indices introduced in |
|
2556 corresponding indexing expression. |
|
2557 |
|
2558 The format control string is a value of the symbolic expression |
|
2559 {\it format} specified in the printf statement. It is composed of zero |
|
2560 or more directives as follows: ordinary characters (not {\tt\%}), which |
|
2561 are copied unchanged to the output stream, and conversion |
|
2562 specifications, each of which causes evaluating corresponding |
|
2563 expression specified in the printf statement, formatting it, and |
|
2564 writing its resultant value to the output stream. |
|
2565 |
|
2566 Conversion specifications that may be used in the format control string |
|
2567 are the following: {\tt d}, {\tt i}, {\tt f}, {\tt F}, {\tt e}, {\tt E}, |
|
2568 {\tt g}, {\tt G}, and {\tt s}. These specifications have the same |
|
2569 syntax and semantics as in the C programming language. |
|
2570 |
|
2571 \subsection{For statement} |
|
2572 |
|
2573 \medskip |
|
2574 |
|
2575 \framebox[345pt][l]{ |
|
2576 \parbox[c][44pt]{345pt}{ |
|
2577 \hspace{6pt} {\tt for} {\it domain} {\tt:} {\it statement} {\tt;} |
|
2578 |
|
2579 \medskip |
|
2580 |
|
2581 \hspace{6pt} {\tt for} {\it domain} {\tt:} {\tt\{} {\it statement} |
|
2582 \dots {\it statement} {\tt\}} {\tt;} |
|
2583 }} |
|
2584 |
|
2585 \setlength{\leftmargini}{60pt} |
|
2586 |
|
2587 \begin{description} |
|
2588 \item[{\rm Where:}\hspace*{23pt}] {\it domain} is an indexing |
|
2589 expression which specifies a subscript domain of the for statement. |
|
2590 (The colon following the indexing expression may be omitted.) |
|
2591 \item[\hspace*{54pt}] {\it statement} is a statement, which should be |
|
2592 executed under control of the for statement; |
|
2593 \item[\hspace*{54pt}] {\it statement}, \dots, {\it statement} is a |
|
2594 sequence of statements (enclosed in curly braces), which should be |
|
2595 executed under control of the for statement. |
|
2596 \end{description} |
|
2597 |
|
2598 \begin{description} |
|
2599 \item[{\rm Note:}\hspace*{31pt}] Only the following statements can be |
|
2600 used within the for statement: check, display, printf, and another for. |
|
2601 \end{description} |
|
2602 |
|
2603 \noindent{\bf Examples} |
|
2604 |
|
2605 \begin{verbatim} |
|
2606 for {(i,j) in E: i != j} |
|
2607 { printf "flow from %s to %s is %g\n", i, j, x[i,j]; |
|
2608 check x[i,j] >= 0; |
|
2609 } |
|
2610 \end{verbatim} |
|
2611 |
|
2612 \newpage |
|
2613 |
|
2614 \begin{verbatim} |
|
2615 for {i in 1..n} |
|
2616 { for {j in 1..n} printf " %s", if x[i,j] then "Q" else "."; |
|
2617 printf("\n"); |
|
2618 } |
|
2619 for {1..72} printf("*"); |
|
2620 \end{verbatim} |
|
2621 |
|
2622 The for statement causes a statement or a sequence of statements |
|
2623 specified as part of the for statement to be executed for every |
|
2624 $n$-tuple in the domain set. Thus, statements within the for statement |
|
2625 may include dummy indices introduced in corresponding indexing |
|
2626 expression. |
|
2627 |
|
2628 \subsection{Table statement} |
|
2629 |
|
2630 \medskip |
|
2631 |
|
2632 \framebox[345pt][l]{ |
|
2633 \parbox[c][68pt]{345pt}{ |
|
2634 \hspace{6pt} {\tt table} {\it name} {\it alias} {\tt IN} {\it driver} |
|
2635 {\it arg} \dots {\it arg} {\tt:} |
|
2636 |
|
2637 \hspace{6pt} {\tt\ \ \ \ \ } {\it set} {\tt<-} {\tt[} {\it fld} {\tt,} |
|
2638 \dots {\tt,} {\it fld} {\tt]} {\tt,} {\it par} {\tt\textasciitilde} |
|
2639 {\it fld} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it fld} |
|
2640 {\tt;} |
|
2641 |
|
2642 \medskip |
|
2643 |
|
2644 \hspace{6pt} {\tt table} {\it name} {\it alias} {\it domain} {\tt OUT} |
|
2645 {\it driver} {\it arg} \dots {\it arg} {\tt:} |
|
2646 |
|
2647 \hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it fld} |
|
2648 {\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it fld} {\tt;} |
|
2649 }} |
|
2650 |
|
2651 \setlength{\leftmargini}{60pt} |
|
2652 |
|
2653 \begin{description} |
|
2654 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the |
|
2655 table; |
|
2656 \item[\hspace*{54pt}] {\it alias} is an optional string literal, which |
|
2657 specifies an alias of the table; |
|
2658 \item[\hspace*{54pt}] {\it domain} is an indexing expression, which |
|
2659 specifies a subscript domain of the (output) table; |
|
2660 \item[\hspace*{54pt}] {\tt IN} means reading data from the input table; |
|
2661 \item[\hspace*{54pt}] {\tt OUT} means writing data to the output table; |
|
2662 \item[\hspace*{54pt}] {\it driver} is a symbolic expression, which |
|
2663 specifies the driver used to access the table (for details see Section |
|
2664 \ref{drivers}, page \pageref{drivers}); |
|
2665 \item[\hspace*{54pt}] {\it arg} is an optional symbolic expression, |
|
2666 which is an argument pass\-ed to the table driver. This symbolic |
|
2667 expression must not include dummy indices specified in the domain; |
|
2668 \item[\hspace*{54pt}] {\it set} is the name of an optional simple set |
|
2669 called {\it control set}. It can be omitted along with the delimiter |
|
2670 {\tt<-}; |
|
2671 \item[\hspace*{54pt}] {\it fld} is a field name. Within square brackets |
|
2672 at least one field should be specified. The field name following |
|
2673 a parameter name or expression is optional and can be omitted along |
|
2674 with the delimiter {\tt\textasciitilde}, in which case the name of |
|
2675 corresponding model object is used as the field name; |
|
2676 \item[\hspace*{54pt}] {\it par} is a symbolic name of a model parameter; |
|
2677 \item[\hspace*{54pt}] {\it expr} is a numeric or symbolic expression. |
|
2678 \end{description} |
|
2679 |
|
2680 \newpage |
|
2681 |
|
2682 \noindent{\bf Examples} |
|
2683 |
|
2684 \begin{verbatim} |
|
2685 table data IN "CSV" "data.csv": |
|
2686 S <- [FROM,TO], d~DISTANCE, c~COST; |
|
2687 table result{(f,t) in S} OUT "CSV" "result.csv": |
|
2688 f~FROM, t~TO, x[f,t]~FLOW; |
|
2689 \end{verbatim} |
|
2690 |
|
2691 The table statement allows reading data from a table into model |
|
2692 objects such as sets and (non-scalar) parameters as well as writing |
|
2693 data from the model to a table. |
|
2694 |
|
2695 \subsubsection{Table structure} |
|
2696 |
|
2697 A {\it data table} is an (unordered) set of {\it records}, where each |
|
2698 record consists of the same number of {\it fields}, and each field is |
|
2699 provided with a unique symbolic name called the {\it field name}. For |
|
2700 example: |
|
2701 |
|
2702 \bigskip |
|
2703 |
|
2704 \begin{tabular}{@{\hspace*{38mm}}c@{\hspace*{11mm}}c@{\hspace*{10mm}}c |
|
2705 @{\hspace*{9mm}}c} |
|
2706 First&Second&&Last\\ |
|
2707 field&field&.\ \ .\ \ .&field\\ |
|
2708 $\downarrow$&$\downarrow$&&$\downarrow$\\ |
|
2709 \end{tabular} |
|
2710 |
|
2711 \begin{tabular}{ll@{}} |
|
2712 Table header&$\rightarrow$\\ |
|
2713 First record&$\rightarrow$\\ |
|
2714 Second record&$\rightarrow$\\ |
|
2715 \\ |
|
2716 \hfil .\ \ .\ \ .\\ |
|
2717 \\ |
|
2718 Last record&$\rightarrow$\\ |
|
2719 \end{tabular} |
|
2720 \begin{tabular}{|l|l|c|c|} |
|
2721 \hline |
|
2722 {\tt FROM}&{\tt TO}&{\tt DISTANCE}&{\tt COST}\\ |
|
2723 \hline |
|
2724 {\tt Seattle} &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\ |
|
2725 {\tt Seattle} &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\ |
|
2726 {\tt Seattle} &{\tt Topeka} &{\tt 1.8}&{\tt 0.09}\\ |
|
2727 {\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\ |
|
2728 {\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\ |
|
2729 {\tt San-Diego}&{\tt Topeka} &{\tt 1.4}&{\tt 0.07}\\ |
|
2730 \hline |
|
2731 \end{tabular} |
|
2732 |
|
2733 \subsubsection{Reading data from input table} |
|
2734 |
|
2735 The input table statement causes reading data from the specified table |
|
2736 record by record. |
|
2737 |
|
2738 Once a next record has been read, numeric or symbolic values of fields, |
|
2739 whose names are enclosed in square brackets in the table statement, are |
|
2740 gathered into $n$-tuple, and if the control set is specified in the |
|
2741 table statement, this $n$-tuple is added to it. Besides, a numeric or |
|
2742 symbolic value of each field associated with a model parameter is |
|
2743 assigned to the parameter member identified by subscripts, which are |
|
2744 components of the $n$-tuple just read. |
|
2745 |
|
2746 For example, the following input table statement: |
|
2747 |
|
2748 \medskip |
|
2749 |
|
2750 \noindent\hfil |
|
2751 \verb|table data IN "...": S <- [FROM,TO], d~DISTANCE, c~COST;| |
|
2752 |
|
2753 \medskip |
|
2754 |
|
2755 \noindent |
|
2756 causes reading values of four fields named {\tt FROM}, {\tt TO}, |
|
2757 {\tt DISTANCE}, and {\tt COST} from each record of the specified table. |
|
2758 Values of fields {\tt FROM} and {\tt TO} give a pair $(f,t)$, which is |
|
2759 added to the control set {\tt S}. The value of field {\tt DISTANCE} is |
|
2760 assigned to parameter member ${\tt d}[f,t]$, and the value of field |
|
2761 {\tt COST} is assigned to parameter member ${\tt c}[f,t]$. |
|
2762 |
|
2763 Note that the input table may contain extra fields whose names are not |
|
2764 specified in the table statement, in which case values of these fields |
|
2765 on reading the table are ignored. |
|
2766 |
|
2767 \subsubsection{Writing data to output table} |
|
2768 |
|
2769 The output table statement causes writing data to the specified table. |
|
2770 Note that some drivers (namely, CSV and xBASE) destroy the output table |
|
2771 before writing data, i.e. delete all its existing records. |
|
2772 |
|
2773 Each $n$-tuple in the specified domain set generates one record written |
|
2774 to the output table. Values of fields are numeric or symbolic values of |
|
2775 corresponding expressions specified in the table statement. These |
|
2776 expressions are evaluated for each $n$-tuple in the domain set and, |
|
2777 thus, may include dummy indices introduced in the corresponding indexing |
|
2778 expression. |
|
2779 |
|
2780 For example, the following output table statement: |
|
2781 |
|
2782 \medskip |
|
2783 |
|
2784 \noindent |
|
2785 \verb| table result{(f,t) in S} OUT "...": f~FROM, t~TO, x[f,t]~FLOW;| |
|
2786 |
|
2787 \medskip |
|
2788 |
|
2789 \noindent |
|
2790 causes writing records, by one record for each pair $(f,t)$ in set |
|
2791 {\tt S}, to the output table, where each record consists of three |
|
2792 fields named {\tt FROM}, {\tt TO}, and {\tt FLOW}. The values written |
|
2793 to fields {\tt FROM} and {\tt TO} are current values of dummy indices |
|
2794 {\tt f} and {\tt t}, and the value written to field {\tt FLOW} is |
|
2795 a value of member ${\tt x}[f,t]$ of corresponding subscripted parameter |
|
2796 or variable. |
|
2797 |
|
2798 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
2799 |
|
2800 \newpage |
|
2801 |
|
2802 \section{Model data} |
|
2803 |
|
2804 {\it Model data} include elemental sets, which are ``values'' of model |
|
2805 sets, and numeric and symbolic values of model parameters. |
|
2806 |
|
2807 In MathProg there are two different ways to saturate model sets and |
|
2808 parameters with data. One way is simply providing necessary data using |
|
2809 the assign attribute. However, in many cases it is more practical to |
|
2810 separate the model itself and particular data needed for the model. For |
|
2811 the latter reason in MathProg there is another way, when the model |
|
2812 description is divided into two parts: model section and data section. |
|
2813 |
|
2814 A {\it model section} is a main part of the model description that |
|
2815 contains declarations of all model objects and is common for all |
|
2816 problems based on that model. |
|
2817 |
|
2818 A {\it data section} is an optional part of the model description that |
|
2819 contains model data specific for a particular problem. |
|
2820 |
|
2821 In MathProg model and data sections can be placed either in one text |
|
2822 file or in two separate text files. |
|
2823 |
|
2824 1. If both model and data sections are placed in one file, the file is |
|
2825 composed as follows: |
|
2826 |
|
2827 \bigskip |
|
2828 |
|
2829 \noindent\hfil |
|
2830 \framebox{\begin{tabular}{l} |
|
2831 {\it statement}{\tt;}\\ |
|
2832 {\it statement}{\tt;}\\ |
|
2833 \hfil.\ \ .\ \ .\\ |
|
2834 {\it statement}{\tt;}\\ |
|
2835 {\tt data;}\\ |
|
2836 {\it data block}{\tt;}\\ |
|
2837 {\it data block}{\tt;}\\ |
|
2838 \hfil.\ \ .\ \ .\\ |
|
2839 {\it data block}{\tt;}\\ |
|
2840 {\tt end;} |
|
2841 \end{tabular}} |
|
2842 |
|
2843 \bigskip |
|
2844 |
|
2845 2. If the model and data sections are placed in two separate files, the |
|
2846 files are composed as follows: |
|
2847 |
|
2848 \bigskip |
|
2849 |
|
2850 \noindent\hfil |
|
2851 \begin{tabular}{@{}c@{}} |
|
2852 \framebox{\begin{tabular}{l} |
|
2853 {\it statement}{\tt;}\\ |
|
2854 {\it statement}{\tt;}\\ |
|
2855 \hfil.\ \ .\ \ .\\ |
|
2856 {\it statement}{\tt;}\\ |
|
2857 {\tt end;}\\ |
|
2858 \end{tabular}}\\ |
|
2859 \\\\Model file\\ |
|
2860 \end{tabular} |
|
2861 \hspace{32pt} |
|
2862 \begin{tabular}{@{}c@{}} |
|
2863 \framebox{\begin{tabular}{l} |
|
2864 {\tt data;}\\ |
|
2865 {\it data block}{\tt;}\\ |
|
2866 {\it data block}{\tt;}\\ |
|
2867 \hfil.\ \ .\ \ .\\ |
|
2868 {\it data block}{\tt;}\\ |
|
2869 {\tt end;}\\ |
|
2870 \end{tabular}}\\ |
|
2871 \\Data file\\ |
|
2872 \end{tabular} |
|
2873 |
|
2874 \bigskip |
|
2875 |
|
2876 \begin{description} |
|
2877 \item[{\rm Note:}\hspace*{31pt}] If the data section is placed in a |
|
2878 separate file, the keyword {\tt data} is optional and may be omitted |
|
2879 along with the semicolon that follows it. |
|
2880 \end{description} |
|
2881 |
|
2882 \subsection{Coding data section} |
|
2883 |
|
2884 The {\it data section} is a sequence of data blocks in various formats, |
|
2885 which are discussed in following subsections. The order, in which data |
|
2886 blocks follow in the data section, may be arbitrary, not necessarily |
|
2887 the same, in which corresponding model objects follow in the model |
|
2888 section. |
|
2889 |
|
2890 The rules of coding the data section are commonly the same as the rules |
|
2891 of coding the model description (see Subsection \ref{coding}, page |
|
2892 \pageref{coding}), i.e. data blocks are composed from basic lexical |
|
2893 units such as symbolic names, numeric and string literals, keywords, |
|
2894 delimiters, and comments. However, for the sake of convenience and |
|
2895 improving readability there is one deviation from the common rule: if |
|
2896 a string literal consists of only alphanumeric characters (including |
|
2897 the underscore character), the signs {\tt+} and {\tt-}, and/or the |
|
2898 decimal point, it may be coded without bordering by (single or double) |
|
2899 quotes. |
|
2900 |
|
2901 All numeric and symbolic material provided in the data section is coded |
|
2902 in the form of numbers and symbols, i.e. unlike the model section |
|
2903 no expressions are allowed in the data section. Nevertheless, the signs |
|
2904 {\tt+} and {\tt-} can precede numeric literals to allow coding signed |
|
2905 numeric quantities, in which case there must be no white-space |
|
2906 characters between the sign and following numeric literal (if there is |
|
2907 at least one white-space, the sign and following numeric literal are |
|
2908 recognized as two different lexical units). |
|
2909 |
|
2910 \subsection{Set data block} |
|
2911 |
|
2912 \medskip |
|
2913 |
|
2914 \framebox[345pt][l]{ |
|
2915 \parbox[c][44pt]{345pt}{ |
|
2916 \hspace{6pt} {\tt set} {\it name} {\tt,} {\it record} {\tt,} \dots |
|
2917 {\tt,} {\it record} {\tt;} |
|
2918 |
|
2919 \medskip |
|
2920 |
|
2921 \hspace{6pt} {\tt set} {\it name} {\tt[} {\it symbol} {\tt,} \dots |
|
2922 {\tt,} {\it symbol} {\tt]} {\tt,} {\it record} {\tt,} \dots {\tt,} |
|
2923 {\it record} {\tt;} |
|
2924 }} |
|
2925 |
|
2926 \setlength{\leftmargini}{60pt} |
|
2927 |
|
2928 \begin{description} |
|
2929 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the |
|
2930 set; |
|
2931 \item[\hspace*{54pt}] {\it symbol}, \dots, {\it symbol} are subscripts, |
|
2932 which specify a particular member of the set (if the set is an array, |
|
2933 i.e. a set of sets); |
|
2934 \item[\hspace*{54pt}] {\it record}, \dots, {\it record} are data |
|
2935 records. |
|
2936 \end{description} |
|
2937 |
|
2938 \begin{description} |
|
2939 \item[{\rm Note:}\hspace*{31pt}] Commae preceding data records may be |
|
2940 omitted. |
|
2941 \end{description} |
|
2942 |
|
2943 \noindent Data records: |
|
2944 |
|
2945 \begin{description} |
|
2946 \item[{\tt :=}\hspace*{45pt}] is a non-significant data record, which |
|
2947 may be used freely to improve readability; |
|
2948 \item[{\tt(} {\it slice} {\tt)}\hspace*{18.5pt}] specifies a slice; |
|
2949 \item[{\it simple-data}\hspace*{5.5pt}] specifies set data in the |
|
2950 simple format; |
|
2951 \item[{\tt:} {\it matrix-data}]\hspace*{0pt}\\ |
|
2952 specifies set data in the matrix format; |
|
2953 \item[{\tt(tr)} {\tt:} {\it matrix-data}]\hspace*{0pt}\\ |
|
2954 specifies set data in the transposed matrix format. (In this case the |
|
2955 colon following the keyword {\tt(tr)} may be omitted.) |
|
2956 \end{description} |
|
2957 |
|
2958 \noindent{\bf Examples} |
|
2959 |
|
2960 \begin{verbatim} |
|
2961 set month := Jan Feb Mar Apr May Jun; |
|
2962 set month "Jan", "Feb", "Mar", "Apr", "May", "Jun"; |
|
2963 set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4); |
|
2964 set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 2 4; |
|
2965 set A[3,'Mar'] : 1 2 3 4 := |
|
2966 1 - + - - |
|
2967 2 - + + - |
|
2968 3 + - - + |
|
2969 4 - + - + ; |
|
2970 set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1); |
|
2971 set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1; |
|
2972 set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1); |
|
2973 set B := (1,*,*) : 1 2 3 := |
|
2974 1 + - - |
|
2975 2 - + + |
|
2976 3 - + - |
|
2977 (2,*,*) : 1 2 3 := |
|
2978 1 + - + |
|
2979 2 - - - |
|
2980 3 + - - ; |
|
2981 \end{verbatim} |
|
2982 |
|
2983 \noindent(In these examples {\tt month} is a simple set of singlets, |
|
2984 {\tt A} is a 2-dimensional array of doublets, and {\tt B} is a simple |
|
2985 set of triplets. Data blocks for the same set are equivalent in the |
|
2986 sense that they specify the same data in different formats.) |
|
2987 |
|
2988 \medskip |
|
2989 |
|
2990 The {\it set data block} is used to specify a complete elemental set, |
|
2991 which is assigned to a set (if it is a simple set) or one of its |
|
2992 members (if the set is an array of sets).\footnote{There is another way |
|
2993 to specify data for a simple set along with data for parameters. This |
|
2994 feature is discussed in the next subsection.} |
|
2995 |
|
2996 Data blocks can be specified only for non-computable sets, i.e. for |
|
2997 sets, which have no assign ({\tt:=}) attribute in the corresponding set |
|
2998 statements. |
|
2999 |
|
3000 If the set is a simple set, only its symbolic name should be specified |
|
3001 in the header of the data block. Otherwise, if the set is a |
|
3002 $n$-dimensional array, its symbolic name should be provided with a |
|
3003 complete list of subscripts separated by commae and enclosed in square |
|
3004 brackets to specify a particular member of the set array. The number of |
|
3005 subscripts must be the same as the dimension of the set array, where |
|
3006 each subscript must be a number or symbol. |
|
3007 |
|
3008 An elemental set defined in the set data block is coded as a sequence |
|
3009 of data records described below.\footnote{{\it Data record} is simply a |
|
3010 technical term. It does not mean that data records have any special |
|
3011 formatting.} |
|
3012 |
|
3013 \newpage |
|
3014 |
|
3015 \subsubsection{Assign data record} |
|
3016 |
|
3017 The {\it assign} ({\tt:=}) {\it data record} is a non-signficant |
|
3018 element. It may be used for improving readability of data blocks. |
|
3019 |
|
3020 \subsubsection{Slice data record} |
|
3021 |
|
3022 The {\it slice data record} is a control record, which specifies a |
|
3023 {\it slice} of the elemental set defined in the data block. It has the |
|
3024 following syntactic form: |
|
3025 |
|
3026 \medskip |
|
3027 |
|
3028 \noindent\hfil |
|
3029 {\tt(} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt)} |
|
3030 |
|
3031 \medskip |
|
3032 |
|
3033 \noindent where $s_1$, $s_2$, \dots, $s_n$ are components of the slice. |
|
3034 |
|
3035 Each component of the slice can be a number or symbol or the asterisk |
|
3036 ({\tt*}). The number of components in the slice must be the same as the |
|
3037 dimension of $n$-tuples in the elemental set to be defined. For |
|
3038 instance, if the elemental set contains 4-tuples (quadruplets), the |
|
3039 slice must have four components. The number of asterisks in the slice |
|
3040 is called the {\it slice dimension}. |
|
3041 |
|
3042 The effect of using slices is the following. If a $m$-dimensional slice |
|
3043 (i.e. a slice having $m$ asterisks) is specified in the data block, all |
|
3044 subsequent data records must specify tuples of the dimension $m$. |
|
3045 Whenever a $m$-tuple is encountered, each asterisk in the slice is |
|
3046 replaced by corresponding components of the $m$-tuple that gives the |
|
3047 resultant $n$-tuple, which is included in the elemental set to be |
|
3048 defined. For example, if the slice $(a,*,1,2,*)$ is in effect, and |
|
3049 2-tuple $(3,b)$ is encountered in a subsequent data record, the |
|
3050 resultant 5-tuple included in the elemental set is $(a,3,1,2,b)$. |
|
3051 |
|
3052 The slice having no asterisks itself defines a complete $n$-tuple, |
|
3053 which is included in the elemental set. |
|
3054 |
|
3055 Being once specified the slice effects until either a new slice or the |
|
3056 end of data block is encountered. Note that if no slice is specified in |
|
3057 the data block, one, components of which are all asterisks, is assumed. |
|
3058 |
|
3059 \subsubsection{Simple data record} |
|
3060 |
|
3061 The {\it simple data record} defines one $n$-tuple in a simple format |
|
3062 and has the following syntactic form: |
|
3063 |
|
3064 \medskip |
|
3065 |
|
3066 \noindent\hfil |
|
3067 $t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ |
|
3068 |
|
3069 \medskip |
|
3070 |
|
3071 \noindent where $t_1$, $t_2$, \dots, $t_n$ are components of the |
|
3072 $n$-tuple. Each component can be a number or symbol. Commae between |
|
3073 components are optional and may be omitted. |
|
3074 |
|
3075 \subsubsection{Matrix data record} |
|
3076 |
|
3077 The {\it matrix data record} defines several 2-tuples (doublets) in |
|
3078 a matrix format and has the following syntactic form: |
|
3079 |
|
3080 \newpage |
|
3081 |
|
3082 $$\begin{array}{cccccc} |
|
3083 \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ |
|
3084 r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ |
|
3085 r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ |
|
3086 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ |
|
3087 r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ |
|
3088 \end{array}$$ |
|
3089 where $r_1$, $r_2$, \dots, $r_m$ are numbers and/or symbols |
|
3090 corresponding to rows of the matrix; $c_1$, $c_2$, \dots, $c_n$ are |
|
3091 numbers and/or symbols corresponding to columns of the matrix, $a_{11}$, |
|
3092 $a_{12}$, \dots, $a_{mn}$ are matrix elements, which can be either |
|
3093 {\tt+} or {\tt-}. (In this data record the delimiter {\tt:} preceding |
|
3094 the column list and the delimiter {\tt:=} following the column list |
|
3095 cannot be omitted.) |
|
3096 |
|
3097 Each element $a_{ij}$ of the matrix data block (where $1\leq i\leq m$, |
|
3098 $1\leq j\leq n$) corresponds to 2-tuple $(r_i,c_j)$. If $a_{ij}$ is the |
|
3099 plus sign ({\tt+}), that 2-tuple (or a longer $n$-tuple, if a slice is |
|
3100 used) is included in the elemental set. Otherwise, if $a_{ij}$ is the |
|
3101 minus sign ({\tt-}), that 2-tuple is not included in the elemental set. |
|
3102 |
|
3103 Since the matrix data record defines 2-tuples, either the elemental set |
|
3104 must consist of 2-tuples or the slice currently used must be |
|
3105 2-dimensional. |
|
3106 |
|
3107 \subsubsection{Transposed matrix data record} |
|
3108 |
|
3109 The {\it transposed matrix data record} has the following syntactic |
|
3110 form: |
|
3111 $$\begin{array}{cccccc} |
|
3112 \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ |
|
3113 r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ |
|
3114 r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ |
|
3115 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ |
|
3116 r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ |
|
3117 \end{array}$$ |
|
3118 (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is |
|
3119 optional and may be omitted.) |
|
3120 |
|
3121 This data record is completely analogous to the matrix data record (see |
|
3122 above) with only exception that in this case each element $a_{ij}$ of |
|
3123 the matrix corresponds to 2-tuple $(c_j,r_i)$ rather than $(r_i,c_j)$. |
|
3124 |
|
3125 Being once specified the {\tt(tr)} indicator affects all subsequent |
|
3126 data records until either a slice or the end of data block is |
|
3127 encountered. |
|
3128 |
|
3129 \subsection{Parameter data block} |
|
3130 |
|
3131 \medskip |
|
3132 |
|
3133 \framebox[345pt][l]{ |
|
3134 \parbox[c][80pt]{345pt}{ |
|
3135 \hspace{6pt} {\tt param} {\it name} {\tt,} {\it record} {\tt,} \dots |
|
3136 {\tt,} {\it record} {\tt;} |
|
3137 |
|
3138 \medskip |
|
3139 |
|
3140 \hspace{6pt} {\tt param} {\it name} {\tt default} {\it value} {\tt,} |
|
3141 {\it record} {\tt,} \dots {\tt,} {\it record} {\tt;} |
|
3142 |
|
3143 \medskip |
|
3144 |
|
3145 \hspace{6pt} {\tt param} {\tt:} {\it tabbing-data} {\tt;} |
|
3146 |
|
3147 \medskip |
|
3148 |
|
3149 \hspace{6pt} {\tt param} {\tt default} {\it value} {\tt:} |
|
3150 {\it tabbing-data} {\tt;} |
|
3151 }} |
|
3152 |
|
3153 \newpage |
|
3154 |
|
3155 \setlength{\leftmargini}{60pt} |
|
3156 |
|
3157 \begin{description} |
|
3158 \item[{\rm Where:}\hspace*{23pt}] {\it name} is a symbolic name of the |
|
3159 parameter; |
|
3160 \item[\hspace*{54pt}] {\it value} is an optional default value of the |
|
3161 parameter; |
|
3162 \item[\hspace*{54pt}] {\it record}, \dots, {\it record} are data |
|
3163 records; |
|
3164 \item[\hspace*{54pt}] {\it tabbing-data} specifies parameter data in |
|
3165 the tabbing format. |
|
3166 \end{description} |
|
3167 |
|
3168 \begin{description} |
|
3169 \item[{\rm Note:}\hspace*{31pt}] Commae preceding data records may be |
|
3170 omitted. |
|
3171 \end{description} |
|
3172 |
|
3173 \noindent Data records: |
|
3174 |
|
3175 \begin{description} |
|
3176 \item[{\tt :=}\hspace*{45pt}] is a non-significant data record, which |
|
3177 may be used freely to improve readability; |
|
3178 \item[{\tt[} {\it slice} {\tt]}\hspace*{18.5pt}] specifies a slice; |
|
3179 \item[{\it plain-data}\hspace*{11pt}] specifies parameter data in the |
|
3180 plain format; |
|
3181 \item[{\tt:} {\it tabular-data}]\hspace*{0pt}\\ |
|
3182 specifies parameter data in the tabular format; |
|
3183 \item[{\tt(tr)} {\tt:} {\it tabular-data}]\hspace*{0pt}\\ |
|
3184 specifies set data in the transposed tabular format. (In this case the |
|
3185 colon following the keyword {\tt(tr)} may be omitted.) |
|
3186 \end{description} |
|
3187 |
|
3188 \noindent{\bf Examples} |
|
3189 |
|
3190 \begin{verbatim} |
|
3191 param T := 4; |
|
3192 param month := 1 'Jan' 2 'Feb' 3 'Mar' 4 'Apr' 5 'May'; |
|
3193 param month := [1] Jan, [2] Feb, [3] Mar, [4] Apr, [5] May; |
|
3194 param day := [Sun] 0, [Mon] 1, [Tue] 2, [Wed] 3, [Thu] 4, |
|
3195 [Fri] 5, [Sat] 6; |
|
3196 param init_stock := iron 7.32 nickel 35.8; |
|
3197 param init_stock [*] iron 7.32, nickel 35.8; |
|
3198 param cost [iron] .025 [nickel] .03; |
|
3199 param value := iron -.1, nickel .02; |
|
3200 param : init_stock cost value := |
|
3201 iron 7.32 .025 -.1 |
|
3202 nickel 35.8 .03 .02 ; |
|
3203 param : raw : init_stock cost value := |
|
3204 iron 7.32 .025 -.1 |
|
3205 nickel 35.8 .03 .02 ; |
|
3206 param demand default 0 (tr) |
|
3207 : FRA DET LAN WIN STL FRE LAF := |
|
3208 bands 300 . 100 75 . 225 250 |
|
3209 coils 500 750 400 250 . 850 500 |
|
3210 plate 100 . . 50 200 . 250 ; |
|
3211 \end{verbatim} |
|
3212 |
|
3213 \newpage |
|
3214 |
|
3215 \begin{verbatim} |
|
3216 param trans_cost := |
|
3217 [*,*,bands]: FRA DET LAN WIN STL FRE LAF := |
|
3218 GARY 30 10 8 10 11 71 6 |
|
3219 CLEV 22 7 10 7 21 82 13 |
|
3220 PITT 19 11 12 10 25 83 15 |
|
3221 [*,*,coils]: FRA DET LAN WIN STL FRE LAF := |
|
3222 GARY 39 14 11 14 16 82 8 |
|
3223 CLEV 27 9 12 9 26 95 17 |
|
3224 PITT 24 14 17 13 28 99 20 |
|
3225 [*,*,plate]: FRA DET LAN WIN STL FRE LAF := |
|
3226 GARY 41 15 12 16 17 86 8 |
|
3227 CLEV 29 9 13 9 28 99 18 |
|
3228 PITT 26 14 17 13 31 104 20 ; |
|
3229 \end{verbatim} |
|
3230 |
|
3231 The {\it parameter data block} is used to specify complete data for a |
|
3232 parameter (or parameters, if data are specified in the tabbing format). |
|
3233 |
|
3234 Data blocks can be specified only for non-computable parameters, i.e. |
|
3235 for parameters, which have no assign ({\tt:=}) attribute in the |
|
3236 corresponding parameter statements. |
|
3237 |
|
3238 Data defined in the parameter data block are coded as a sequence of |
|
3239 data records described below. Additionally the data block can be |
|
3240 provided with the optional {\tt default} attribute, which specifies a |
|
3241 default numeric or symbolic value of the parameter (parameters). This |
|
3242 default value is assigned to the parameter or its members, if |
|
3243 no appropriate value is defined in the parameter data block. The |
|
3244 {\tt default} attribute cannot be used, if it is already specified in |
|
3245 the corresponding parameter statement. |
|
3246 |
|
3247 \subsubsection{Assign data record} |
|
3248 |
|
3249 The {\it assign} ({\tt:=}) {\it data record} is a non-signficant |
|
3250 element. It may be used for improving readability of data blocks. |
|
3251 |
|
3252 \subsubsection{Slice data record} |
|
3253 |
|
3254 The {\it slice data record} is a control record, which specifies a |
|
3255 {\it slice} of the parameter array. It has the following syntactic form: |
|
3256 |
|
3257 \medskip |
|
3258 |
|
3259 \noindent\hfil |
|
3260 {\tt[} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt]} |
|
3261 |
|
3262 \medskip |
|
3263 |
|
3264 \noindent where $s_1$, $s_2$, \dots, $s_n$ are components of the slice. |
|
3265 |
|
3266 Each component of the slice can be a number or symbol or the asterisk |
|
3267 ({\tt*}). The number of components in the slice must be the same as the |
|
3268 dimension of the parameter. For instance, if the parameter is a |
|
3269 4-dimensional array, the slice must have four components. The number of |
|
3270 asterisks in the slice is called the {\it slice dimension}. |
|
3271 |
|
3272 The effect of using slices is the following. If a $m$-dimensional slice |
|
3273 (i.e. a slice having $m$ asterisks) is specified in the data block, all |
|
3274 subsequent data records must specify subscripts of the parameter |
|
3275 members as if the parameter were $m$-dimensional, not $n$-dimensional. |
|
3276 |
|
3277 Whenever $m$ subscripts are encountered, each asterisk in the slice is |
|
3278 replaced by corresponding subscript that gives $n$ subscripts, which |
|
3279 define the actual parameter member. For example, if the slice |
|
3280 $[a,*,1,2,*]$ is in effect, and subscripts 3 and $b$ are encountered in |
|
3281 a subsequent data record, the complete subscript list used to choose a |
|
3282 parameter member is $[a,3,1,2,b]$. |
|
3283 |
|
3284 It is allowed to specify a slice having no asterisks. Such slice itself |
|
3285 defines a complete subscript list, in which case the next data record |
|
3286 should define only a single value of corresponding parameter member. |
|
3287 |
|
3288 Being once specified the slice effects until either a new slice or the |
|
3289 end of data block is encountered. Note that if no slice is specified in |
|
3290 the data block, one, components of which are all asterisks, is assumed. |
|
3291 |
|
3292 \subsubsection{Plain data record} |
|
3293 |
|
3294 The {\it plain data record} defines a subscript list and a single value |
|
3295 in the plain format. This record has the following syntactic form: |
|
3296 |
|
3297 \medskip |
|
3298 |
|
3299 \noindent\hfil |
|
3300 $t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$ |
|
3301 |
|
3302 \medskip |
|
3303 |
|
3304 \noindent where $t_1$, $t_2$, \dots, $t_n$ are subscripts, and $v$ is a |
|
3305 value. Each subscript as well as the value can be a number or symbol. |
|
3306 Commae following subscripts are optional and may be omitted. |
|
3307 |
|
3308 In case of 0-dimensional parameter or slice the plain data record has |
|
3309 no subscripts and consists of a single value only. |
|
3310 |
|
3311 \subsubsection{Tabular data record} |
|
3312 |
|
3313 The {\it tabular data record} defines several values, where each value |
|
3314 is provided with two subscripts. This record has the following |
|
3315 syntactic form: |
|
3316 $$\begin{array}{cccccc} |
|
3317 \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ |
|
3318 r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ |
|
3319 r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ |
|
3320 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ |
|
3321 r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ |
|
3322 \end{array}$$ |
|
3323 where $r_1$, $r_2$, \dots, $r_m$ are numbers and/or symbols |
|
3324 corresponding to rows of the table; $c_1$, $c_2$, \dots, $c_n$ are |
|
3325 numbers and/or symbols corresponding to columns of the table, $a_{11}$, |
|
3326 $a_{12}$, \dots, $a_{mn}$ are table elements. Each element can be a |
|
3327 number or symbol or the single decimal point ({\tt.}). (In this data |
|
3328 record the delimiter {\tt:} preceding the column list and the delimiter |
|
3329 {\tt:=} following the column list cannot be omitted.) |
|
3330 |
|
3331 Each element $a_{ij}$ of the tabular data block ($1\leq i\leq m$, |
|
3332 $1\leq j\leq n$) defines two subscripts, where the first subscript is |
|
3333 $r_i$, and the second one is $c_j$. These subscripts are used in |
|
3334 conjunction with the current slice to form the complete subscript list |
|
3335 that identifies a particular member of the parameter array. If $a_{ij}$ |
|
3336 is a number or symbol, this value is assigned to the parameter member. |
|
3337 However, if $a_{ij}$ is the single decimal point, the member is |
|
3338 assigned a default value specified either in the parameter data block |
|
3339 or in the parameter statement, or, if no default value is specified, |
|
3340 the member remains undefined. |
|
3341 |
|
3342 Since the tabular data record provides two subscripts for each value, |
|
3343 either the parameter or the slice currently used must be 2-dimensional. |
|
3344 |
|
3345 \subsubsection{Transposed tabular data record} |
|
3346 |
|
3347 The {\it transposed tabular data record} has the following syntactic |
|
3348 form: |
|
3349 $$\begin{array}{cccccc} |
|
3350 \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\ |
|
3351 r_1&a_{11}&a_{12}&\dots&a_{1n}&\\ |
|
3352 r_2&a_{21}&a_{22}&\dots&a_{2n}&\\ |
|
3353 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\ |
|
3354 r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\ |
|
3355 \end{array}$$ |
|
3356 (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is |
|
3357 optional and may be omitted.) |
|
3358 |
|
3359 This data record is completely analogous to the tabular data record |
|
3360 (see above) with only exception that the first subscript defined by |
|
3361 element $a_{ij}$ is $c_j$ while the second one is $r_i$. |
|
3362 |
|
3363 Being once specified the {\tt(tr)} indicator affects all subsequent |
|
3364 data records until either a slice or the end of data block is |
|
3365 encountered. |
|
3366 |
|
3367 \subsubsection{Tabbing data format} |
|
3368 |
|
3369 The parameter data block in the {\it tabbing format} has the following |
|
3370 syntactic form: |
|
3371 $$\begin{array}{p{12pt}@{\ }l@{\ }c@{\ }l@{\ }c@{\ }l@{\ }r@{\ }l@{\ }c |
|
3372 @{\ }l@{\ }c@{\ }l@{\ }l} |
|
3373 \multicolumn{7}{@{}c@{}}{\mbox{\tt param}\ \mbox{\tt default}\ \mbox |
|
3374 {\it value}\ \mbox{\tt:}\ \mbox{\it s}\ \mbox{\tt:}}& |
|
3375 p_1&\mbox{\tt,}&p_2&\mbox{\tt,} \dots \mbox{\tt,}&p_k&\mbox{\tt:=}\\ |
|
3376 &t_{11}&\mbox{\tt,}&t_{12}&\mbox{\tt,} \dots \mbox{\tt,}&t_{1n}& |
|
3377 \mbox{\tt,}&a_{11}&\mbox{\tt,}&a_{12}&\mbox{\tt,} \dots \mbox{\tt,}& |
|
3378 a_{1k}\\ |
|
3379 &t_{21}&\mbox{\tt,}&t_{22}&\mbox{\tt,} \dots \mbox{\tt,}&t_{2n}& |
|
3380 \mbox{\tt,}&a_{21}&\mbox{\tt,}&a_{22}&\mbox{\tt,} \dots \mbox{\tt,}& |
|
3381 a_{2k}\\ |
|
3382 \multicolumn{13}{c} |
|
3383 {.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\ |
|
3384 &t_{m1}&\mbox{\tt,}&t_{m2}&\mbox{\tt,} \dots \mbox{\tt,}&t_{mn}& |
|
3385 \mbox{\tt,}&a_{m1}&\mbox{\tt,}&a_{m2}&\mbox{\tt,} \dots \mbox{\tt,}& |
|
3386 a_{mk}&\mbox{\tt;}\\ |
|
3387 \end{array}$$ |
|
3388 |
|
3389 {\it Notes:} |
|
3390 |
|
3391 1. The keyword {\tt default} may be omitted along with a value |
|
3392 following it. |
|
3393 |
|
3394 2. Symbolic name {\tt s} may be omitted along with the colon following |
|
3395 it. |
|
3396 |
|
3397 3. All comae are optional and may be omitted. |
|
3398 |
|
3399 \medskip |
|
3400 |
|
3401 The data block in the tabbing format shown above is exactly equivalent |
|
3402 to the following data blocks for $j=1,2,\dots,k$: |
|
3403 |
|
3404 \medskip |
|
3405 |
|
3406 {\tt set} {\it s} {\tt:=} |
|
3407 {\tt(}$t_{11}${\tt,}$t_{12}${\tt,}\dots{\tt,}$t_{1n}${\tt)} |
|
3408 {\tt(}$t_{21}${\tt,}$t_{22}${\tt,}\dots{\tt,}$t_{2n}${\tt)} \dots |
|
3409 {\tt(}$t_{m1}${\tt,}$t_{m2}${\tt,}\dots{\tt,}$t_{mn}${\tt)} {\tt;} |
|
3410 |
|
3411 {\tt param} $p_j$ {\tt default} {\it value} {\tt:=} |
|
3412 |
|
3413 $\!${\tt[}$t_{11}${\tt,}$t_{12}${\tt,}\dots{\tt,}$t_{1n}${\tt]} |
|
3414 $a_{1j}$ |
|
3415 {\tt[}$t_{21}${\tt,}$t_{22}${\tt,}\dots{\tt,}$t_{2n}${\tt]} $a_{2j}$ |
|
3416 \dots |
|
3417 {\tt[}$t_{m1}${\tt,}$t_{m2}${\tt,}\dots{\tt,}$t_{mn}${\tt]} $a_{mj}$ |
|
3418 {\tt;} |
|
3419 |
|
3420 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
3421 |
|
3422 \appendix |
|
3423 |
|
3424 \newpage |
|
3425 |
|
3426 \section{Using suffixes} |
|
3427 |
|
3428 Suffixes can be used to retrieve additional values associated with |
|
3429 model variables, constraints, and objectives. |
|
3430 |
|
3431 A {\it suffix} consists of a period ({\tt.}) followed by a non-reserved |
|
3432 keyword. For example, if {\tt x} is a two-dimensional variable, |
|
3433 {\tt x[i,j].lb} is a numeric value equal to the lower bound of |
|
3434 elemental variable {\tt x[i,j]}, which (value) can be used everywhere |
|
3435 in expressions like a numeric parameter. |
|
3436 |
|
3437 For model variables suffixes have the following meaning: |
|
3438 |
|
3439 \medskip |
|
3440 |
|
3441 \begin{tabular}{@{}p{96pt}p{222pt}@{}} |
|
3442 {\tt.lb}&lower bound\\ |
|
3443 {\tt.ub}&upper bound\\ |
|
3444 {\tt.status}&status in the solution:\\ |
|
3445 &0 --- undefined\\ |
|
3446 &1 --- basic\\ |
|
3447 &2 --- non-basic on lower bound\\ |
|
3448 &3 --- non-basic on upper bound\\ |
|
3449 &4 --- non-basic free (unbounded) variable\\ |
|
3450 &5 --- non-basic fixed variable\\ |
|
3451 {\tt.val}&primal value in the solution\\ |
|
3452 {\tt.dual}&dual value (reduced cost) in the solution\\ |
|
3453 \end{tabular} |
|
3454 |
|
3455 \medskip |
|
3456 |
|
3457 For model constraints and objectives suffixes have the following |
|
3458 meaning: |
|
3459 |
|
3460 \medskip |
|
3461 |
|
3462 \begin{tabular}{@{}p{96pt}p{222pt}@{}} |
|
3463 {\tt.lb}&lower bound of the linear form\\ |
|
3464 {\tt.ub}&upper bound of the linear form\\ |
|
3465 {\tt.status}&status in the solution:\\ |
|
3466 &0 --- undefined\\ |
|
3467 &1 --- non-active\\ |
|
3468 &2 --- active on lower bound\\ |
|
3469 &3 --- active on upper bound\\ |
|
3470 &4 --- active free (unbounded) row\\ |
|
3471 &5 --- active equality constraint\\ |
|
3472 {\tt.val}&primal value of the linear form in the solution\\ |
|
3473 {\tt.dual}&dual value (reduced cost) of the linear form in the |
|
3474 solution\\ |
|
3475 \end{tabular} |
|
3476 |
|
3477 \medskip |
|
3478 |
|
3479 Note that suffixes {\tt.status}, {\tt.val}, and {\tt.dual} can be used |
|
3480 only below the solve statement. |
|
3481 |
|
3482 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
3483 |
|
3484 \newpage |
|
3485 |
|
3486 \section{Date and time functions} |
|
3487 |
|
3488 \noindent\hfil |
|
3489 by Andrew Makhorin \verb|<mao@gnu.org>| |
|
3490 |
|
3491 \noindent\hfil |
|
3492 and Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>| |
|
3493 |
|
3494 \subsection{Obtaining current calendar time} |
|
3495 \label{gmtime} |
|
3496 |
|
3497 To obtain the current calendar time in MathProg there exists the |
|
3498 function {\tt gmtime}. It has no arguments and returns the number of |
|
3499 seconds elapsed since 00:00:00 on January 1, 1970, Coordinated |
|
3500 Universal Time (UTC). For example: |
|
3501 |
|
3502 \medskip |
|
3503 |
|
3504 \verb| param utc := gmtime();| |
|
3505 |
|
3506 \medskip |
|
3507 |
|
3508 MathProg has no function to convert UTC time returned by the function |
|
3509 {\tt gmtime} to {\it local} calendar times. Thus, if you need to |
|
3510 determine the current local calendar time, you have to add to the UTC |
|
3511 time returned the time offset from UTC expressed in seconds. For |
|
3512 example, the time in Berlin during the winter is one hour ahead of UTC |
|
3513 that corresponds to the time offset +1 hour = +3600 secs, so the |
|
3514 current winter calendar time in Berlin may be determined as follows: |
|
3515 |
|
3516 \medskip |
|
3517 |
|
3518 \verb| param now := gmtime() + 3600;| |
|
3519 |
|
3520 \medskip |
|
3521 |
|
3522 \noindent Similarly, the summer time in Chicago (Central Daylight Time) |
|
3523 is five hours behind UTC, so the corresponding current local calendar |
|
3524 time may be determined as follows: |
|
3525 |
|
3526 \medskip |
|
3527 |
|
3528 \verb| param now := gmtime() - 5 * 3600;| |
|
3529 |
|
3530 \medskip |
|
3531 |
|
3532 Note that the value returned by {\tt gmtime} is volatile, i.e. being |
|
3533 called several times this function may return different values. |
|
3534 |
|
3535 \subsection{Converting character string to calendar time} |
|
3536 \label{str2time} |
|
3537 |
|
3538 The function {\tt str2time(}{\it s}{\tt,} {\it f}{\tt)} converts a |
|
3539 character string (timestamp) specified by its first argument {\it s}, |
|
3540 which must be a symbolic expression, to the calendar time suitable for |
|
3541 arithmetic calculations. The conversion is controlled by the specified |
|
3542 format string {\it f} (the second argument), which also must be a |
|
3543 symbolic expression. |
|
3544 |
|
3545 The result of conversion returned by {\tt str2time} has the same |
|
3546 meaning as values returned by the function {\tt gmtime} (see Subsection |
|
3547 \ref{gmtime}, page \pageref{gmtime}). Note that {\tt str2time} does |
|
3548 {\tt not} correct the calendar time returned for the local timezone, |
|
3549 i.e. being applied to 00:00:00 on January 1, 1970 it always returns 0. |
|
3550 |
|
3551 For example, the model statements: |
|
3552 |
|
3553 \medskip |
|
3554 |
|
3555 \verb| param s, symbolic, := "07/14/98 13:47";| |
|
3556 |
|
3557 \verb| param t := str2time(s, "%m/%d/%y %H:%M");| |
|
3558 |
|
3559 \verb| display t;| |
|
3560 |
|
3561 \medskip |
|
3562 |
|
3563 \noindent produce the following printout: |
|
3564 |
|
3565 \medskip |
|
3566 |
|
3567 \verb| t = 900424020| |
|
3568 |
|
3569 \medskip |
|
3570 |
|
3571 \noindent where the calendar time printed corresponds to 13:47:00 on |
|
3572 July 14, 1998. |
|
3573 |
|
3574 \newpage |
|
3575 |
|
3576 The format string passed to the function {\tt str2time} consists of |
|
3577 conversion specifiers and ordinary characters. Each conversion |
|
3578 specifier begins with a percent ({\tt\%}) character followed by a |
|
3579 letter. |
|
3580 |
|
3581 The following conversion specifiers may be used in the format string: |
|
3582 |
|
3583 \medskip |
|
3584 |
|
3585 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3586 {\tt\%b}&The abbreviated month name (case insensitive). At least three |
|
3587 first letters of the month name must appear in the input string.\\ |
|
3588 \end{tabular} |
|
3589 |
|
3590 \medskip |
|
3591 |
|
3592 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3593 {\tt\%d}&The day of the month as a decimal number (range 1 to 31). |
|
3594 Leading zero is permitted, but not required.\\ |
|
3595 \end{tabular} |
|
3596 |
|
3597 \medskip |
|
3598 |
|
3599 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3600 {\tt\%h}&The same as {\tt\%b}.\\ |
|
3601 \end{tabular} |
|
3602 |
|
3603 \medskip |
|
3604 |
|
3605 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3606 {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 0 |
|
3607 to 23). Leading zero is permitted, but not required.\\ |
|
3608 \end{tabular} |
|
3609 |
|
3610 \medskip |
|
3611 |
|
3612 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3613 {\tt\%m}&The month as a decimal number (range 1 to 12). Leading zero is |
|
3614 permitted, but not required.\\ |
|
3615 \end{tabular} |
|
3616 |
|
3617 \medskip |
|
3618 |
|
3619 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3620 {\tt\%M}&The minute as a decimal number (range 0 to 59). Leading zero |
|
3621 is permitted, but not required.\\ |
|
3622 \end{tabular} |
|
3623 |
|
3624 \medskip |
|
3625 |
|
3626 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3627 {\tt\%S}&The second as a decimal number (range 0 to 60). Leading zero |
|
3628 is permitted, but not required.\\ |
|
3629 \end{tabular} |
|
3630 |
|
3631 \medskip |
|
3632 |
|
3633 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3634 {\tt\%y}&The year without a century as a decimal number (range 0 to 99). |
|
3635 Leading zero is permitted, but not required. Input values in the range |
|
3636 0 to 68 are considered as the years 2000 to 2068 while the values 69 to |
|
3637 99 as the years 1969 to 1999.\\ |
|
3638 \end{tabular} |
|
3639 |
|
3640 \medskip |
|
3641 |
|
3642 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3643 {\tt\%z}&The offset from GMT in ISO 8601 format.\\ |
|
3644 \end{tabular} |
|
3645 |
|
3646 \medskip |
|
3647 |
|
3648 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3649 {\tt\%\%}&A literal {\tt\%} character.\\ |
|
3650 \end{tabular} |
|
3651 |
|
3652 \medskip |
|
3653 |
|
3654 All other (ordinary) characters in the format string must have a |
|
3655 matching character in the input string to be converted. Exceptions are |
|
3656 spaces in the input string which can match zero or more space |
|
3657 characters in the format string. |
|
3658 |
|
3659 If some date and/or time component(s) are missing in the format and, |
|
3660 therefore, in the input string, the function {\tt str2time} uses their |
|
3661 default values corresponding to 00:00:00 on January 1, 1970, that is, |
|
3662 the default value of the year is 1970, the default value of the month |
|
3663 is January, etc. |
|
3664 |
|
3665 The function {\tt str2time} is applicable to all calendar times in the |
|
3666 range 00:00:00 on January 1, 0001 to 23:59:59 on December 31, 4000 of |
|
3667 the Gregorian calendar. |
|
3668 |
|
3669 \subsection{Converting calendar time to character string} |
|
3670 \label{time2str} |
|
3671 |
|
3672 The function {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} converts the |
|
3673 calendar time specified by its first argument {\it t}, which must be a |
|
3674 numeric expression, to a character string (symbolic value). The |
|
3675 conversion is controlled by the specified format string {\it f} (the |
|
3676 second argument), which must be a symbolic expression. |
|
3677 |
|
3678 The calendar time passed to {\tt time2str} has the same meaning as |
|
3679 values returned by the function {\tt gmtime} (see Subsection |
|
3680 \ref{gmtime}, page \pageref{gmtime}). Note that {\tt time2str} does |
|
3681 {\it not} correct the specified calendar time for the local timezone, |
|
3682 i.e. the calendar time 0 always corresponds to 00:00:00 on January 1, |
|
3683 1970. |
|
3684 |
|
3685 For example, the model statements: |
|
3686 |
|
3687 \medskip |
|
3688 |
|
3689 \verb| param s, symbolic, := time2str(gmtime(), "%FT%TZ");| |
|
3690 |
|
3691 \verb| display s;| |
|
3692 |
|
3693 \medskip |
|
3694 |
|
3695 \noindent may produce the following printout: |
|
3696 |
|
3697 \medskip |
|
3698 |
|
3699 \verb| s = '2008-12-04T00:23:45Z'| |
|
3700 |
|
3701 \medskip |
|
3702 |
|
3703 \noindent which is a timestamp in the ISO format. |
|
3704 |
|
3705 The format string passed to the function {\tt time2str} consists of |
|
3706 conversion specifiers and ordinary characters. Each conversion |
|
3707 specifier begins with a percent ({\tt\%}) character followed by a |
|
3708 letter. |
|
3709 |
|
3710 The following conversion specifiers may be used in the format string: |
|
3711 |
|
3712 \medskip |
|
3713 |
|
3714 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3715 {\tt\%a}&The abbreviated (2-character) weekday name.\\ |
|
3716 \end{tabular} |
|
3717 |
|
3718 \medskip |
|
3719 |
|
3720 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3721 {\tt\%A}&The full weekday name.\\ |
|
3722 \end{tabular} |
|
3723 |
|
3724 \medskip |
|
3725 |
|
3726 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3727 {\tt\%b}&The abbreviated (3-character) month name.\\ |
|
3728 \end{tabular} |
|
3729 |
|
3730 \medskip |
|
3731 |
|
3732 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3733 {\tt\%B}&The full month name.\\ |
|
3734 \end{tabular} |
|
3735 |
|
3736 \medskip |
|
3737 |
|
3738 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3739 {\tt\%C}&The century of the year, that is the greatest integer not |
|
3740 greater than the year divided by 100.\\ |
|
3741 \end{tabular} |
|
3742 |
|
3743 \medskip |
|
3744 |
|
3745 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3746 {\tt\%d}&The day of the month as a decimal number (range 01 to 31).\\ |
|
3747 \end{tabular} |
|
3748 |
|
3749 \medskip |
|
3750 |
|
3751 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3752 {\tt\%D}&The date using the format \verb|%m/%d/%y|.\\ |
|
3753 \end{tabular} |
|
3754 |
|
3755 \medskip |
|
3756 |
|
3757 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3758 {\tt\%e}&The day of the month like with \verb|%d|, but padded with |
|
3759 blank rather than zero.\\ |
|
3760 \end{tabular} |
|
3761 |
|
3762 \medskip |
|
3763 |
|
3764 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3765 {\tt\%F}&The date using the format \verb|%Y-%m-%d|.\\ |
|
3766 \end{tabular} |
|
3767 |
|
3768 \medskip |
|
3769 |
|
3770 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3771 {\tt\%g}&The year corresponding to the ISO week number, but without the |
|
3772 century (range 00 to 99). This has the same format and value as |
|
3773 \verb|%y|, except that if the ISO week number (see \verb|%V|) belongs |
|
3774 to the previous or next year, that year is used instead.\\ |
|
3775 \end{tabular} |
|
3776 |
|
3777 \medskip |
|
3778 |
|
3779 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3780 {\tt\%G}&The year corresponding to the ISO week number. This has the |
|
3781 same format and value as \verb|%Y|, except that if the ISO week number |
|
3782 (see \verb|%V|) belongs to the previous or next year, that year is used |
|
3783 instead. |
|
3784 \end{tabular} |
|
3785 |
|
3786 \medskip |
|
3787 |
|
3788 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3789 {\tt\%h}&The same as \verb|%b|.\\ |
|
3790 \end{tabular} |
|
3791 |
|
3792 \medskip |
|
3793 |
|
3794 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3795 {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 00 |
|
3796 to 23).\\ |
|
3797 \end{tabular} |
|
3798 |
|
3799 \medskip |
|
3800 |
|
3801 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3802 {\tt\%I}&The hour as a decimal number, using a 12-hour clock (range 01 |
|
3803 to 12).\\ |
|
3804 \end{tabular} |
|
3805 |
|
3806 \medskip |
|
3807 |
|
3808 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3809 {\tt\%j}&The day of the year as a decimal number (range 001 to 366).\\ |
|
3810 \end{tabular} |
|
3811 |
|
3812 \medskip |
|
3813 |
|
3814 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3815 {\tt\%k}&The hour as a decimal number, using a 24-hour clock like |
|
3816 \verb|%H|, but padded with blank rather than zero.\\ |
|
3817 \end{tabular} |
|
3818 |
|
3819 \medskip |
|
3820 |
|
3821 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3822 {\tt\%l}&The hour as a decimal number, using a 12-hour clock like |
|
3823 \verb|%I|, but padded with blank rather than zero. |
|
3824 \end{tabular} |
|
3825 |
|
3826 \medskip |
|
3827 |
|
3828 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3829 {\tt\%m}&The month as a decimal number (range 01 to 12).\\ |
|
3830 \end{tabular} |
|
3831 |
|
3832 \medskip |
|
3833 |
|
3834 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3835 {\tt\%M}&The minute as a decimal number (range 00 to 59).\\ |
|
3836 \end{tabular} |
|
3837 |
|
3838 \medskip |
|
3839 |
|
3840 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3841 {\tt\%p}&Either {\tt AM} or {\tt PM}, according to the given time value. |
|
3842 Midnight is treated as {\tt AM} and noon as {\tt PM}.\\ |
|
3843 \end{tabular} |
|
3844 |
|
3845 \medskip |
|
3846 |
|
3847 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3848 {\tt\%P}&Either {\tt am} or {\tt pm}, according to the given time value. |
|
3849 Midnight is treated as {\tt am} and noon as {\tt pm}.\\ |
|
3850 \end{tabular} |
|
3851 |
|
3852 \medskip |
|
3853 |
|
3854 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3855 {\tt\%R}&The hour and minute in decimal numbers using the format |
|
3856 \verb|%H:%M|.\\ |
|
3857 \end{tabular} |
|
3858 |
|
3859 \medskip |
|
3860 |
|
3861 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3862 {\tt\%S}&The second as a decimal number (range 00 to 59).\\ |
|
3863 \end{tabular} |
|
3864 |
|
3865 \medskip |
|
3866 |
|
3867 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3868 {\tt\%T}&The time of day in decimal numbers using the format |
|
3869 \verb|%H:%M:%S|.\\ |
|
3870 \end{tabular} |
|
3871 |
|
3872 \medskip |
|
3873 |
|
3874 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3875 {\tt\%u}&The day of the week as a decimal number (range 1 to 7), Monday |
|
3876 being 1.\\ |
|
3877 \end{tabular} |
|
3878 |
|
3879 \medskip |
|
3880 |
|
3881 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3882 {\tt\%U}&The week number of the current year as a decimal number (range |
|
3883 00 to 53), starting with the first Sunday as the first day of the first |
|
3884 week. Days preceding the first Sunday in the year are considered to be |
|
3885 in week 00. |
|
3886 \end{tabular} |
|
3887 |
|
3888 \medskip |
|
3889 |
|
3890 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3891 {\tt\%V}&The ISO week number as a decimal number (range 01 to 53). ISO |
|
3892 weeks start with Monday and end with Sunday. Week 01 of a year is the |
|
3893 first week which has the majority of its days in that year; this is |
|
3894 equivalent to the week containing January 4. Week 01 of a year can |
|
3895 contain days from the previous year. The week before week 01 of a year |
|
3896 is the last week (52 or 53) of the previous year even if it contains |
|
3897 days from the new year. In other word, if 1 January is Monday, Tuesday, |
|
3898 Wednesday or Thursday, it is in week 01; if 1 January is Friday, |
|
3899 Saturday or Sunday, it is in week 52 or 53 of the previous year.\\ |
|
3900 \end{tabular} |
|
3901 |
|
3902 \medskip |
|
3903 |
|
3904 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3905 {\tt\%w}&The day of the week as a decimal number (range 0 to 6), Sunday |
|
3906 being 0.\\ |
|
3907 \end{tabular} |
|
3908 |
|
3909 \medskip |
|
3910 |
|
3911 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3912 {\tt\%W}&The week number of the current year as a decimal number (range |
|
3913 00 to 53), starting with the first Monday as the first day of the first |
|
3914 week. Days preceding the first Monday in the year are considered to be |
|
3915 in week 00.\\ |
|
3916 \end{tabular} |
|
3917 |
|
3918 \medskip |
|
3919 |
|
3920 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3921 {\tt\%y}&The year without a century as a decimal number (range 00 to |
|
3922 99), that is the year modulo 100.\\ |
|
3923 \end{tabular} |
|
3924 |
|
3925 \medskip |
|
3926 |
|
3927 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3928 {\tt\%Y}&The year as a decimal number, using the Gregorian calendar.\\ |
|
3929 \end{tabular} |
|
3930 |
|
3931 \medskip |
|
3932 |
|
3933 \begin{tabular}{@{}p{20pt}p{298pt}@{}} |
|
3934 {\tt\%\%}&A literal \verb|%| character.\\ |
|
3935 \end{tabular} |
|
3936 |
|
3937 \medskip |
|
3938 |
|
3939 All other (ordinary) characters in the format string are simply copied |
|
3940 to the resultant string. |
|
3941 |
|
3942 The first argument (calendar time) passed to the function {\tt time2str} |
|
3943 must be in the range from $-62135596800$ to $+64092211199$ that |
|
3944 corresponds to the period from 00:00:00 on January 1, 0001 to 23:59:59 |
|
3945 on December 31, 4000 of the Gregorian calendar. |
|
3946 |
|
3947 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
3948 |
|
3949 \newpage |
|
3950 |
|
3951 \section{Table drivers} |
|
3952 \label{drivers} |
|
3953 |
|
3954 \noindent\hfil |
|
3955 by Andrew Makhorin \verb|<mao@gnu.org>| |
|
3956 |
|
3957 \noindent\hfil |
|
3958 and Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>| |
|
3959 |
|
3960 \bigskip\bigskip |
|
3961 |
|
3962 The {\it table driver} is a program module which provides transmitting |
|
3963 data between MathProg model objects and data tables. |
|
3964 |
|
3965 Currently the GLPK package has four table drivers: |
|
3966 |
|
3967 \setlength{\leftmargini}{2.5em} |
|
3968 |
|
3969 \begin{itemize} |
|
3970 \item built-in CSV table driver; |
|
3971 \item built-in xBASE table driver; |
|
3972 \item ODBC table driver; |
|
3973 \item MySQL table driver. |
|
3974 \end{itemize} |
|
3975 |
|
3976 \subsection{CSV table driver} |
|
3977 |
|
3978 The CSV table driver assumes that the data table is represented in the |
|
3979 form of a plain text file in the CSV (comma-separated values) file |
|
3980 format as described below. |
|
3981 |
|
3982 To choose the CSV table driver its name in the table statement should |
|
3983 be specified as \verb|"CSV"|, and the only argument should specify the |
|
3984 name of a plain text file containing the table. For example: |
|
3985 |
|
3986 \medskip |
|
3987 |
|
3988 \verb| table data IN "CSV" "data.csv": ... ;| |
|
3989 |
|
3990 \medskip |
|
3991 |
|
3992 The filename suffix may be arbitrary, however, it is recommended to use |
|
3993 the suffix `\verb|.csv|'. |
|
3994 |
|
3995 On reading input tables the CSV table driver provides an implicit field |
|
3996 named \verb|RECNO|, which contains the current record number. This |
|
3997 field can be specified in the input table statement as if there were |
|
3998 the actual field having the name \verb|RECNO| in the CSV file. For |
|
3999 example: |
|
4000 |
|
4001 \medskip |
|
4002 |
|
4003 \verb| table list IN "CSV" "list.csv": num <- [RECNO], ... ;| |
|
4004 |
|
4005 \subsubsection*{CSV format\footnote{This material is based on the RFC |
|
4006 document 4180.}} |
|
4007 |
|
4008 The CSV (comma-separated values) format is a plain text file format |
|
4009 defined as follows. |
|
4010 |
|
4011 1. Each record is located on a separate line, delimited by a line |
|
4012 break. For example: |
|
4013 |
|
4014 \medskip |
|
4015 |
|
4016 \verb| aaa,bbb,ccc\n| |
|
4017 |
|
4018 \verb| xxx,yyy,zzz\n| |
|
4019 |
|
4020 \medskip |
|
4021 |
|
4022 \noindent |
|
4023 where \verb|\n| means the control character \verb|LF| ({\tt 0x0A}). |
|
4024 |
|
4025 \newpage |
|
4026 |
|
4027 2. The last record in the file may or may not have an ending line |
|
4028 break. For example: |
|
4029 |
|
4030 \medskip |
|
4031 |
|
4032 \verb| aaa,bbb,ccc\n| |
|
4033 |
|
4034 \verb| xxx,yyy,zzz| |
|
4035 |
|
4036 \medskip |
|
4037 |
|
4038 3. There should be a header line appearing as the first line of the |
|
4039 file in the same format as normal record lines. This header should |
|
4040 contain names corresponding to the fields in the file. The number of |
|
4041 field names in the header line should be the same as the number of |
|
4042 fields in the records of the file. For example: |
|
4043 |
|
4044 \medskip |
|
4045 |
|
4046 \verb| name1,name2,name3\n| |
|
4047 |
|
4048 \verb| aaa,bbb,ccc\n| |
|
4049 |
|
4050 \verb| xxx,yyy,zzz\n| |
|
4051 |
|
4052 \medskip |
|
4053 |
|
4054 4. Within the header and each record there may be one or more fields |
|
4055 separated by commas. Each line should contain the same number of fields |
|
4056 throughout the file. Spaces are considered as part of a field and |
|
4057 therefore not ignored. The last field in the record should not be |
|
4058 followed by a comma. For example: |
|
4059 |
|
4060 \medskip |
|
4061 |
|
4062 \verb| aaa,bbb,ccc\n| |
|
4063 |
|
4064 \medskip |
|
4065 |
|
4066 5. Fields may or may not be enclosed in double quotes. For example: |
|
4067 |
|
4068 \medskip |
|
4069 |
|
4070 \verb| "aaa","bbb","ccc"\n| |
|
4071 |
|
4072 \verb| zzz,yyy,xxx\n| |
|
4073 |
|
4074 \medskip |
|
4075 |
|
4076 6. If a field is enclosed in double quotes, each double quote which is |
|
4077 part of the field should be coded twice. For example: |
|
4078 |
|
4079 \medskip |
|
4080 |
|
4081 \verb| "aaa","b""bb","ccc"\n| |
|
4082 |
|
4083 \medskip |
|
4084 |
|
4085 \noindent{\bf Example} |
|
4086 |
|
4087 \begin{verbatim} |
|
4088 FROM,TO,DISTANCE,COST |
|
4089 Seattle,New-York,2.5,0.12 |
|
4090 Seattle,Chicago,1.7,0.08 |
|
4091 Seattle,Topeka,1.8,0.09 |
|
4092 San-Diego,New-York,2.5,0.15 |
|
4093 San-Diego,Chicago,1.8,0.10 |
|
4094 San-Diego,Topeka,1.4,0.07 |
|
4095 \end{verbatim} |
|
4096 |
|
4097 \subsection{xBASE table driver} |
|
4098 |
|
4099 The xBASE table driver assumes that the data table is stored in the |
|
4100 .dbf file format. |
|
4101 |
|
4102 To choose the xBASE table driver its name in the table statement should |
|
4103 be specified as \verb|"xBASE"|, and the first argument should specify |
|
4104 the name of a .dbf file containing the table. For the output table there |
|
4105 should be the second argument defining the table format in the form |
|
4106 \verb|"FF...F"|, where \verb|F| is either {\tt C({\it n})}, |
|
4107 which specifies a character field of length $n$, or |
|
4108 {\tt N({\it n}{\rm [},{\it p}{\rm ]})}, which specifies a numeric field |
|
4109 of length $n$ and precision $p$ (by default $p$ is 0). |
|
4110 |
|
4111 The following is a simple example which illustrates creating and |
|
4112 reading a .dbf file: |
|
4113 |
|
4114 \begin{verbatim} |
|
4115 table tab1{i in 1..10} OUT "xBASE" "foo.dbf" |
|
4116 "N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A, |
|
4117 "?" ~ FOO, "[" & i & "]" ~ C; |
|
4118 set S, dimen 4; |
|
4119 table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A]; |
|
4120 display S; |
|
4121 end; |
|
4122 \end{verbatim} |
|
4123 |
|
4124 \subsection{ODBC table driver} |
|
4125 |
|
4126 The ODBC table driver allows connecting to SQL databases using an |
|
4127 implementation of the ODBC interface based on the Call Level Interface |
|
4128 (CLI).\footnote{The corresponding software standard is defined in |
|
4129 ISO/IEC 9075-3:2003.} |
|
4130 |
|
4131 \paragraph{Debian GNU/Linux.} |
|
4132 Under Debian GNU/Linux the ODBC table driver uses the iODBC |
|
4133 package,\footnote{See {\tt<http://www.iodbc.org/>}.} which should be |
|
4134 installed before building the GLPK package. The installation can be |
|
4135 effected with the following command: |
|
4136 |
|
4137 \begin{verbatim} |
|
4138 sudo apt-get install libiodbc2-dev |
|
4139 \end{verbatim} |
|
4140 |
|
4141 Note that on configuring the GLPK package to enable using the iODBC |
|
4142 library the option `\verb|--enable-odbc|' should be passed to the |
|
4143 configure script. |
|
4144 |
|
4145 The individual databases must be entered for systemwide usage in |
|
4146 \linebreak \verb|/etc/odbc.ini| and \verb|/etc/odbcinst.ini|. Database |
|
4147 connections to be used by a single user are specified by files in the |
|
4148 home directory (\verb|.odbc.ini| and \verb|.odbcinst.ini|). |
|
4149 |
|
4150 \paragraph{Microsoft Windows.} |
|
4151 Under Microsoft Windows the ODBC table driver uses the Microsoft ODBC |
|
4152 library. To enable this feature the symbol: |
|
4153 |
|
4154 \begin{verbatim} |
|
4155 #define ODBC_DLNAME "odbc32.dll" |
|
4156 \end{verbatim} |
|
4157 |
|
4158 \noindent |
|
4159 should be defined in the GLPK configuration file `\verb|config.h|'. |
|
4160 |
|
4161 Data sources can be created via the Administrative Tools from the |
|
4162 Control Panel. |
|
4163 |
|
4164 \bigskip |
|
4165 |
|
4166 To choose the ODBC table driver its name in the table statement should |
|
4167 be specified as \verb|'ODBC'| or \verb|'iODBC'|. |
|
4168 |
|
4169 The argument list is specified as follows. |
|
4170 |
|
4171 The first argument is the connection string passed to the ODBC library, |
|
4172 for example: |
|
4173 |
|
4174 \verb|'DSN=glpk;UID=user;PWD=password'|, or |
|
4175 |
|
4176 \verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|. |
|
4177 |
|
4178 Different parts of the string are separated by semicolons. Each part |
|
4179 consists of a pair {\it fieldname} and {\it value} separated by the |
|
4180 equal sign. Allowable fieldnames depend on the ODBC library. Typically |
|
4181 the following fieldnames are allowed: |
|
4182 |
|
4183 \verb|DATABASE | database; |
|
4184 |
|
4185 \verb|DRIVER | ODBC driver; |
|
4186 |
|
4187 \verb|DSN | name of a data source; |
|
4188 |
|
4189 \verb|FILEDSN | name of a file data source; |
|
4190 |
|
4191 \verb|PWD | user password; |
|
4192 |
|
4193 \verb|SERVER | database; |
|
4194 |
|
4195 \verb|UID | user name. |
|
4196 |
|
4197 The second argument and all following are considered to be SQL |
|
4198 statements |
|
4199 |
|
4200 SQL statements may be spread over multiple arguments. If the last |
|
4201 character of an argument is a semicolon this indicates the end of |
|
4202 a SQL statement. |
|
4203 |
|
4204 The arguments of a SQL statement are concatenated separated by space. |
|
4205 The eventual trailing semicolon will be removed. |
|
4206 |
|
4207 All but the last SQL statement will be executed directly. |
|
4208 |
|
4209 For IN-table the last SQL statement can be a SELECT command starting |
|
4210 with the capitalized letters \verb|'SELECT '|. If the string does not |
|
4211 start with \verb|'SELECT '| it is considered to be a table name and a |
|
4212 SELECT statement is automatically generated. |
|
4213 |
|
4214 For OUT-table the last SQL statement can contain one or multiple |
|
4215 question marks. If it contains a question mark it is considered a |
|
4216 template for the write routine. Otherwise the string is considered a |
|
4217 table name and an INSERT template is automatically generated. |
|
4218 |
|
4219 The writing routine uses the template with the question marks and |
|
4220 replaces the first question mark by the first output parameter, the |
|
4221 second question mark by the second output parameter and so forth. Then |
|
4222 the SQL command is issued. |
|
4223 |
|
4224 The following is an example of the output table statement: |
|
4225 |
|
4226 \begin{small} |
|
4227 \begin{verbatim} |
|
4228 table ta { l in LOCATIONS } OUT |
|
4229 'ODBC' |
|
4230 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' |
|
4231 'DROP TABLE IF EXISTS result;' |
|
4232 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' |
|
4233 'INSERT INTO result 'VALUES ( 4, ?, ? )' : |
|
4234 l ~ LOC, quantity[l] ~ QUAN; |
|
4235 \end{verbatim} |
|
4236 \end{small} |
|
4237 |
|
4238 \noindent |
|
4239 Alternatively it could be written as follows: |
|
4240 |
|
4241 \begin{small} |
|
4242 \begin{verbatim} |
|
4243 table ta { l in LOCATIONS } OUT |
|
4244 'ODBC' |
|
4245 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' |
|
4246 'DROP TABLE IF EXISTS result;' |
|
4247 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' |
|
4248 'result' : |
|
4249 l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID; |
|
4250 \end{verbatim} |
|
4251 \end{small} |
|
4252 |
|
4253 Using templates with `\verb|?|' supports not only INSERT, but also |
|
4254 UPDATE, DELETE, etc. For example: |
|
4255 |
|
4256 \begin{small} |
|
4257 \begin{verbatim} |
|
4258 table ta { l in LOCATIONS } OUT |
|
4259 'ODBC' |
|
4260 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword' |
|
4261 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;' |
|
4262 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' : |
|
4263 quantity[l], l; |
|
4264 \end{verbatim} |
|
4265 \end{small} |
|
4266 |
|
4267 \subsection{MySQL table driver} |
|
4268 |
|
4269 The MySQL table driver allows connecting to MySQL databases. |
|
4270 |
|
4271 \paragraph{Debian GNU/Linux.} |
|
4272 Under Debian GNU/Linux the MySQL table\linebreak driver uses the MySQL |
|
4273 package,\footnote{For download development files see |
|
4274 {\tt<http://dev.mysql.com/downloads/mysql/>}.} which should be installed |
|
4275 before building the GLPK package. The installation can be effected with |
|
4276 the following command: |
|
4277 |
|
4278 \begin{verbatim} |
|
4279 sudo apt-get install libmysqlclient15-dev |
|
4280 \end{verbatim} |
|
4281 |
|
4282 Note that on configuring the GLPK package to enable using the MySQL |
|
4283 library the option `\verb|--enable-mysql|' should be passed to the |
|
4284 configure script. |
|
4285 |
|
4286 \paragraph{Microsoft Windows.} |
|
4287 Under Microsoft Windows the MySQL table driver also uses the MySQL |
|
4288 library. To enable this feature the symbol: |
|
4289 |
|
4290 \begin{verbatim} |
|
4291 #define MYSQL_DLNAME "libmysql.dll" |
|
4292 \end{verbatim} |
|
4293 |
|
4294 \noindent |
|
4295 should be defined in the GLPK configuration file `\verb|config.h|'. |
|
4296 |
|
4297 \bigskip |
|
4298 |
|
4299 To choose the MySQL table driver its name in the table statement should |
|
4300 be specified as \verb|'MySQL'|. |
|
4301 |
|
4302 The argument list is specified as follows. |
|
4303 |
|
4304 The first argument specifies how to connect the data base in the DSN |
|
4305 style, for example: |
|
4306 |
|
4307 \verb|'Database=glpk;UID=glpk;PWD=gnu'|. |
|
4308 |
|
4309 Different parts of the string are separated by semicolons. Each part |
|
4310 consists of a pair {\it fieldname} and {\it value} separated by the |
|
4311 equal sign. The following fieldnames are allowed: |
|
4312 |
|
4313 \verb|Server | server running the database (defaulting to localhost); |
|
4314 |
|
4315 \verb|Database | name of the database; |
|
4316 |
|
4317 \verb|UID | user name; |
|
4318 |
|
4319 \verb|PWD | user password; |
|
4320 |
|
4321 \verb|Port | port used by the server (defaulting to 3306). |
|
4322 |
|
4323 The second argument and all following are considered to be SQL |
|
4324 statements |
|
4325 |
|
4326 SQL statements may be spread over multiple arguments. If the last |
|
4327 character of an argument is a semicolon this indicates the end of |
|
4328 a SQL statement. |
|
4329 |
|
4330 The arguments of a SQL statement are concatenated separated by space. |
|
4331 The eventual trailing semicolon will be removed. |
|
4332 |
|
4333 All but the last SQL statement will be executed directly. |
|
4334 |
|
4335 For IN-table the last SQL statement can be a SELECT command starting |
|
4336 with the capitalized letters \verb|'SELECT '|. If the string does not |
|
4337 start with \verb|'SELECT '| it is considered to be a table name and a |
|
4338 SELECT statement is automatically generated. |
|
4339 |
|
4340 For OUT-table the last SQL statement can contain one or multiple |
|
4341 question marks. If it contains a question mark it is considered a |
|
4342 template for the write routine. Otherwise the string is considered a |
|
4343 table name and an INSERT template is automatically generated. |
|
4344 |
|
4345 The writing routine uses the template with the question marks and |
|
4346 replaces the first question mark by the first output parameter, the |
|
4347 second question mark by the second output parameter and so forth. Then |
|
4348 the SQL command is issued. |
|
4349 |
|
4350 The following is an example of the output table statement: |
|
4351 |
|
4352 \begin{small} |
|
4353 \begin{verbatim} |
|
4354 table ta { l in LOCATIONS } OUT |
|
4355 'MySQL' |
|
4356 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' |
|
4357 'DROP TABLE IF EXISTS result;' |
|
4358 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' |
|
4359 'INSERT INTO result VALUES ( 4, ?, ? )' : |
|
4360 l ~ LOC, quantity[l] ~ QUAN; |
|
4361 \end{verbatim} |
|
4362 \end{small} |
|
4363 |
|
4364 \noindent |
|
4365 Alternatively it could be written as follows: |
|
4366 |
|
4367 \begin{small} |
|
4368 \begin{verbatim} |
|
4369 table ta { l in LOCATIONS } OUT |
|
4370 'MySQL' |
|
4371 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' |
|
4372 'DROP TABLE IF EXISTS result;' |
|
4373 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );' |
|
4374 'result' : |
|
4375 l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID; |
|
4376 \end{verbatim} |
|
4377 \end{small} |
|
4378 |
|
4379 Using templates with `\verb|?|' supports not only INSERT, but also |
|
4380 UPDATE, DELETE, etc. For example: |
|
4381 |
|
4382 \begin{small} |
|
4383 \begin{verbatim} |
|
4384 table ta { l in LOCATIONS } OUT |
|
4385 'MySQL' |
|
4386 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword' |
|
4387 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;' |
|
4388 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' : |
|
4389 quantity[l], l; |
|
4390 \end{verbatim} |
|
4391 \end{small} |
|
4392 |
|
4393 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
4394 |
|
4395 \newpage |
|
4396 |
|
4397 \section{Solving models with glpsol} |
|
4398 |
|
4399 The GLPK package\footnote{{\tt http://www.gnu.org/software/glpk/}} |
|
4400 includes the program {\tt glpsol}, which is a stand-alone LP/MIP solver. |
|
4401 This program can be launched from the command line or from the shell to |
|
4402 solve models written in the GNU MathProg modeling language. |
|
4403 |
|
4404 In order to tell the solver that the input file contains a model |
|
4405 description, you need to specify the option \verb|--model| in the |
|
4406 command line. For example: |
|
4407 |
|
4408 \medskip |
|
4409 |
|
4410 \verb| glpsol --model foo.mod| |
|
4411 |
|
4412 \medskip |
|
4413 |
|
4414 Sometimes it is necessary to use the data section placed in a separate |
|
4415 file, in which case you may use the following command: |
|
4416 |
|
4417 \medskip |
|
4418 |
|
4419 \verb| glpsol --model foo.mod --data foo.dat| |
|
4420 |
|
4421 \medskip |
|
4422 |
|
4423 \noindent Note that if the model file also contains the data section, |
|
4424 that section is ignored. |
|
4425 |
|
4426 If the model description contains some display and/or printf statements, |
|
4427 by default the output is sent to the terminal. In order to redirect the |
|
4428 output to a file you may use the following command: |
|
4429 |
|
4430 \medskip |
|
4431 |
|
4432 \verb| glpsol --model foo.mod --display foo.out| |
|
4433 |
|
4434 \medskip |
|
4435 |
|
4436 If you need to look at the problem, which has been generated by the |
|
4437 model translator, you may use the option \verb|--wlp| as follows: |
|
4438 |
|
4439 \medskip |
|
4440 |
|
4441 \verb| glpsol --model foo.mod --wlp foo.lp| |
|
4442 |
|
4443 \medskip |
|
4444 |
|
4445 \noindent in which case the problem data is written to file |
|
4446 \verb|foo.lp| in CPLEX LP format suitable for visual analysis. |
|
4447 |
|
4448 Sometimes it is needed merely to check the model description not |
|
4449 solving the generated problem instance. In this case you may specify |
|
4450 the option \verb|--check|, for example: |
|
4451 |
|
4452 \medskip |
|
4453 |
|
4454 \verb| glpsol --check --model foo.mod --wlp foo.lp| |
|
4455 |
|
4456 \medskip |
|
4457 |
|
4458 In order to write a numeric solution obtained by the solver you may use |
|
4459 the following command: |
|
4460 |
|
4461 \medskip |
|
4462 |
|
4463 \verb| glpsol --model foo.mod --output foo.sol| |
|
4464 |
|
4465 \medskip |
|
4466 |
|
4467 \noindent in which case the solution is written to file \verb|foo.sol| |
|
4468 in a plain text format. |
|
4469 |
|
4470 The complete list of the \verb|glpsol| options can be found in the |
|
4471 reference manual included in the GLPK distribution. |
|
4472 |
|
4473 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
4474 |
|
4475 \newpage |
|
4476 |
|
4477 \section{Example model description} |
|
4478 |
|
4479 \subsection{Model description written in MathProg} |
|
4480 |
|
4481 Below here is a complete example of the model description written in |
|
4482 the GNU MathProg modeling language. |
|
4483 |
|
4484 \begin{small} |
|
4485 \begin{verbatim} |
|
4486 # A TRANSPORTATION PROBLEM |
|
4487 # |
|
4488 # This problem finds a least cost shipping schedule that meets |
|
4489 # requirements at markets and supplies at factories. |
|
4490 # |
|
4491 # References: |
|
4492 # Dantzig G B, "Linear Programming and Extensions." |
|
4493 # Princeton University Press, Princeton, New Jersey, 1963, |
|
4494 # Chapter 3-3. |
|
4495 |
|
4496 set I; |
|
4497 /* canning plants */ |
|
4498 |
|
4499 set J; |
|
4500 /* markets */ |
|
4501 |
|
4502 param a{i in I}; |
|
4503 /* capacity of plant i in cases */ |
|
4504 |
|
4505 param b{j in J}; |
|
4506 /* demand at market j in cases */ |
|
4507 |
|
4508 param d{i in I, j in J}; |
|
4509 /* distance in thousands of miles */ |
|
4510 |
|
4511 param f; |
|
4512 /* freight in dollars per case per thousand miles */ |
|
4513 |
|
4514 param c{i in I, j in J} := f * d[i,j] / 1000; |
|
4515 /* transport cost in thousands of dollars per case */ |
|
4516 |
|
4517 var x{i in I, j in J} >= 0; |
|
4518 /* shipment quantities in cases */ |
|
4519 |
|
4520 minimize cost: sum{i in I, j in J} c[i,j] * x[i,j]; |
|
4521 /* total transportation costs in thousands of dollars */ |
|
4522 |
|
4523 s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i]; |
|
4524 /* observe supply limit at plant i */ |
|
4525 |
|
4526 s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j]; |
|
4527 /* satisfy demand at market j */ |
|
4528 |
|
4529 data; |
|
4530 |
|
4531 set I := Seattle San-Diego; |
|
4532 |
|
4533 set J := New-York Chicago Topeka; |
|
4534 |
|
4535 param a := Seattle 350 |
|
4536 San-Diego 600; |
|
4537 |
|
4538 param b := New-York 325 |
|
4539 Chicago 300 |
|
4540 Topeka 275; |
|
4541 |
|
4542 param d : New-York Chicago Topeka := |
|
4543 Seattle 2.5 1.7 1.8 |
|
4544 San-Diego 2.5 1.8 1.4 ; |
|
4545 |
|
4546 param f := 90; |
|
4547 |
|
4548 end; |
|
4549 \end{verbatim} |
|
4550 \end{small} |
|
4551 |
|
4552 \subsection{Generated LP problem instance} |
|
4553 |
|
4554 Below here is the result of the translation of the example model |
|
4555 produced by the solver \verb|glpsol| and written in CPLEX LP format |
|
4556 with the option \verb|--wlp|. |
|
4557 |
|
4558 \begin{small} |
|
4559 \begin{verbatim} |
|
4560 \* Problem: transp *\ |
|
4561 |
|
4562 Minimize |
|
4563 cost: + 0.225 x(Seattle,New~York) + 0.153 x(Seattle,Chicago) |
|
4564 + 0.162 x(Seattle,Topeka) + 0.225 x(San~Diego,New~York) |
|
4565 + 0.162 x(San~Diego,Chicago) + 0.126 x(San~Diego,Topeka) |
|
4566 |
|
4567 Subject To |
|
4568 supply(Seattle): + x(Seattle,New~York) + x(Seattle,Chicago) |
|
4569 + x(Seattle,Topeka) <= 350 |
|
4570 supply(San~Diego): + x(San~Diego,New~York) + x(San~Diego,Chicago) |
|
4571 + x(San~Diego,Topeka) <= 600 |
|
4572 demand(New~York): + x(Seattle,New~York) + x(San~Diego,New~York) >= 325 |
|
4573 demand(Chicago): + x(Seattle,Chicago) + x(San~Diego,Chicago) >= 300 |
|
4574 demand(Topeka): + x(Seattle,Topeka) + x(San~Diego,Topeka) >= 275 |
|
4575 |
|
4576 End |
|
4577 \end{verbatim} |
|
4578 \end{small} |
|
4579 |
|
4580 \subsection{Optimal LP solution} |
|
4581 |
|
4582 Below here is the optimal solution of the generated LP problem instance |
|
4583 found by the solver \verb|glpsol| and written in plain text format |
|
4584 with the option \verb|--output|. |
|
4585 |
|
4586 \newpage |
|
4587 |
|
4588 \begin{small} |
|
4589 \begin{verbatim} |
|
4590 Problem: transp |
|
4591 Rows: 6 |
|
4592 Columns: 6 |
|
4593 Non-zeros: 18 |
|
4594 Status: OPTIMAL |
|
4595 Objective: cost = 153.675 (MINimum) |
|
4596 |
|
4597 No. Row name St Activity Lower bound Upper bound Marginal |
|
4598 --- ------------ -- ------------ ------------ ------------ ------------ |
|
4599 1 cost B 153.675 |
|
4600 2 supply[Seattle] |
|
4601 B 300 350 |
|
4602 3 supply[San-Diego] |
|
4603 NU 600 600 < eps |
|
4604 4 demand[New-York] |
|
4605 NL 325 325 0.225 |
|
4606 5 demand[Chicago] |
|
4607 NL 300 300 0.153 |
|
4608 6 demand[Topeka] |
|
4609 NL 275 275 0.126 |
|
4610 |
|
4611 No. Column name St Activity Lower bound Upper bound Marginal |
|
4612 --- ------------ -- ------------ ------------ ------------ ------------ |
|
4613 1 x[Seattle,New-York] |
|
4614 B 0 0 |
|
4615 2 x[Seattle,Chicago] |
|
4616 B 300 0 |
|
4617 3 x[Seattle,Topeka] |
|
4618 NL 0 0 0.036 |
|
4619 4 x[San-Diego,New-York] |
|
4620 B 325 0 |
|
4621 5 x[San-Diego,Chicago] |
|
4622 NL 0 0 0.009 |
|
4623 6 x[San-Diego,Topeka] |
|
4624 B 275 0 |
|
4625 |
|
4626 End of output |
|
4627 \end{verbatim} |
|
4628 \end{small} |
|
4629 |
|
4630 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
4631 |
|
4632 \newpage |
|
4633 |
|
4634 \setcounter{secnumdepth}{-1} |
|
4635 |
|
4636 \section{Acknowledgment} |
|
4637 |
|
4638 The authors would like to thank the following people, who kindly read, |
|
4639 commented, and corrected the draft of this document: |
|
4640 |
|
4641 \medskip |
|
4642 |
|
4643 \noindent Juan Carlos Borras \verb|<borras@cs.helsinki.fi>| |
|
4644 |
|
4645 \medskip |
|
4646 |
|
4647 \noindent Harley Mackenzie \verb|<hjm@bigpond.com>| |
|
4648 |
|
4649 \medskip |
|
4650 |
|
4651 \noindent Robbie Morrison \verb|<robbie@actrix.co.nz>| |
|
4652 |
|
4653 \end{document} |