You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7893 lines
290 KiB
7893 lines
290 KiB
%* gmpl.tex *%
|
|
|
|
%***********************************************************************
|
|
% This code is part of GLPK (GNU Linear Programming Kit).
|
|
%
|
|
% Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
|
% 2009, 2010, 2011, 2013, 2014, 2015 Andrew Makhorin, Department for
|
|
% Applied Informatics, Moscow Aviation Institute, Moscow, Russia. All
|
|
% rights reserved. E-mail: <mao@gnu.org>.
|
|
%
|
|
% GLPK is free software: you can redistribute it and/or modify it
|
|
% under the terms of the GNU General Public License as published by
|
|
% the Free Software Foundation, either version 3 of the License, or
|
|
% (at your option) any later version.
|
|
%
|
|
% GLPK is distributed in the hope that it will be useful, but WITHOUT
|
|
% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
|
% License for more details.
|
|
%
|
|
% You should have received a copy of the GNU General Public License
|
|
% along with GLPK. If not, see <http://www.gnu.org/licenses/>.
|
|
%***********************************************************************
|
|
|
|
\documentclass[11pt, brazil]{report}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage{amssymb}
|
|
\usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue,
|
|
urlcolor=blue]{hyperref}
|
|
\usepackage{indentfirst}
|
|
|
|
\setlength{\textwidth}{6.5in}
|
|
\setlength{\textheight}{8.5in}
|
|
\setlength{\oddsidemargin}{0in}
|
|
\setlength{\topmargin}{0in}
|
|
\setlength{\headheight}{0in}
|
|
\setlength{\headsep}{0in}
|
|
\setlength{\footskip}{0.5in}
|
|
\setlength{\parindent}{16pt}
|
|
\setlength{\parskip}{5pt}
|
|
\setlength{\topsep}{0pt}
|
|
\setlength{\partopsep}{0pt}
|
|
\setlength{\itemsep}{\parskip}
|
|
\setlength{\parsep}{0pt}
|
|
\setlength{\leftmargini}{\parindent}
|
|
\renewcommand{\labelitemi}{---}
|
|
|
|
\def\para#1{\noindent{\bf#1}}
|
|
|
|
\renewcommand\contentsname{\sf\bfseries Conteúdo}
|
|
\renewcommand\chaptername{\sf\bfseries Capítulo}
|
|
\renewcommand\appendixname{\sf\bfseries Apêndice}
|
|
|
|
% \renewcommand\contentsname{\sf\bfseries Contents}
|
|
% \renewcommand\chaptername{\sf\bfseries Chapter}
|
|
% \renewcommand\appendixname{\sf\bfseries Appendix}
|
|
|
|
\begin{document}
|
|
|
|
\thispagestyle{empty}
|
|
|
|
\begin{center}
|
|
|
|
\vspace*{1.5in}
|
|
|
|
\begin{huge}
|
|
\sf\bfseries Linguagem de Modelagem GNU MathProg
|
|
\end{huge}
|
|
|
|
\vspace{0.5in}
|
|
|
|
\begin{LARGE}
|
|
\sf Linguagem de Referência % Language Reference
|
|
\end{LARGE}
|
|
|
|
\vspace{0.5in}
|
|
|
|
\begin{LARGE}
|
|
\sf para o GLPK Versão 4.57
|
|
\end{LARGE}
|
|
|
|
\vspace{0.5in}
|
|
\begin{Large}
|
|
\sf (RASCUNHO, Fevereiro 2016)
|
|
\end{Large}
|
|
|
|
\end{center}
|
|
|
|
\newpage
|
|
|
|
\vspace*{1in}
|
|
|
|
\vfill
|
|
|
|
\noindent
|
|
% The GLPK package is part of the GNU Project released under the aegis of GNU.
|
|
O pacote GLPK é parte do Projeto GNU distribuído sob a égide do GNU.
|
|
|
|
\noindent
|
|
Copyright \copyright{} 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
|
2008, 2009, 2010, 2011, 2013, 2014, 2015, 2016 Andrew Makhorin, Department
|
|
for Applied Informatics, Moscow Aviation Institute, Moscow, Russia.
|
|
% All rights reserved.
|
|
Todos os direitos reservados.
|
|
|
|
\noindent
|
|
Título original: Modeling Language GNU MathProg - Language Reference for GLPK Version 4.57
|
|
|
|
\noindent
|
|
Tradução: João Flávio de Freitas Almeida, Departamento de Engenharia de Produção, Universidade Federal de Minas Gerais,
|
|
Minas Gerais, Brasil.
|
|
|
|
\noindent
|
|
Copyright \copyright{} 2015 João Flávio de Freitas Almeida, para esta tradução. Todos os direitos reservados.
|
|
|
|
\noindent
|
|
Free Software Foundation, Inc., Rua Franklin, 51, 5$^{o}$ andar, Boston,
|
|
MA 02110-1301, USA.
|
|
|
|
\noindent
|
|
É permitido realizar e distribuir cópias textuais deste manual
|
|
mantendo o aviso de copyright e preservando este aviso de permissão
|
|
em todas as cópias.
|
|
% Permission is granted to make and distribute verbatim copies of this
|
|
% manual provided the copyright notice and this permission notice are
|
|
% preserved on all copies.
|
|
|
|
\noindent
|
|
É concedida a permissão para copiar e distribuir versões modificadas deste manual sob
|
|
as condições de cópias textuais, desde que o resultado completo derivado
|
|
do trabalho resultante seja distribuído sob os termos de uma notificação
|
|
de permissão idêntica a esta.
|
|
|
|
% Permission is granted to copy and distribute modified versions of this
|
|
% manual under the conditions for verbatim copying, provided also that
|
|
% the entire resulting derived work is distributed under the terms of
|
|
% a permission notice identical to this one.
|
|
|
|
\noindent
|
|
É concedida a permissão para copiar e distribuir traduções deste manual
|
|
em outra linguagem, sob as condições acima para as versões modificadas.
|
|
|
|
% Permission is granted to copy and distribute translations of this
|
|
% manual into another language, under the above conditions for modified
|
|
% versions.
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\newpage
|
|
|
|
{\setlength{\parskip}{0pt}
|
|
\tableofcontents
|
|
}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\chapter{Introdução}
|
|
|
|
{\it GNU MathProg} é uma linguagem de modelagem projetada para descrever
|
|
modelos lineares de programação matemática.
|
|
\footnote{A linguagem GNU MathProg é um subconjunto da linguagem AMPL.
|
|
A implementação do GLPK é \linebreak principalmente baseada no artigo:
|
|
{\it Robert Fourer}, {\it David M. Gay}, and
|
|
{\it Brian W. Kernighan}, ``A Modeling Language for Mathematical
|
|
Programming.'' {\it Management Science} 36 (1990), pp.~519-54.}
|
|
|
|
% {\it GNU MathProg} is a modeling language intended for describing
|
|
% linear mathematical programming models.\footnote{The GNU MathProg
|
|
% language is a subset of the AMPL language. Its GLPK implementation is
|
|
% mainly based on the paper: {\it Robert Fourer}, {\it David M. Gay}, and
|
|
% {\it Brian W. Kernighan}, ``A Modeling Language for Mathematical
|
|
% Programming.'' {\it Management Science} 36 (1990), pp.~519-54.}
|
|
|
|
A descrição de um modelo escrito na linguagem GNU MathProg consiste
|
|
em um conjunto de sentenças e blocos de dados construído pelo
|
|
usuário a partir dos elementos de linguagem descritos neste documento.
|
|
|
|
|
|
% Model descriptions written in the GNU MathProg language consist of
|
|
% a set of statements and data blocks constructed by the user from the
|
|
% language elements described in this document.
|
|
|
|
Em um processo denominado {\it tradução}, um programa denominado
|
|
{\it tradutor do modelo} analisa a descrição do modelo e o traduz
|
|
para uma estrutura de dados interna, que pode ser usado tanto para gerar
|
|
instância de um problema de programação matemática ou obter diretamente
|
|
a solução numérica do problema por meio de um programa chamado {\it solver}.
|
|
|
|
% In a process called {\it translation}, a program called the {\it model
|
|
% translator} analyzes the model description and translates it into
|
|
% internal data structures, which may be then used either for generating
|
|
% mathematical programming problem instance or directly by a program
|
|
% called the {\it solver} to obtain numeric solution of the problem.
|
|
|
|
\section{Problema de programação linear}
|
|
\label{problem}
|
|
|
|
Em MathProg o problema de programação linear (PL) é expresso da seguinte forma:
|
|
|
|
% In MathProg the linear programming (LP) problem is stated as follows:
|
|
|
|
\medskip
|
|
|
|
\noindent\hspace{1in}minimizar (ou maximizar)
|
|
$$z=c_1x_1+c_2x_2+\dots+c_nx_n+c_0\eqno(1.1)$$
|
|
\noindent\hspace{1in}subjeito às restrições lineares
|
|
$$
|
|
\begin{array}{l@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }l}
|
|
L_1&\leq&a_{11}x_1&+&a_{12}x_2&+\dots+&a_{1n}x_n&\leq&U_1\\
|
|
L_2&\leq&a_{21}x_1&+&a_{22}x_2&+\dots+&a_{2n}x_n&\leq&U_2\\
|
|
\multicolumn{9}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\
|
|
L_m&\leq&a_{m1}x_1&+&a_{m2}x_2&+\dots+&a_{mn}x_n&\leq&U_m\\
|
|
\end{array}\eqno(1.2)
|
|
$$
|
|
\noindent\hspace{1in}e os limites das variáveis
|
|
$$
|
|
\begin{array}{l@{\ }c@{\ }c@{\ }c@{\ }l}
|
|
l_1&\leq&x_1&\leq&u_1\\
|
|
l_2&\leq&x_2&\leq&u_2\\
|
|
\multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .}\\
|
|
l_n&\leq&x_n&\leq&u_n\\
|
|
\end{array}\eqno(1.3)
|
|
$$
|
|
|
|
% \newpage
|
|
|
|
\noindent
|
|
onde $x_1$, $x_2$, \dots, $x_n$ são variáveis; $z$ é a função objetivo
|
|
; $c_1$, $c_2$, \dots, $c_n$ são coeficientes da função objetivo; $c_0$
|
|
é o termo constante da função objetivo; $a_{11}$,
|
|
$a_{12}$, \dots, $a_{mn}$ são coeficientes das restrições; $L_1$, $L_2$,
|
|
\dots, $L_m$ são limites inferiores das restrições; $U_1$, $U_2$, \dots, $U_m$
|
|
são limites superiores das restrições; $l_1$, $l_2$, \dots, $l_n$ são limites
|
|
inferiores das variáveis; $u_1$, $u_2$, \dots, $u_n$ são limites superiores das
|
|
variáveis.
|
|
|
|
Os limites das variáveis e das restrições podem ser tanto finitos quanto
|
|
infinitos. Além disso, os limites inferiores podem ser igual aos limites
|
|
superiores correspondentes. Logo, os seguintes tipos de variáveis e
|
|
restrições são permitidos:
|
|
|
|
|
|
% where $x_1$, $x_2$, \dots, $x_n$ are variables; $z$ is the objective
|
|
% function; $c_1$, $c_2$, \dots, $c_n$ are objective coefficients; $c_0$
|
|
% is the constant term (``shift'') of the objective function; $a_{11}$,
|
|
% $a_{12}$, \dots, $a_{mn}$ are constraint coefficients; $L_1$, $L_2$,
|
|
% \dots, $L_m$ are lower constraint bounds; $U_1$, $U_2$, \dots, $U_m$
|
|
% are upper constraint bounds; $l_1$, $l_2$, \dots, $l_n$ are lower
|
|
% bounds of variables; $u_1$, $u_2$, \dots, $u_n$ are upper bounds of
|
|
% variables.
|
|
%
|
|
% Bounds of variables and constraint bounds can be finite as well as
|
|
% infinite. Besides, lower bounds can be equal to corresponding upper
|
|
% bounds. Thus, the following types of variables and constraints are
|
|
% allowed:
|
|
|
|
\medskip
|
|
|
|
{\def\arraystretch{1.4}
|
|
\noindent\hspace{54pt}
|
|
\begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{39.5pt}}l}
|
|
$-\infty$&$<$&$x$&$<$&$+\infty$&Variável livre (ilimitada)\\
|
|
$l$&$\leq$&$x$&$<$&$+\infty$&Variável com limite inferior\\
|
|
$-\infty$&$<$&$x$&$\leq$&$u$&Variável com limite superior\\
|
|
$l$&$\leq$&$x$&$\leq$&$u$&Variável duplamente limitada\\
|
|
$l$&$=$&$x$&=&$u$&Variável fixa\\
|
|
\end{tabular}
|
|
% \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }l@{\hspace*{39.5pt}}l}
|
|
% $-\infty$&$<$&$x$&$<$&$+\infty$&Free (unbounded) variable\\
|
|
% $l$&$\leq$&$x$&$<$&$+\infty$&Variable with lower bound\\
|
|
% $-\infty$&$<$&$x$&$\leq$&$u$&Variable with upper bound\\
|
|
% $l$&$\leq$&$x$&$\leq$&$u$&Double-bounded variable\\
|
|
% $l$&$=$&$x$&=&$u$&Fixed variable\\
|
|
% \end{tabular}
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll}
|
|
$-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Forma linear livre (ilimitada)\\
|
|
$L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Restrição de desigualdade ``maior ou igual a''\\
|
|
$-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Restrição de desigualdade ``menor ou igual a''\\
|
|
$L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Restrição de desigualdade duplamente limitada\\
|
|
$L$&$=$&$\sum a_jx_j$&=&$U$&Restrição de igualdade\\
|
|
\end{tabular}
|
|
% \begin{tabular}{@{}r@{\ }c@{\ }c@{\ }c@{\ }ll}
|
|
% $-\infty$&$<$&$\sum a_jx_j$&$<$&$+\infty$&Free (unbounded) linear
|
|
% form\\
|
|
% $L$&$\leq$&$\sum a_jx_j$&$<$&$+\infty$&Inequality constraint ``greater
|
|
% than or equal to''\\
|
|
% $-\infty$&$<$&$\sum a_jx_j$&$\leq$&$U$&Inequality constraint ``less
|
|
% than or equal to''\\
|
|
% $L$&$\leq$&$\sum a_jx_j$&$\leq$&$U$&Double-bounded inequality
|
|
% constraint\\
|
|
% $L$&$=$&$\sum a_jx_j$&=&$U$&Equality constraint\\
|
|
% \end{tabular}
|
|
}
|
|
|
|
\medskip
|
|
|
|
Além de problemas puramente PL, MathProg também permite
|
|
problemas de programação inteira mista (PIM), onde algumas ou
|
|
todas as variáveis são restritas a serem inteiras ou binárias.
|
|
|
|
% In addition to pure LP problems MathProg also allows mixed integer
|
|
% linear programming (MIP) problems, where some or all variables are
|
|
% restricted to be integer or binary.
|
|
|
|
\section{Objetos do modelo}
|
|
|
|
Em MathProg o modelo é descrito em termos de conjuntos, parâmetros,
|
|
variáveis, restrições e objetivos, que se denominam {\it objetos
|
|
do modelo}.
|
|
|
|
O usuário introduz objetos particulares do modelo usando as sentenças
|
|
da linguagem. Cada objeto do modelo possui um nome simbólico que o identifica
|
|
de maneira única sendo projetado para propósitos de referenciação.
|
|
|
|
% In MathProg the model is described in terms of sets, parameters,
|
|
% variables, constraints, and objectives, which are called {\it model
|
|
% objects}.
|
|
%
|
|
% The user introduces particular model objects using the language
|
|
% statements. Each model object is provided with a symbolic name which
|
|
% uniquely identifies the object and is intended for referencing
|
|
% purposes.
|
|
|
|
Objetos do modelo, incluindo conjuntos, podem ser matrizes multidimensionais
|
|
construídos sobre conjuntos indexantes. Formalmente, uma matriz $n$-dimensional $A$
|
|
é o mapeamento:
|
|
% Model objects, including sets, can be multidimensional arrays built
|
|
% over indexing sets. Formally, $n$-dimensional array $A$ is the mapping:
|
|
$$A:\Delta\rightarrow\Xi,\eqno(1.4)$$
|
|
onde $\Delta\subseteq S_1\times\dots\times S_n$ é um subconjunto do
|
|
produto Cartesiano de conjuntos indexantes, $\Xi$ é um conjunto dos
|
|
membros da matriz. Em MathProg o conjunto $\Delta$ é chamado o {\it domínio do subíndice}. % REVISAR
|
|
Seus membros são $n$-tuplas $(i_1,\dots,i_n)$, onde $i_1\in S_1$, \dots,
|
|
$i_n\in S_n$.
|
|
% where $\Delta\subseteq S_1\times\dots\times S_n$ is a subset of the
|
|
% Cartesian product of indexing sets, $\Xi$ is a set of array members.
|
|
% In MathProg the set $\Delta$ is called the {\it subscript domain}. Its
|
|
% members are $n$-tuples $(i_1,\dots,i_n)$, where $i_1\in S_1$, \dots,
|
|
% $i_n\in S_n$.
|
|
|
|
Se $n=0$, o produto Cartesiano acima possui exatamente um membro (denominado
|
|
0-tupla), portanto, é conveniente pensar nos objetos escalares como sendo
|
|
matrizes 0-dimensionais que \linebreak possuem apenas um membro.
|
|
% If $n=0$, the Cartesian product above has exactly one member (namely,
|
|
% 0-tuple), so it is convenient to think scalar objects as 0-dimensional
|
|
% arrays having one member.
|
|
|
|
% \newpage
|
|
|
|
O tipo dos membros da matriz é determinado pelo tipo de objeto do modelo
|
|
correspondente, como segue:
|
|
% The type of array members is determined by the type of corresponding
|
|
% model object as follows:
|
|
|
|
\medskip
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}ll@{}}
|
|
Objeto do modelo&Membro da matriz\\
|
|
\hline
|
|
Conjunto&Conjunto plano elementar\\
|
|
Parâmetro&Número ou símbolo\\
|
|
Variável&Variável elementar\\
|
|
Restrição&Restrição elementar\\
|
|
Objetivo&Objetivo elementar\\
|
|
\end{tabular}
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% Model object&Array member\\
|
|
% \hline
|
|
% Set&Elemental plain set\\
|
|
% Parameter&Number or symbol\\
|
|
% Variable&Elemental variable\\
|
|
% Constraint&Elemental constraint\\
|
|
% Objective&Elemental objective\\
|
|
% \end{tabular}
|
|
|
|
\medskip
|
|
|
|
Para referir a um membro particular de um objeto, este deve possuir
|
|
{\it subíndices}. Por exemplo, se $a$ é um parâmetro 2-dimensional
|
|
definido sobre $I\times J$, uma referência a seus membros particulares
|
|
pode ser escrito como $a[i,j]$, onde $i\in I$ e $j\in J$. Entende-se
|
|
que objetos escalares não necessitam de subíndices por serem 0-dimensionais.
|
|
|
|
% In order to refer to a particular object member the object should be
|
|
% provided with {\it subscripts}. For example, if $a$ is a 2-dimensional
|
|
% parameter defined over $I\times J$, a reference to its particular
|
|
% member can be written as $a[i,j]$, where $i\in I$ and $j\in J$. It is
|
|
% understood that scalar objects being 0-dimensional need no subscripts.
|
|
|
|
\section{Estrutura da descrição do modelo}
|
|
|
|
Às vezes é desejável escrever um modelo que, por diferentes motivos,
|
|
tenha que requerer diferentes dados para resolver cada instância do problema
|
|
usando o mesmo modelo.
|
|
Por esta razão, em MathProg a descrição do modelo consiste em duas partes:
|
|
a {\it seção de modelo} e a {\it seção de dados}.
|
|
|
|
% It is sometimes desirable to write a model which, at various points,
|
|
% may require different data for each problem instance to be solved using
|
|
% that model. For this reason in MathProg the model description consists
|
|
% of two parts: the {\it model section} and the {\it data section}.
|
|
|
|
A seção de modelo é a principal parte da descrição do modelo, pois ela contém
|
|
as declarações dos objetos do modelo. Ela também é comum a todos os problemas
|
|
baseados no modelo correspondente.
|
|
|
|
% The model section is a main part of the model description that contains
|
|
% declarations of model objects and is common for all problems based on
|
|
% the corresponding model.
|
|
|
|
A seção de dados é uma parte opcional da descrição do modelo que
|
|
contém dados específicos para uma instância particular do problema.
|
|
|
|
% The data section is an optional part of the model description that
|
|
% contains data specific for a particular problem instance.
|
|
|
|
Dependendo do que seja mais conveniente, as seções de modelo e de dados
|
|
podem ser dispostas em um arquivo único ou em dois arquivos separados.
|
|
Esta última funcionalidade permite que se tenha um quantidade arbitrária
|
|
de seções de dados diferentes a serem usadas com a mesma seção de modelo.
|
|
|
|
% Depending on what is more convenient the model and data sections can be
|
|
% placed either in one file or in two separate files. The latter feature
|
|
% allows having arbitrary number of different data sections to be used
|
|
% with the same model section.
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\chapter{Codificação da descrição do modelo}
|
|
\label{coding}
|
|
|
|
A descrição do modelo é codificada em um formato de arquivo plano de
|
|
texto usando o conjunto de caracteres ASCII.
|
|
Os caracteres válidos na descrição do modelo são os seguintes:
|
|
|
|
% The model description is coded in a plain text format using ASCII
|
|
% character set. Characters valid in the model description are the
|
|
% following:
|
|
|
|
\begin{itemize}
|
|
\item Caracteres alfabéticos:\\
|
|
\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|\\
|
|
\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 _|
|
|
\item caracteres numéricos:\\
|
|
\verb|0 1 2 3 4 5 6 7 8 9|
|
|
\item caracteres especiais:\\
|
|
\verb?! " # & ' ( ) * + , - . / : ; < = > [ ] ^ { | } ~?
|
|
\item caracteres de espaço em branco:\\
|
|
\verb|SP HT CR NL VT FF|
|
|
\end{itemize}
|
|
|
|
Dentro de literais de cadeia e comentários quaisquer
|
|
caracteres ASCII (exceto caracteres de controle) são válidos.
|
|
|
|
% Within string literals and comments any ASCII characters (except
|
|
% control characters) are valid.
|
|
|
|
|
|
Caracteres de espaço-em-branco não são significativos. Eles podem ser
|
|
usados livremente entre unidades léxicas para melhorar a legibilidade da
|
|
descrição do modelo. Eles também são usados para separar unidades léxicas
|
|
entre si, no caso de não existir outra forma de fazê-lo.
|
|
|
|
% White-space characters are non-significant. They can be used freely
|
|
% between lexical units to improve readability of the model description.
|
|
% They are also used to separate lexical units from each other if there
|
|
% is no other way to do that.
|
|
|
|
Sintaticamente a descrição do modelo é uma sequência de unidades léxicas
|
|
nas seguintes \linebreak categorias:
|
|
|
|
% Syntactically model description is a sequence of lexical units in the
|
|
% following categories:
|
|
|
|
\begin{itemize}
|
|
\item nomes simbólicos;
|
|
\item literais numéricos;
|
|
\item literais de cadeia;
|
|
\item palavras-chave;
|
|
\item delimitadores;
|
|
\item comentários.
|
|
\end{itemize}
|
|
|
|
% \begin{itemize}
|
|
% \item symbolic names;
|
|
% \item numeric literals;
|
|
% \item string literals;
|
|
% \item keywords;
|
|
% \item delimiters;
|
|
% \item comments.
|
|
% \end{itemize}
|
|
|
|
As unidades léxicas da linguagem são discutidas abaixo.
|
|
|
|
% \newpage
|
|
|
|
\section{Nomes simbólicos}
|
|
|
|
Um {\it nome simbólico} consiste de caracteres alfabéticos e numéricos,
|
|
em que o primeiro deste deve ser alfabético. Todos os nomes simbólicos
|
|
devem ser distintos (sensibilidade às maiúsculas: case-sensitive).
|
|
|
|
% A {\it symbolic name} consists of alphabetic and numeric characters,
|
|
% the first of which should be alphabetic. All symbolic names are
|
|
% distinct (case sensitive).
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
alfa123
|
|
Este_eh_um_nome
|
|
_P123_abc_321
|
|
\end{verbatim}
|
|
|
|
Nomes simbólicos são usados para identificar objetos do modelo
|
|
(conjuntos, parâmetros, \linebreak variáveis, restrições, objetivos)
|
|
e os índices.
|
|
|
|
% Symbolic names are used to identify model objects (sets, parameters,
|
|
% variables, constraints, objectives) and dummy indices.
|
|
|
|
Todos os nomes simbólicos (exceto os nomes dos índices) devem ser únicos,
|
|
i.e., a descrição do modelo não pode ter objetos com nomes idênticos.
|
|
Nomes simbólicos de índices devem ser únicos dentro do escopo em que são válidos.
|
|
|
|
% All symbolic names (except names of dummy indices) should be unique,
|
|
% i.e. the model description should have no objects with identical names.
|
|
% Symbolic names of dummy indices should be unique within the scope,
|
|
% where they are valid.
|
|
|
|
\section{Literais numéricos}
|
|
|
|
Um {\it literal numérico} possui a forma {\it xx}{\tt E}{\it syy}, onde
|
|
{\it xx} é um número com ponto decimal opcional, {\it s} é o sinal
|
|
{\tt+} ou {\tt-}, {\it yy} é um expoente decimal. A letra {\tt E} é
|
|
insensível à maiúsculas (case-insensitive) e pode ser codificada como {\tt e}.
|
|
|
|
% A {\it numeric literal} has the form {\it xx}{\tt E}{\it syy}, where
|
|
% {\it xx} is a number with optional decimal point, {\it s} is the sign
|
|
% {\tt+} or {\tt-}, {\it yy} is a decimal exponent. The letter {\tt E} is
|
|
% case insensitive and can be coded as {\tt e}.
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
123
|
|
3.14159
|
|
56.E+5
|
|
.78
|
|
123.456e-7
|
|
\end{verbatim}
|
|
|
|
Literais numéricos são usados para representar quantidades numéricas. Eles
|
|
possuem significado fixo óbvio.
|
|
|
|
% Numeric literals are used to represent numeric quantities. They have
|
|
% obvious fixed meaning.
|
|
|
|
\section{Literais de cadeia}
|
|
|
|
Uma {\it literal de cadeia} é uma sequência arbitrária de caracteres cercada
|
|
por aspas tanto simples como duplas. Ambas formas são equivalentes.
|
|
|
|
% A {\it string literal} is a sequence of arbitrary characters enclosed
|
|
% either in single quotes or in double quotes. Both these forms are
|
|
% equivalent.
|
|
|
|
Se uma aspa simples é parte de uma literal de cadeia cercada por
|
|
aspas simples, ela deve ser codificada duas vezes. De forma análoga,
|
|
se uma aspa dupla é parte de um literal de cadeia cercada por aspas duplas,
|
|
ela deve ser codificada duas vezes.
|
|
|
|
% If a single quote is part of a string literal enclosed in single
|
|
% quotes, it should be coded twice. Analogously, if a double quote is
|
|
% part of a string literal enclosed in double quotes, it should be coded
|
|
% twice.
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
'Esta eh uma string'
|
|
"Esta eh outra string"
|
|
'Copo d''agua'
|
|
"""Beleza"" disse o capitao."
|
|
\end{verbatim}
|
|
|
|
Literais de cadeia são usadas para representar quantidades simbólicas.
|
|
% String literals are used to represent symbolic quantities.
|
|
|
|
\section{Palavras-chave}
|
|
|
|
Uma {\it palavra-chave} é uma sequência de caracteres alfabéticos e
|
|
possivelmente alguns caracteres especiais.
|
|
|
|
% A {\it keyword} is a sequence of alphabetic characters and possibly
|
|
% some special characters.
|
|
|
|
Todas as palavras-chave caem em algumas das duas categorias:
|
|
{\it palavras-chave reservadas}, que não podem ser usadas como nomes simbólicos,
|
|
e {\it palavras-chave não-reservadas}, que são reconhecidas pelo contexto,
|
|
portanto, podem ser usadas como nomes simbólicos.
|
|
|
|
|
|
As palavras-chave reservadas são as seguintes:
|
|
|
|
% All keywords fall into two categories: {\it reserved keywords}, which
|
|
% cannot be used as symbolic names, and {\it non-reserved keywords},
|
|
% which are recognized by context and therefore can be used as symbolic
|
|
% names.
|
|
%
|
|
% The reserved keywords are the following:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}p{.7in}p{.7in}p{.7in}p{.7in}@{}}
|
|
{\tt and}&{\tt else}&{\tt mod}&{\tt union}\\
|
|
{\tt by}&{\tt if}&{\tt not}&{\tt within}\\
|
|
{\tt cross}&{\tt in}&{\tt or}\\
|
|
{\tt diff}&{\tt inter}&{\tt symdiff}\\
|
|
{\tt div}&{\tt less}&{\tt then}\\
|
|
\end{tabular}
|
|
|
|
Palavras-chave não-reservadas são descritas nas seções posteriores.
|
|
|
|
Todas as palavras-chave possuem um significado fixo, a ser
|
|
explicado nas discussões das \linebreak construções sintáticas correspondentes,
|
|
onde as palavras-chave são usadas.
|
|
|
|
% Non-reserved keywords are described in following sections.
|
|
%
|
|
% All the keywords have fixed meaning, which will be explained on
|
|
% discussion of corresponding syntactic constructions, where the keywords
|
|
% are used.
|
|
|
|
\section{Delimitadores}
|
|
|
|
Um {\it delimitador} é tanto um caractere especial único quanto uma sequência
|
|
de dois caracteres especiais, como segue:
|
|
|
|
% A {\it delimiter} is either a single special character or a sequence of
|
|
% two special characters as follows:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}p{.3in}
|
|
p{.3in}p{.3in}@{}}
|
|
{\tt+}&{\tt**}&{\tt<=}&{\tt>}&{\tt\&\&}&{\tt:}&{\tt|}&{\tt[}&
|
|
{\tt>>}\\
|
|
{\tt-}&{\tt\textasciicircum}&{\tt=}&{\tt<>}&{\tt||}&{\tt;}&
|
|
{\tt\char126}&{\tt]}&{\tt<-}\\
|
|
{\tt*}&{\tt\&}&{\tt==}&{\tt!=}&{\tt.}&{\tt:=}&{\tt(}&{\tt\{}\\
|
|
{\tt/}&{\tt<}&{\tt>=}&{\tt!}&{\tt,}&{\tt..}&{\tt)}&{\tt\}}\\
|
|
\end{tabular}
|
|
|
|
Se um delimitador consiste de dois caracteres, não deve haver espaços
|
|
entre os eles.
|
|
|
|
Todos os delimitadores possuem um significado fixo, a ser
|
|
explicado nas discussões das \linebreak construções sintáticas correspondentes,
|
|
onde os delimitadores são usados.
|
|
|
|
% If the delimiter consists of two characters, there should be no spaces
|
|
% between the characters.
|
|
%
|
|
% All the delimiters have fixed meaning, which will be explained on
|
|
% discussion corresponding syntactic constructions, where the delimiters
|
|
% are used.
|
|
|
|
\section{Comentários}
|
|
|
|
Com propósitos de documentação, a descrição do modelo pode conter
|
|
{\it comentários}, que podem ter duas formas diferentes. A primeira forma é
|
|
um {\it comentário de linha-única}, que começa com o caractere {\tt\#}
|
|
e se estende até o final da linha. A segunda forma é uma {\it sequência de
|
|
comentários}, que é uma sequência de quaisquer caracteres cercados por
|
|
{\tt/*} e {\tt*/}.
|
|
|
|
% For documenting purposes the model description can be provided with
|
|
% {\it comments}, which may have two different forms. The first form is
|
|
% a {\it single-line comment}, which begins with the character {\tt\#}
|
|
% and extends until end of line. The second form is a {\it comment
|
|
% sequence}, which is a sequence of any characters enclosed within
|
|
% {\tt/*} and {\tt*/}.
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
param n := 10; # Este é um comentario
|
|
/* Este é outro comentário */
|
|
\end{verbatim}
|
|
|
|
Comentários e caracteres de espaço-em-branco são ignorados pelo tradutor
|
|
do modelo e podem aparecer em qualquer local da descrição do modelo.
|
|
|
|
% Comments are ignored by the model translator and can appear anywhere in
|
|
% the model description, where white-space characters are allowed.
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\newpage
|
|
|
|
\chapter{Expressões}
|
|
|
|
Uma {\it expressão} é uma regra para calcular um valor. Na descrição
|
|
de um modelo, expressões são usadas como constituintes de certas sentenças.
|
|
|
|
No geral, expressões são constituídas de operandos e operadores.
|
|
|
|
Dependendo do tipo de valor resultante, todas expressões se enquadram nas
|
|
seguintes categorias:
|
|
|
|
% An {\it expression} is a rule for computing a value. In model
|
|
% description expressions are used as constituents of certain statements.
|
|
%
|
|
% In general case expressions consist of operands and operators.
|
|
%
|
|
% Depending on the type of the resultant value all expressions fall into
|
|
% the following categories:
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\begin{itemize}
|
|
\item expressões numéricas;
|
|
\item expressões simbólicas;
|
|
\item expressões indexantes;
|
|
\item expressões de conjuntos;
|
|
\item expressões lógicas;
|
|
\item expressões lineares.
|
|
\end{itemize}
|
|
|
|
% \begin{itemize}
|
|
% \item numeric expressions;
|
|
% \item symbolic expressions;
|
|
% \item indexing expressions;
|
|
% \item set expressions;
|
|
% \item logical expressions;
|
|
% \item linear expressions.
|
|
% \end{itemize}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\section{Expressões numéricas}
|
|
|
|
Uma {\it expressão numérica} é uma regra para calcular um valor numérico individual
|
|
representado como um número de ponto-flutuante.
|
|
|
|
A expressão numérica primária pode ser um literal numérico, um índice,
|
|
um parâmetro não-indexado, um parâmetro indexado, uma função interna de
|
|
referência, uma expressão numérica iterada, uma expressão numérica condicional
|
|
ou outra expressão cercada por parênteses.
|
|
|
|
% A {\it numeric expression} is a rule for computing a single numeric
|
|
% value represented as a floating-point number.
|
|
%
|
|
% The primary numeric expression may be a numeric literal, dummy index,
|
|
% unsubscripted parameter, subscripted parameter, built-in function
|
|
% reference, iterated numeric expression, conditional numeric expression,
|
|
% or another numeric expression enclosed in parentheses.
|
|
|
|
\para{Exemplos}
|
|
|
|
\noindent
|
|
\begin{tabular}{@{}ll@{}}
|
|
\verb|1.23 |&(literal numérico)\\
|
|
\verb|j|&(índice)\\
|
|
\verb|time|&(parâmetro não-indexado)\\
|
|
\verb|a['May 2003',j+1]|&(parâmetro indexado)\\
|
|
\verb|abs(b[i,j])|&(função de referência)\\
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% \verb|1.23 |&(numeric literal)\\
|
|
% \verb|j|&(dummy index)\\
|
|
% \verb|time|&(unsubscripted parameter)\\
|
|
% \verb|a['May 2003',j+1]|&(subscripted parameter)\\
|
|
% \verb|abs(b[i,j])|&(function reference)\\
|
|
% \end{tabular}
|
|
|
|
\newpage
|
|
|
|
\noindent
|
|
\begin{tabular}{@{}ll@{}}
|
|
\verb|sum{i in S diff T} alpha[i] * b[i,j]|&(expressão iterada)\\
|
|
\verb|if i in I then 2 * p else q[i+1]|&(expressão condicional)\\
|
|
\verb|(b[i,j] + .5 * c)|&(expressão entre parênteses)\\
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% \verb|sum{i in S diff T} alpha[i] * b[i,j]|&(iterated expression)\\
|
|
% \verb|if i in I then 2 * p else q[i+1]|&(conditional expression)\\
|
|
% \verb|(b[i,j] + .5 * c)|&(parenthesized expression)\\
|
|
% \end{tabular}
|
|
|
|
Expressões numéricas mais genéricas, contendo duas ou mais
|
|
expressões numéricas primárias, podem ser construídas usando
|
|
determinados operadores aritméticos.
|
|
|
|
% More general numeric expressions containing two or more primary numeric
|
|
% expressions may be constructed by using certain arithmetic operators.
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
j+1
|
|
2 * a[i-1,j+1] - b[i,j]
|
|
sum{j in J} a[i,j] * x[j] + sum{k in K} b[i,k] * x[k]
|
|
(if i in I and p >= 1 then 2 * p else q[i+1]) / (a[i,j] + 1.5)
|
|
\end{verbatim}
|
|
|
|
\subsection{Literais numéricos}
|
|
|
|
Se a expressão numérica primária é um literal numérico,
|
|
o valor resultante é óbvio.
|
|
|
|
% If the primary numeric expression is a numeric literal, the resultant
|
|
% value is obvious.
|
|
|
|
\subsection{Índices}
|
|
|
|
Se a expressão numérica primária é um índice,
|
|
o valor resultante é o valor corrente atribuído àquele índice.
|
|
|
|
% If the primary numeric expression is a dummy index, the resultant value
|
|
% is current value assigned to that dummy index.
|
|
|
|
\subsection{Parâmetros não-indexados}
|
|
|
|
Se a expressão numérica primária é um parâmetro não-indexado
|
|
(que deve ser 0-dimensional), o valor resultante é o valor
|
|
do parâmetro.
|
|
|
|
% If the primary numeric expression is an unsubscripted parameter (which
|
|
% should be 0-dimen\-sional), the resultant value is the value of that
|
|
% parameter.
|
|
|
|
\subsection{Parâmetros indexados}
|
|
|
|
A expressão numérica primária, que se refere ao parâmetro indexado,
|
|
possui a seguinte forma sintática:
|
|
% The primary numeric expression, which refers to a subscripted
|
|
% parameter, has the following syntactic form:
|
|
$$
|
|
\mbox{{\it nome}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,} $i_n${\tt]}}
|
|
$$
|
|
onde {\it nome} é o nome simbólico do parâmetro e $i_1$, $i_2$,
|
|
\dots, $i_n$ são subíndices.
|
|
|
|
Cada subíndice deve ser uma expressão numérica ou simbólica. O número
|
|
de subíndices na lista de subíndices deve ser o mesmo da dimensão
|
|
do parâmetro com o qual a lista de subíndices está associada.
|
|
|
|
Os valores reais das expressões de subíndice são usadas para identificar
|
|
um membro particular do parâmetro que determina o valor resultante
|
|
da expressão primária.
|
|
|
|
% where {\it name} is the symbolic name of the parameter, $i_1$, $i_2$,
|
|
% \dots, $i_n$ are subscripts.
|
|
%
|
|
% Each subscript should be a numeric or symbolic expression. The number
|
|
% of subscripts in the subscript list should be the same as the dimension
|
|
% of the parameter with which the subscript list is associated.
|
|
%
|
|
% Actual values of subscript expressions are used to identify
|
|
% a particular member of the parameter that determines the resultant
|
|
% value of the primary expression.
|
|
|
|
\newpage
|
|
|
|
\subsection{Funções de referência}
|
|
|
|
Em MathProg existem as seguintes funções internas, que podem ser
|
|
usadas como expressões numéricas:
|
|
|
|
% In MathProg there exist the following built-in functions which may be
|
|
% used in numeric expressions:
|
|
|
|
\begin{tabular}{@{}p{112pt}p{328pt}@{}}
|
|
{\tt abs(}$x${\tt)}&$|x|$, valor absoluto de $x$\\
|
|
{\tt atan(}$x${\tt)}&$\arctan x$, valor principal do arco tangente de
|
|
$x$ (em radianos)\\
|
|
{\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, valor principal do
|
|
arco tangente de $y/x$ (em radianos). Neste caso, os sinais de ambos
|
|
argumentos $y$ e $x$ são usados para determinar o quadrante do valor
|
|
resultante\\
|
|
{\tt card(}$X${\tt)}&$|X|$, cardinalidade (o número de elementos) do
|
|
conjunto $X$\\
|
|
{\tt ceil(}$x${\tt)}&$\lceil x\rceil$, menor inteiro não menor que
|
|
$x$ (``teto de $x$'')\\
|
|
{\tt cos(}$x${\tt)}&$\cos x$, cosseno de $x$ (em radianos)\\
|
|
{\tt exp(}$x${\tt)}&$e^x$, exponencial de $x$ na base-$e$\\
|
|
{\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, maior inteiro não maior
|
|
que $x$ (``piso de $x$'')\\
|
|
{\tt gmtime()}&o número de segundos decorridos deste 00:00:00 de~01~de~Jan de 1970,
|
|
Tempo Universal Coordenado (detalhes na Seção \ref{gmtime},
|
|
página \pageref{gmtime})\\
|
|
{\tt length(}$s${\tt)}&$|s|$, comprimento da cadeia de caracteres $s$\\
|
|
{\tt log(}$x${\tt)}&$\log x$, logaritmo natural de $x$\\
|
|
{\tt log10(}$x${\tt)}&$\log_{10}x$, logaritmo comum (decimal) de $x$\\
|
|
{\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&o maior
|
|
dos valores $x_1$, $x_2$, \dots, $x_n$\\
|
|
{\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&o menor
|
|
dos valores $x_1$, $x_2$, \dots, $x_n$\\
|
|
{\tt round(}$x${\tt)}&arrendondamento de $x$ ao inteiro mais próximo\\
|
|
{\tt round(}$x${\tt,} $n${\tt)}&arrendondamento de $x$ a $n$ dígitos decimais\\
|
|
{\tt sin(}$x${\tt)}&$\sin x$, seno de $x$ (em radianos)\\
|
|
{\tt sqrt(}$x${\tt)}&$\sqrt{x}$, raiz quadrada não-negativa de $x$\\
|
|
{\tt str2time(}$s${\tt,} $f${\tt)}&conversão de uma cadeia de caracteres $s$ ao
|
|
tempo calendário (detalhes na Seção \ref{str2time}, página
|
|
\pageref{str2time})\\
|
|
{\tt trunc(}$x${\tt)}&truncado de $x$ ao inteiro mais próximo\\
|
|
{\tt trunc(}$x${\tt,} $n${\tt)}&truncado de $x$ a $n$ dígitos decimais\\
|
|
{\tt Irand224()}&gera inteiro pseudo-aleatório uniformemente distribuído
|
|
em $[0,2^{24})$\\
|
|
{\tt Uniform01()}&gera número pseudo-aleatório uniformemente distribuído
|
|
em $[0,1)$\\
|
|
{\tt Uniform(}$a${\tt,} $b${\tt)}&gera número pseudo-aleatório uniformemente
|
|
distribuído em $[a,b)$\\
|
|
{\tt Normal01()}&gera variável Gaussiana pseudo-aleatória com
|
|
$\mu=0$ e $\sigma=1$\\
|
|
{\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&gera variável Gaussiana pseudo-aleatória
|
|
com $\mu$ e $\sigma$ dados\\
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}p{112pt}p{328pt}@{}}
|
|
% {\tt abs(}$x${\tt)}&$|x|$, absolute value of $x$\\
|
|
% {\tt atan(}$x${\tt)}&$\arctan x$, principal value of the arc tangent of
|
|
% $x$ (in radians)\\
|
|
% {\tt atan(}$y${\tt,} $x${\tt)}&$\arctan y/x$, principal value of the
|
|
% arc tangent of $y/x$ (in radians). In this case the signs of both
|
|
% arguments $y$ and $x$ are used to determine the quadrant of the
|
|
% resultant value\\
|
|
% {\tt card(}$X${\tt)}&$|X|$, cardinality (the number of elements) of
|
|
% set $X$\\
|
|
% {\tt ceil(}$x${\tt)}&$\lceil x\rceil$, smallest integer not less than
|
|
% $x$ (``ceiling of $x$'')\\
|
|
% {\tt cos(}$x${\tt)}&$\cos x$, cosine of $x$ (in radians)\\
|
|
% {\tt exp(}$x${\tt)}&$e^x$, base-$e$ exponential of $x$\\
|
|
% {\tt floor(}$x${\tt)}&$\lfloor x\rfloor$, largest integer not greater
|
|
% than $x$ (``floor of $x$'')\\
|
|
% {\tt gmtime()}&the number of seconds elapsed since 00:00:00~Jan~1, 1970,
|
|
% Coordinated Universal Time (for details see Section \ref{gmtime},
|
|
% page \pageref{gmtime})\\
|
|
% {\tt length(}$s${\tt)}&$|s|$, length of character string $s$\\
|
|
% {\tt log(}$x${\tt)}&$\log x$, natural logarithm of $x$\\
|
|
% {\tt log10(}$x${\tt)}&$\log_{10}x$, common (decimal) logarithm of $x$\\
|
|
% {\tt max(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the largest
|
|
% of values $x_1$, $x_2$, \dots, $x_n$\\
|
|
% {\tt min(}$x_1${\tt,} $x_2${\tt,} \dots{\tt,} $x_n${\tt)}&the smallest
|
|
% of values $x_1$, $x_2$, \dots, $x_n$\\
|
|
% {\tt round(}$x${\tt)}&rounding $x$ to nearest integer\\
|
|
% {\tt round(}$x${\tt,} $n${\tt)}&rounding $x$ to $n$ fractional decimal
|
|
% digits\\
|
|
% {\tt sin(}$x${\tt)}&$\sin x$, sine of $x$ (in radians)\\
|
|
% {\tt sqrt(}$x${\tt)}&$\sqrt{x}$, non-negative square root of $x$\\
|
|
% {\tt str2time(}$s${\tt,} $f${\tt)}&converting character string $s$ to
|
|
% calendar time (for details see Section \ref{str2time}, page
|
|
% \pageref{str2time})\\
|
|
% {\tt trunc(}$x${\tt)}&truncating $x$ to nearest integer\\
|
|
% {\tt trunc(}$x${\tt,} $n${\tt)}&truncating $x$ to $n$ fractional
|
|
% decimal digits\\
|
|
% {\tt Irand224()}&generating pseudo-random integer uniformly distributed
|
|
% in $[0,2^{24})$\\
|
|
% {\tt Uniform01()}&generating pseudo-random number uniformly distributed
|
|
% in $[0,1)$\\
|
|
% {\tt Uniform(}$a${\tt,} $b${\tt)}&generating pseudo-random number
|
|
% uniformly distributed in $[a,b)$\\
|
|
% {\tt Normal01()}&generating Gaussian pseudo-random variate with
|
|
% $\mu=0$ and $\sigma=1$\\
|
|
% {\tt Normal(}$\mu${\tt,} $\sigma${\tt)}&generating Gaussian
|
|
% pseudo-random variate with given $\mu$ and $\sigma$\\
|
|
% \end{tabular}
|
|
|
|
Os argumentos de todas as funções internas, exceto {\tt card}, {\tt length},
|
|
e {\tt str2time}, devem ser \linebreak expressões numéricas. O argumento de
|
|
{\tt card} deve ser uma expressão de conjunto. O argumento de {\tt length} e
|
|
ambos argumentos de {\tt str2time} devem ser expressões simbólicas.
|
|
|
|
O valor resultante da expressão numérica, que é uma função de referência,
|
|
é o resultado da aplicação da função ao(s) seu(s) argumento(s).
|
|
|
|
Note que cada função geradora de números pseudo-aleatórios possui um argumento
|
|
latente (i.e., algum estado interno), que é alterado sempre que função é aplicada.
|
|
Assim, se a função é aplicada repetidamente mesmos aos argumentos idênticos,
|
|
devido ao efeito secundário, sempre se produzirão valores resultantes diferentes.
|
|
|
|
% Arguments of all built-in functions, except {\tt card}, {\tt length},
|
|
% and {\tt str2time}, should be numeric expressions. The argument of
|
|
% {\tt card} should be a set expression. The argument of {\tt length} and
|
|
% both arguments of {\tt str2time} should be symbolic expressions.
|
|
%
|
|
% The resultant value of the numeric expression, which is a function
|
|
% reference, is the result of applying the function to its argument(s).
|
|
%
|
|
% Note that each pseudo-random generator function has a latent argument
|
|
% (i.e. some internal state), which is changed whenever the function has
|
|
% been applied. Thus, if the function is applied repeatedly even to
|
|
% identical arguments, due to the side effect different resultant values
|
|
% are always produced.
|
|
\newpage
|
|
|
|
\subsection{Expressões iteradas}
|
|
\label{itexpr}
|
|
|
|
Uma {\it expressão numérica iterada} é uma expressão numérica primária,
|
|
que possui a seguinte forma sintática:
|
|
$$\mbox{\it operador-iterado expressão-indexada integrando}$$
|
|
onde o {\it operador-iterado} é o nome simbólico do operador de iteração
|
|
a ser executado (veja abaixo), {\it expressão-indexada} é uma
|
|
expressão indexada que introduz índices e controla a iteração e
|
|
{\it integrando} é uma expressão numérica que participa da operação.
|
|
|
|
\noindent
|
|
Em MathProg existem quatro operadores iterados, que podem ser usados
|
|
em expressões numéricas:
|
|
|
|
% An {\it iterated numeric expression} is a primary numeric expression,
|
|
% which has the following syntactic form:
|
|
% $$\mbox{\it iterated-operator indexing-expression integrand}$$
|
|
% where {\it iterated-operator} is the symbolic name of the iterated
|
|
% operator to be performed (see below), {\it indexing-expression} is an
|
|
% indexing expression which introduces dummy indices and controls
|
|
% iterating, {\it integrand} is a numeric expression that participates in
|
|
% the operation.
|
|
%
|
|
% In MathProg there exist four iterated operators, which may be used in
|
|
% numeric expressions:
|
|
|
|
{\def\arraystretch{2}
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}lll@{}}
|
|
{\tt sum}&somatório&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta}
|
|
f(i_1,\dots,i_n)$\\
|
|
{\tt prod}&produtório&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta}
|
|
f(i_1,\dots,i_n)$\\
|
|
{\tt min}&mínimo&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta}
|
|
f(i_1,\dots,i_n)$\\
|
|
{\tt max}&máximo&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta}
|
|
f(i_1,\dots,i_n)$\\
|
|
\end{tabular}
|
|
}
|
|
|
|
% {\def\arraystretch{2}
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}lll@{}}
|
|
% {\tt sum}&summation&$\displaystyle\sum_{(i_1,\dots,i_n)\in\Delta}
|
|
% f(i_1,\dots,i_n)$\\
|
|
% {\tt prod}&production&$\displaystyle\prod_{(i_1,\dots,i_n)\in\Delta}
|
|
% f(i_1,\dots,i_n)$\\
|
|
% {\tt min}&minimum&$\displaystyle\min_{(i_1,\dots,i_n)\in\Delta}
|
|
% f(i_1,\dots,i_n)$\\
|
|
% {\tt max}&maximum&$\displaystyle\max_{(i_1,\dots,i_n)\in\Delta}
|
|
% f(i_1,\dots,i_n)$\\
|
|
% \end{tabular}
|
|
% }
|
|
|
|
\noindent onde $i_1$, \dots, $i_n$ são índices introduzidos nas
|
|
expressões indexadas, $\Delta$ é o domínio, um conjunto de $n$-tuplas
|
|
especificado pela expressão indexada que define valores particulares
|
|
atribuído aos índices ao executar a operação iterada e
|
|
$f(i_1,\dots,i_n)$ é o integrando, uma expressão numérica cujo valor
|
|
resultante depende dos índices.
|
|
|
|
O valor resultante de uma expressão numérica iterada é o resultado da aplicação
|
|
do operador iterado ao seu integrando por todas as $n$-tuplas
|
|
contidas no domínio.
|
|
|
|
% \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in
|
|
% the indexing expression, $\Delta$ is the domain, a set of $n$-tuples
|
|
% specified by the indexing expression which defines particular values
|
|
% assigned to the dummy indices on performing the iterated operation,
|
|
% $f(i_1,\dots,i_n)$ is the integrand, a numeric expression whose
|
|
% resultant value depends on the dummy indices.
|
|
%
|
|
% The resultant value of an iterated numeric expression is the result of
|
|
% applying of the iterated operator to its integrand over all $n$-tuples
|
|
% contained in the domain.
|
|
|
|
\subsection{Expressões condicionais}
|
|
\label{ifthen}
|
|
|
|
Uma {\it expressão numérica condicional} é uma expressão numérica primária
|
|
que possui uma das seguintes formas sintáticas:
|
|
% A {\it conditional numeric expression} is a primary numeric expression,
|
|
% which has one of the following two syntactic forms:
|
|
$$
|
|
{\def\arraystretch{1.4}
|
|
\begin{array}{l}
|
|
\mbox{{\tt if} $b$ {\tt then} $x$ {\tt else} $y$}\\
|
|
\mbox{{\tt if} $b$ {\tt then} $x$}\\
|
|
\end{array}
|
|
}
|
|
$$
|
|
onde $b$ é uma expressão lógica, enquanto que $x$ e $y$ são expressões numéricas.
|
|
|
|
% where $b$ is an logical expression, $x$ and $y$ are numeric
|
|
% expressions.
|
|
|
|
|
|
O valor resultante da expressão condicional depende do valor da
|
|
expressão lógica que segue a palavra-chave {\tt if}. Se ela recebe
|
|
o valor {\it verdadeiro}, o valor da expressão condicional é o valor
|
|
da expressão que segue a palavra-chave {\tt then}.
|
|
Caso contrário, se a expressão lógica recebe o valor {\it falso},
|
|
o valor da expressão condicional é o valor da expressão que segue
|
|
a palavra-chave {\it else}. Se ocorre a segunda forma sintática
|
|
da expressão condicional, a reduzida, e a expressão lógica recebe o valor
|
|
{\it falso}, então o valor resultante da expressão condicional é zero.
|
|
|
|
% The resultant value of the conditional expression depends on the value
|
|
% of the logical expression that follows the keyword {\tt if}. If it
|
|
% takes on the value {\it true}, the value of the conditional expression
|
|
% is the value of the expression that follows the keyword {\tt then}.
|
|
% Otherwise, if the logical expression takes on the value {\it false},
|
|
% the value of the conditional expression is the value of the expression
|
|
% that follows the keyword {\it else}. If the second, reduced form of the
|
|
% conditional expression is used and the logical expression takes on the
|
|
% value {\it false}, the resultant value of the conditional expression is
|
|
% zero.
|
|
|
|
\newpage
|
|
|
|
\subsection{Expressões parentizadas}
|
|
|
|
Qualquer expressão numérica pode ser cercada por parênteses, o que as
|
|
torna sintaticamente uma expressão numérica primária.
|
|
|
|
Parênteses podem ser usados em expressões numéricas, como em álgebra, para
|
|
especificar a ordem desejada na qual as operações devem ser realizadas.
|
|
Quando se usam parênteses, a expressão entre parênteses é avaliada
|
|
antes e seu o valor resultante é usado.
|
|
|
|
O valor resultante de uma expressão parentizada é o mesmo
|
|
valor de uma expressão cercada entre parênteses.
|
|
|
|
% Any numeric expression may be enclosed in parentheses that
|
|
% syntactically makes it a primary numeric expression.
|
|
%
|
|
% Parentheses may be used in numeric expressions, as in algebra, to
|
|
% specify the desired order in which operations are to be performed.
|
|
% Where parentheses are used, the expression within the parentheses is
|
|
% evaluated before the resultant value is used.
|
|
%
|
|
% The resultant value of the parenthesized expression is the same as the
|
|
% value of the expression enclosed within parentheses.
|
|
|
|
\subsection{Operadores aritméticos}
|
|
|
|
Em MathProg exitem os seguintes operadores aritméticos, que podem ser
|
|
usados em expressões numéricas:
|
|
|
|
% In MathProg there exist the following arithmetic operators, which may
|
|
% be used in numeric expressions:
|
|
|
|
\begin{tabular}{@{}ll@{}}
|
|
{\tt +} $x$&mais unário\\
|
|
{\tt -} $x$&menos unário\\
|
|
$x$ {\tt +} $y$&adição\\
|
|
$x$ {\tt -} $y$&subtração\\
|
|
$x$ {\tt less} $y$&diferença positiva (se $x<y$ então 0 senão $x-y$)\\
|
|
$x$ {\tt *} $y$&multiplicação\\
|
|
$x$ {\tt /} $y$&divisão\\
|
|
$x$ {\tt div} $y$&quociente da divisão exata\\
|
|
$x$ {\tt mod} $y$&resto da divisão exata\\
|
|
$x$ {\tt **} $y$, $x$ {\tt\textasciicircum} $y$&exponenciação (elevação a uma potência)\\
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% {\tt +} $x$&unary plus\\
|
|
% {\tt -} $x$&unary minus\\
|
|
% $x$ {\tt +} $y$&addition\\
|
|
% $x$ {\tt -} $y$&subtraction\\
|
|
% $x$ {\tt less} $y$&positive difference (if $x<y$ then 0 else $x-y$)\\
|
|
% $x$ {\tt *} $y$&multiplication\\
|
|
% $x$ {\tt /} $y$&division\\
|
|
% $x$ {\tt div} $y$"ient of exact division\\
|
|
% $x$ {\tt mod} $y$&remainder of exact division\\
|
|
% $x$ {\tt **} $y$, $x$ {\tt\textasciicircum} $y$&exponentiation (raising
|
|
% to power)\\
|
|
% \end{tabular}
|
|
|
|
\noindent onde $x$ e $y$ são expressões numéricas.
|
|
|
|
Se a expressão inclui mais de um operador aritmético, todos
|
|
operadores são executados da esquerda para a direita de acordo
|
|
com a hierarquia das operações (veja abaixo) com a única exceção de
|
|
que os operadores de exponenciação são executados da direita para a esquerda.
|
|
|
|
O valor resultante da expressão, que contém operadores aritméticos,
|
|
é o resultado da aplicação dos operadores aos seus operandos.
|
|
|
|
% \noindent where $x$ and $y$ are numeric expressions.
|
|
%
|
|
% If the expression includes more than one arithmetic operator, all
|
|
% operators are performed from left to right according to the hierarchy
|
|
% of operations (see below) with the only exception that the
|
|
% exponentiaion operators are performed from right to left.
|
|
%
|
|
% The resultant value of the expression, which contains arithmetic
|
|
% operators, is the result of applying the operators to their operands.
|
|
|
|
\subsection{Hierarquia das operações}
|
|
\label{hierarchy}
|
|
|
|
A lista seguinte apresenta a hierarquia das operações
|
|
em expressões numéricas:
|
|
|
|
% The following list shows the hierarchy of operations in numeric
|
|
% expressions:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}ll@{}}
|
|
Operação&Hierarquia\\
|
|
\hline
|
|
Avaliação das funções ({\tt abs}, {\tt ceil}, etc.)&
|
|
1{\textsuperscript{\b{a}}}\\
|
|
Exponenciação ({\tt**}, {\tt\textasciicircum})&
|
|
2{\textsuperscript{\b{a}}}\\
|
|
Mais e menos unário ({\tt+}, {\tt-})&
|
|
3{\textsuperscript{\b{a}}}\\
|
|
Multiplicação e divisão ({\tt*}, {\tt/}, {\tt div}, {\tt mod})&
|
|
4{\textsuperscript{\b{a}}}\\
|
|
Operações iteradas ({\tt sum}, {\tt prod}, {\tt min}, {\tt max})&
|
|
5{\textsuperscript{\b{a}}}\\
|
|
Adição e subtração ({\tt+}, {\tt-}, {\tt less})&
|
|
6{\textsuperscript{\b{a}}}\\
|
|
Avaliação condicional ({\tt if} \dots {\tt then} \dots {\tt else})&
|
|
7{\textsuperscript{\b{a}}}\\
|
|
\end{tabular}
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% Operation&Hierarchy\\
|
|
% \hline
|
|
% Evaluation of functions ({\tt abs}, {\tt ceil}, etc.)&1st\\
|
|
% Exponentiation ({\tt**}, {\tt\textasciicircum})&2nd\\
|
|
% Unary plus and minus ({\tt+}, {\tt-})&3rd\\
|
|
% Multiplication and division ({\tt*}, {\tt/}, {\tt div}, {\tt mod})&4th\\
|
|
% Iterated operations ({\tt sum}, {\tt prod}, {\tt min}, {\tt max})&5th\\
|
|
% Addition and subtraction ({\tt+}, {\tt-}, {\tt less})&6th\\
|
|
% Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})&
|
|
% 7th\\
|
|
% \end{tabular}
|
|
|
|
\newpage
|
|
|
|
Esta hierarquia é usada para determinar qual de duas operações consecutivas
|
|
deve ser executada primeiro. Se o primeiro operador possui hierarquia
|
|
maior ou igual ao segundo, a primeira operação é executada. Caso contrário,
|
|
a segunda operação é comparada à terceira e assim sucessivamente.
|
|
Quando se alcança o fim da expressão, todas as operações remanescentes
|
|
são executadas na ordem inversa.
|
|
|
|
% This hierarchy is used to determine which of two consecutive operations
|
|
% is performed first. If the first operator is higher than or equal to
|
|
% the second, the first operation is performed. If it is not, the second
|
|
% operator is compared to the third, etc. When the end of the expression
|
|
% is reached, all of the remaining operations are performed in the
|
|
% reverse order.
|
|
|
|
\section{Expressões simbólicas}
|
|
|
|
Uma {\it expressão simbólica} é uma regra para calcular um valor simbólico individual
|
|
representado como uma cadeia de caracteres.
|
|
|
|
A expressão simbólica primária pode ser uma cadeia literal, um índice,
|
|
um parâmetro não-indexado, um parâmetro indexado, uma função interna de referência,
|
|
uma expressão simbólica condicional ou outra expressão simbólica cercada
|
|
entre parênteses.
|
|
|
|
Também é permitido usar uma expressão numérica como a expressão simbólica primária,
|
|
neste caso o valor resultante da expressão numérica é automaticamente convertido
|
|
em um tipo simbólico.
|
|
|
|
% A {\it symbolic expression} is a rule for computing a single symbolic
|
|
% value represented as a character string.
|
|
%
|
|
% The primary symbolic expression may be a string literal, dummy index,
|
|
% unsubscripted parameter, subscripted parameter, built-in function
|
|
% reference, conditional symbolic expression, or another symbolic
|
|
% expression enclosed in parentheses.
|
|
%
|
|
% It is also allowed to use a numeric expression as the primary symbolic
|
|
% expression, in which case the resultant value of the numeric expression
|
|
% is automatically converted to the symbolic type.
|
|
|
|
\para{Exemplos}
|
|
|
|
\noindent
|
|
\begin{tabular}{@{}ll@{}}
|
|
\verb|'Maio de 2003'|&(literal de cadeia)\\
|
|
\verb|j|&(índice)\\
|
|
\verb|p|&(parâmetro não-indexado)\\
|
|
\verb|s['abc',j+1]|&(parâmetro indexado)\\
|
|
\verb|substr(name[i],k+1,3)|&(função de referência)\\
|
|
\verb|if i in I then s[i,j] & "..." else t[i+1]|& (expressão condicional) \\
|
|
\verb|((10 * b[i,j]) & '.bis')|&(expressão parentizada)\\
|
|
\end{tabular}
|
|
|
|
% \noindent
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% \verb|'May 2003'|&(string literal)\\
|
|
% \verb|j|&(dummy index)\\
|
|
% \verb|p|&(unsubscripted parameter)\\
|
|
% \verb|s['abc',j+1]|&(subscripted parameter)\\
|
|
% \verb|substr(name[i],k+1,3)|&(function reference)\\
|
|
% \verb|if i in I then s[i,j] & "..." else t[i+1]|
|
|
% & (conditional expression) \\
|
|
% \verb|((10 * b[i,j]) & '.bis')|&(parenthesized expression)\\
|
|
% \end{tabular}
|
|
|
|
Expressões simbólicas mais genéricas contendo duas ou mais expressões
|
|
simbólicas primárias podem ser construídas usando o operador de
|
|
concatenação.
|
|
|
|
% More general symbolic expressions containing two or more primary
|
|
% symbolic expressions may be constructed by using the concatenation
|
|
% operator.
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
'abc[' & i & ',' & j & ']'
|
|
"de " & cidade[i] " para " & cidade[j]
|
|
\end{verbatim}
|
|
|
|
% \begin{verbatim}
|
|
% 'abc[' & i & ',' & j & ']'
|
|
% "from " & city[i] " to " & city[j]
|
|
% \end{verbatim}
|
|
|
|
Os princípios da avaliação de expressões simbólicas são completamente
|
|
análogos àqueles dados para expressões numéricas (veja acima).
|
|
|
|
% The principles of evaluation of symbolic expressions are completely
|
|
% analogous to the ones given for numeric expressions (see above).
|
|
|
|
\subsection{Funções de referência}
|
|
|
|
Em MathProg existem as seguintes funções internas que podem ser usadas em
|
|
expressões \linebreak simbólicas:
|
|
|
|
% In MathProg there exist the following built-in functions which may be
|
|
% used in symbolic expressions:
|
|
|
|
\begin{tabular}{@{}p{112pt}p{328pt}@{}}
|
|
{\tt substr(}$s${\tt,} $x${\tt)}&substring de $s$ iniciado na
|
|
posição $x$\\
|
|
{\tt substr(}$s${\tt,} $x${\tt,} $y${\tt)}&substring de $s$ iniciado
|
|
na posição $x$ com tamanho $y$\\
|
|
{\tt time2str(}$t${\tt,} $f${\tt)}&converte o tempo de calendário para
|
|
uma cadeia de caracteres \linebreak (detalhes na Seção \ref{time2str}, página
|
|
\pageref{time2str})\\
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}p{112pt}p{328pt}@{}}
|
|
% {\tt substr(}$s${\tt,} $x${\tt)}&substring of $s$ starting from
|
|
% position $x$\\
|
|
% {\tt substr(}$s${\tt,} $x${\tt,} $y${\tt)}&substring of $s$ starting
|
|
% from position $x$ and having length $y$\\
|
|
% {\tt time2str(}$t${\tt,} $f${\tt)}&converting calendar time to
|
|
% character string (for details see Section \ref{time2str}, page
|
|
% \pageref{time2str})\\
|
|
% \end{tabular}
|
|
|
|
O primeiro argumento de {\tt substr} deve ser uma expressão simbólica
|
|
enquanto que o segundo e o terceiro (opcional) argumentos devem ser
|
|
expressões numéricas.
|
|
|
|
O primeiro argumento de {\tt time2str} deve ser uma expressão numérica,
|
|
e seu segundo argumento deve ser uma expressão simbólica.
|
|
|
|
O valor resultante da expressão simbólica, que é uma função de referência,
|
|
é o resultado de aplicar a função aos seus argumentos.
|
|
|
|
% The first argument of {\tt substr} should be a symbolic expression
|
|
% while its second and optional third arguments should be numeric
|
|
% expressions.
|
|
%
|
|
% The first argument of {\tt time2str} should be a numeric expression,
|
|
% and its second argument should be a symbolic expression.
|
|
%
|
|
% The resultant value of the symbolic expression, which is a function
|
|
% reference, is the result of applying the function to its arguments.
|
|
|
|
\subsection{Operadores simbólicos}
|
|
|
|
Atualmente, em MathProg exite um único operador simbólico:
|
|
$$\mbox{\tt s \& t}$$
|
|
onde $s$ e $t$ são expressões simbólicas. Este operador implica na
|
|
concatenação dos seus dois operandos simbólicos, que são cadeias
|
|
de caracteres.
|
|
|
|
% Currently in MathProg there exists the only symbolic operator:
|
|
% $$\mbox{\tt s \& t}$$
|
|
% where $s$ and $t$ are symbolic expressions. This operator means
|
|
% concatenation of its two symbolic operands, which are character
|
|
% strings.
|
|
|
|
\subsection{Hierarquia de operações}
|
|
|
|
A lista seguinte mostra a hierarquia das operações em expressões
|
|
simbólicas:
|
|
|
|
% The following list shows the hierarchy of operations in symbolic
|
|
% expressions:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}ll@{}}
|
|
Operação&Hierarquia\\
|
|
\hline
|
|
Avaliação de operações numéricas&
|
|
1{\textsuperscript{\b{a}}}-7{\textsuperscript{\b{a}}}\\
|
|
Concatenação ({\tt\&})&8{\textsuperscript{\b{a}}}\\
|
|
Avaliação condicional ({\tt if} \dots {\tt then} \dots {\tt else})&
|
|
9{\textsuperscript{\b{a}}}\\
|
|
\end{tabular}
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% Operation&Hierarchy\\
|
|
% \hline
|
|
% Evaluation of numeric operations&1st-7th\\
|
|
% Concatenation ({\tt\&})&8th\\
|
|
% Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})&
|
|
% 9th\\
|
|
% \end{tabular}
|
|
|
|
Esta hierarquia possui o mesmo significado como explicado acima para
|
|
expressões numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}).
|
|
|
|
% This hierarchy has the same meaning as was explained above for numeric
|
|
% expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}).
|
|
|
|
|
|
\section{Expressões de indexação e índices}
|
|
\label{indexing}
|
|
|
|
Uma {\it expressão indexante} é uma construção auxiliar que especifica um
|
|
conjunto plano de $n$-tuplas e introduz índices. Possui duas formas
|
|
sintáticas:
|
|
% An {\it indexing expression} is an auxiliary construction, which
|
|
% specifies a plain set of $n$-tuples and introduces dummy indices. It
|
|
% has two syntactic forms:
|
|
$$
|
|
{\def\arraystretch{1.4}
|
|
\begin{array}{l}
|
|
\mbox{{\tt\{} {\it entrada}$_1${\tt,} {\it entrada}$_2${\tt,} \dots{\tt,}
|
|
{\it entrada}$_m$ {\tt\}}}\\
|
|
\mbox{{\tt\{} {\it entrada}$_1${\tt,} {\it entrada}$_2${\tt,} \dots{\tt,}
|
|
{\it entrada}$_m$ {\tt:} {\it predicado} {\tt\}}}\\
|
|
\end{array}
|
|
}
|
|
$$
|
|
% $$
|
|
% {\def\arraystretch{1.4}
|
|
% \begin{array}{l}
|
|
% \mbox{{\tt\{} {\it entry}$_1${\tt,} {\it entry}$_2${\tt,} \dots{\tt,}
|
|
% {\it entry}$_m$ {\tt\}}}\\
|
|
% \mbox{{\tt\{} {\it entry}$_1${\tt,} {\it entry}$_2${\tt,} \dots{\tt,}
|
|
% {\it entry}$_m$ {\tt:} {\it predicate} {\tt\}}}\\
|
|
% \end{array}
|
|
% }
|
|
% $$
|
|
onde {\it entrada}{$_1$}, {\it entrada}{$_2$}, \dots, {\it entrada}{$_m$}
|
|
são entradas indexantes, {\it predicado} é uma expressão lógica que especifica
|
|
um predicado opcional (condição lógica).
|
|
|
|
% where {\it entry}{$_1$}, {\it entry}{$_2$}, \dots, {\it entry}{$_m$}
|
|
% are indexing entries, {\it predicate} is a logical expression that
|
|
% specifies an optional predicate (logical condition).
|
|
|
|
Cada {\it entrada indexante} na expressão indexante possui uma das três
|
|
formas seguintes:
|
|
% Each {\it indexing entry} in the indexing expression has one of the
|
|
% following three forms:
|
|
$$
|
|
{\def\arraystretch{1.4}
|
|
\begin{array}{l}
|
|
\mbox{$i$ {\tt in} $S$}\\
|
|
\mbox{{\tt(}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}$i_n${\tt)} {\tt in}
|
|
$S$}\\
|
|
\mbox{$S$}\\
|
|
\end{array}
|
|
}
|
|
$$
|
|
onde $i_1$, $i_2$, \dots, $i_n$ são índices e $S$ é uma expressão de conjunto
|
|
(discutido na próxima seção) que especifica o conjunto básico.
|
|
|
|
% where $i_1$, $i_2$, \dots, $i_n$ are indices, $S$ is a set expression
|
|
% (discussed in the next section) that specifies the basic set.
|
|
|
|
\newpage
|
|
|
|
O número de índices na entrada indexante deve coincidir com a
|
|
dimensão do conjunto básico $S$, i.e., se $S$ consiste de 1-tuplas,
|
|
deve-se usar a primeira forma. Se $S$ consiste de $n$-tuplas, onde
|
|
$n>1$, a segunda forma deve ser usada.
|
|
|
|
% The number of indices in the indexing entry should be the same as the
|
|
% dimension of the basic set $S$, i.e. if $S$ consists of 1-tuples, the
|
|
% first form should be used, and if $S$ consists of $n$-tuples, where
|
|
% $n>1$, the second form should be used.
|
|
|
|
Se a primeira forma da entrada indexante é usada, o índice $i$ pode ser
|
|
apenas um índice (veja mais adiante). Se a segunda forma é utilizada, os índices
|
|
$i_1$, $i_2$, \dots, $i_n$ podem ser tanto índices como alguma expressão numérica
|
|
ou simbólica, em que pelo menos um dos índices deve ser um índice.
|
|
Na terceira, a forma reduzida da entrada indexante possui o mesmo efeito
|
|
se houver $i$ (se $S$ é 1-dimensional) ou
|
|
$i_1$, $i_2$, \dots, $i_n$ (se $S$ é $n$-dimensional) onde todos são especificados
|
|
como índices.
|
|
|
|
% If the first form of the indexing entry is used, the index $i$ can be
|
|
% a dummy index only (see below). If the second form is used, the indices
|
|
% $i_1$, $i_2$, \dots, $i_n$ can be either dummy indices or some numeric
|
|
% or symbolic expressions, where at least one index should be a dummy
|
|
% index. The third, reduced form of the indexing entry has the same
|
|
% effect as if there were $i$ (if $S$ is 1-dimensional) or
|
|
% $i_1$, $i_2$, \dots, $i_n$ (if $S$ is $n$-dimensional) all specified as
|
|
% dummy indices.
|
|
|
|
Um {\it índice} é um objeto auxiliar do modelo, que atua como uma
|
|
variável individual. Os valores atribuídos aos índices são componentes
|
|
das $n$-tuplas dos conjuntos básicos, i.e., algumas quantidades
|
|
numéricas e simbólicas.
|
|
|
|
% A {\it dummy index} is an auxiliary model object, which acts like an
|
|
% individual variable. Values assigned to dummy indices are components of
|
|
% $n$-tuples from basic sets, i.e. some numeric and symbolic quantities.
|
|
|
|
Com propósitos de referência, índices podem ter nomes simbólicos.
|
|
No entanto, diferentemente de outros objetos de modelo (conjuntos,
|
|
parâmetros, etc.) índices não precisam ser \linebreak explicitamente declarados.
|
|
Cada nome simbólico {\it não-declarado} usado na posição indexante de
|
|
uma entrada indexante é reconhecida como o nome simbólico do índice
|
|
correspondente.
|
|
|
|
% For referencing purposes dummy indices can be provided with symbolic
|
|
% names. However, unlike other model objects (sets, parameters, etc.)
|
|
% dummy indices need not be explicitly declared. Each {\it undeclared}
|
|
% symbolic name being used in the indexing position of an indexing entry
|
|
% is recognized as the symbolic name of corresponding dummy index.
|
|
|
|
Os nomes simbólicos dos índices são válidos somente dentro do escopo
|
|
da expressão indexante, onde o índice foi inserido. Além do escopo,
|
|
os índices são completamente inacessíveis, de modo que os mesmos
|
|
nomes simbólicos podem ser usados para outros propósitos, em particular,
|
|
para representar índices em outras expressões indexantes.
|
|
|
|
% Symbolic names of dummy indices are valid only within the scope of the
|
|
% indexing expression, where the dummy indices were introduced. Beyond
|
|
% the scope the dummy indices are completely inaccessible, so the same
|
|
% symbolic names may be used for other purposes, in particular, to
|
|
% represent dummy indices in other indexing expressions.
|
|
|
|
O escopo da expressão indexante, em que declarações implícitas de índices
|
|
são válidas, depende do contexto em que a expressão indexante é usada:
|
|
|
|
% The scope of indexing expression, where implicit declarations of dummy
|
|
% indices are valid, depends on the context, in which the indexing
|
|
% expression is used:
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\begin{itemize}
|
|
\item Se a expressão indexante é usada em um operador-iterado, seu
|
|
escopo se estende até o final do integrando.
|
|
\item Se a expressão indexante é usada como uma expressão de conjunto
|
|
primária, seu escopo de estende até o final desta expressão indexante.
|
|
\item Se a expressão indexante é usada para definir o domínio do subíndice
|
|
na declaração de alguns objetos de modelo, seu escopo se estende até o
|
|
final da declaração correspondente.
|
|
\end{itemize}
|
|
|
|
% \begin{itemize}
|
|
% \item If the indexing expression is used in iterated operator, its
|
|
% scope extends until the end of the integrand.
|
|
% \item If the indexing expression is used as a primary set expression,
|
|
% its scope extends until the end of that indexing expression.
|
|
% \item If the indexing expression is used to define the subscript domain
|
|
% in declarations of some model objects, its scope extends until the end
|
|
% of the corresponding statement.
|
|
% \end{itemize}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
O mecanismo de indexação implementado para indexar expressões é melhor
|
|
explicado por alguns exemplos discutidos abaixo.
|
|
|
|
Sejam três conjuntos:
|
|
% The indexing mechanism implemented by means of indexing expressions is
|
|
% best explained by some examples discussed below.
|
|
%
|
|
% Let there be given three sets:
|
|
$$
|
|
{\def\arraystretch{1.4}
|
|
\begin{array}{l}
|
|
A=\{4,7,9\},\\
|
|
B=\{(1,Jan),(1,Fev),(2,Mar),(2,Abr),(3,Mai),(3,Jun)\},\\
|
|
C=\{a,b,c\},\\
|
|
\end{array}
|
|
}
|
|
$$
|
|
% $$
|
|
% {\def\arraystretch{1.4}
|
|
% \begin{array}{l}
|
|
% A=\{4,7,9\},\\
|
|
% B=\{(1,Jan),(1,Feb),(2,Mar),(2,Apr),(3,May),(3,Jun)\},\\
|
|
% C=\{a,b,c\},\\
|
|
% \end{array}
|
|
% }
|
|
% $$
|
|
onde $A$ e $C$ consistem de 1-tuplas (singletos), $B$ consiste de
|
|
2-tuplas (dobletes). Considere a seguinte expressão indexante:
|
|
$$\mbox{{\tt\{i in A, (j,k) in B, l in C\}}}$$
|
|
onde {\tt i}, {\tt j}, {\tt k}, e {\tt l} são índices.
|
|
|
|
% where $A$ and $C$ consist of 1-tuples (singlets), $B$ consists of
|
|
% 2-tuples (doublets). Consider the following indexing expression:
|
|
% $$\mbox{{\tt\{i in A, (j,k) in B, l in C\}}}$$
|
|
% where {\tt i}, {\tt j}, {\tt k}, and {\tt l} are dummy indices.
|
|
|
|
\newpage
|
|
|
|
Embora MathProg não seja uma linguagem procedural, para qualquer
|
|
expressão indexante uma descrição algorítmica equivalente pode ser dada.
|
|
Em particular, a descrição algorítmica da expressão indexante acima
|
|
poderia ser vista como segue:
|
|
|
|
% Although MathProg is not a procedural language, for any indexing
|
|
% expression an equivalent algorithmic description can be given. In
|
|
% particular, the algorithmic description of the indexing expression
|
|
% above could look like follows:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}l@{}}
|
|
{\bf para todo} $i\in A$ {\bf faça}\\
|
|
\hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf faça}\\
|
|
\hspace{32pt}{\bf para todo} $l\in C$ {\bf faça}\\
|
|
\hspace{48pt}{\it ação};\\
|
|
\end{tabular}
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}l@{}}
|
|
% {\bf for all} $i\in A$ {\bf do}\\
|
|
% \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf do}\\
|
|
% \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\
|
|
% \hspace{48pt}{\it action};\\
|
|
% \end{tabular}
|
|
|
|
\noindent onde os índices $i$, $j$, $k$, $l$ são consecutivamente
|
|
atribuídos aos componentes correspondentes das $n$-tuplas dos conjuntos
|
|
básicos $A$, $B$, $C$, e {\it ação} é alguma ação que dependa do contexto
|
|
no qual a expressão indexante é usada. Por exemplo, se a ação fosse
|
|
imprimir os valores atuais dos índices, a impressão seria vista como segue:
|
|
|
|
% \noindent where the dummy indices $i$, $j$, $k$, $l$ are consecutively
|
|
% assigned corresponding components of $n$-tuples from the basic sets $A$,
|
|
% $B$, $C$, and {\it action} is some action that depends on the context,
|
|
% where the indexing expression is used. For example, if the action were
|
|
% printing current values of dummy indices, the printout would look like
|
|
% follows:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}llll@{}}
|
|
$i=4$&$j=1$&$k=Jan$&$l=a$\\
|
|
$i=4$&$j=1$&$k=Jan$&$l=b$\\
|
|
$i=4$&$j=1$&$k=Jan$&$l=c$\\
|
|
$i=4$&$j=1$&$k=Fev$&$l=a$\\
|
|
$i=4$&$j=1$&$k=Fev$&$l=b$\\
|
|
\multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\
|
|
$i=9$&$j=3$&$k=Jun$&$l=b$\\
|
|
$i=9$&$j=3$&$k=Jun$&$l=c$\\
|
|
\end{tabular}
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}llll@{}}
|
|
% $i=4$&$j=1$&$k=Jan$&$l=a$\\
|
|
% $i=4$&$j=1$&$k=Jan$&$l=b$\\
|
|
% $i=4$&$j=1$&$k=Jan$&$l=c$\\
|
|
% $i=4$&$j=1$&$k=Feb$&$l=a$\\
|
|
% $i=4$&$j=1$&$k=Feb$&$l=b$\\
|
|
% \multicolumn{4}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}\\
|
|
% $i=9$&$j=3$&$k=Jun$&$l=b$\\
|
|
% $i=9$&$j=3$&$k=Jun$&$l=c$\\
|
|
% \end{tabular}
|
|
|
|
Seja o exemplo da expressão indexante usado na seguinte
|
|
operação iterada:
|
|
$$\mbox{{\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]}}$$
|
|
onde {\tt p} é uma parâmetro numérico 4-dimensional ou alguma
|
|
expressão numérica cujo valor resultante dependa de
|
|
{\tt i}, {\tt j}, {\tt k} e {\tt l}. Neste caso, a ação é o somatório,
|
|
de forma que o valor resultante da expressão numérica primária é:
|
|
$$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$
|
|
|
|
% Let the example indexing expression be used in the following iterated
|
|
% operation:
|
|
% $$\mbox{{\tt sum\{i in A, (j,k) in B, l in C\} p[i,j,k,l]}}$$
|
|
% where {\tt p} is a 4-dimensional numeric parameter or some numeric
|
|
% expression whose resultant value depends on {\tt i}, {\tt j}, {\tt k},
|
|
% and {\tt l}. In this case the action is summation, so the resultant
|
|
% value of the primary numeric expression is:
|
|
% $$\sum_{i\in A,(j,k)\in B,l\in C}(p_{ijkl}).$$
|
|
|
|
Agora seja a expressão indexante do exemplo usada como uma expressão
|
|
de conjunto primária. Neste caso, a ação é reunir todas as 4-tuplas
|
|
(quádruplas) da forma $(i,j,k,l)$ em um conjunto, de forma que o
|
|
valor resultante de tal operação é simplesmente o produto
|
|
Cartesiano dos conjuntos básicos:
|
|
$$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$
|
|
Note que neste caso, a mesma expressão indexante pode ser escrita
|
|
na forma reduzida:
|
|
$$\mbox{{\tt\{A, B, C\}}}$$
|
|
pois os índices $i$, $j$, $k$ e $l$ não são referenciados, portanto,
|
|
seus nomes simbólicos não precisam ser especificados.
|
|
|
|
% Now let the example indexing expression be used as a primary set
|
|
% expression. In this case the action is gathering all 4-tuples
|
|
% (quadruplets) of the form $(i,j,k,l)$ in one set, so the resultant
|
|
% value of such operation is simply the Cartesian product of the basic
|
|
% sets:
|
|
% $$A\times B\times C=\{(i,j,k,l):i\in A,(j,k)\in B,l\in C\}.$$
|
|
% Note that in this case the same indexing expression might be written in
|
|
% the reduced form:
|
|
% $$\mbox{{\tt\{A, B, C\}}}$$
|
|
% because the dummy indices $i$, $j$, $k$, and $l$ are not referenced and
|
|
% therefore their symbolic names need not be specified.
|
|
|
|
\newpage
|
|
|
|
Finalmente, seja a expressão indexante do exemplo usada como o domínio do
|
|
subíndice na declaração de um objeto de modelo 4-dimensional, por exemplo,
|
|
um parâmetro numérico:
|
|
% Finally, let the example indexing expression be used as the subscript
|
|
% domain in the declaration of a 4-dimensional model object, say,
|
|
% a numeric parameter:
|
|
$$\mbox{{\tt param p\{i in A, (j,k) in B, l in C\}} \dots {\tt;}}$$
|
|
|
|
\noindent Neste caso, a ação é gerar os membros do parâmetro,
|
|
onde cada membro possui a forma $p[i,j,k,l]$.
|
|
|
|
% \noindent In this case the action is generating the parameter members,
|
|
% where each member has the form $p[i,j,k,l]$.
|
|
|
|
Como mencionado anteriormente, alguns índices da segunda forma das entradas
|
|
indexantes podem ser expressões numéricas ou simbólicas, não apenas índices.
|
|
Neste caso, os valores resultantes destas expressões desempenham o papel
|
|
de algumas condições lógicas para selecionar apenas aquelas $n$-tuplas
|
|
do produto Cartesiano dos conjuntos básicos que satisfaçam estas
|
|
condições.
|
|
|
|
% As was said above, some indices in the second form of indexing entries
|
|
% may be numeric or symbolic expressions, not only dummy indices. In this
|
|
% case resultant values of such expressions play role of some logical
|
|
% conditions to select only that $n$-tuples from the Cartesian product of
|
|
% basic sets that satisfy these conditions.
|
|
|
|
Considere, por exemplo, a seguinte expressão indexante:
|
|
$$\mbox{{\tt\{i in A, (i-1,k) in B, l in C\}}}$$
|
|
onde {\tt i}, {\tt k} e {\tt l} são índices, e {\tt i-1} é uma
|
|
expressão numérica. A descrição algorítmica desta expressão
|
|
indexante é a seguinte:
|
|
|
|
% Consider, for example, the following indexing expression:
|
|
% $$\mbox{{\tt\{i in A, (i-1,k) in B, l in C\}}}$$
|
|
% where {\tt i}, {\tt k}, {\tt l} are dummy indices, and {\tt i-1} is
|
|
% a numeric expression. The algorithmic decsription of this indexing
|
|
% expression is the following:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}l@{}}
|
|
{\bf para todo} $i\in A$ {\bf faça}\\
|
|
\hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf e} $j=i-1$ {\bf faça}\\
|
|
\hspace{32pt}{\bf para todo} $l\in C$ {\bf faça}\\
|
|
\hspace{48pt}{\it ação};\\
|
|
\end{tabular}
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}l@{}}
|
|
% {\bf for all} $i\in A$ {\bf do}\\
|
|
% \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf and} $j=i-1$ {\bf do}\\
|
|
% \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\
|
|
% \hspace{48pt}{\it action};\\
|
|
% \end{tabular}
|
|
|
|
\noindent Assim, se esta expressão indexante fosse usada como uma expressão de conjunto
|
|
primária, o conjunto resultante seira o seguinte:
|
|
$$\{(4,Mai,a),(4,Mai,b),(4,Mai,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$
|
|
Deve-se notar que neste caso o conjunto resultante consiste em 3-tuplas,
|
|
e não de 4-tuplas, porque na expressão indexante não há índice que
|
|
corresponda ao primeiro componente das 2-tuplas do conjunto $B$.
|
|
|
|
% \noindent Thus, if this indexing expression were used as a primary set
|
|
% expression, the resultant set would be the following:
|
|
% $$\{(4,May,a),(4,May,b),(4,May,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)\}.$$
|
|
% Should note that in this case the resultant set consists of 3-tuples,
|
|
% not of 4-tuples, because in the indexing expression there is no dummy
|
|
% index that corresponds to the first component of 2-tuples from the set
|
|
% $B$.
|
|
|
|
A regra geral é: o número de componentes de $n$-tuplas definido por
|
|
uma expressão indexante é o mesmo do número de índices naquela expressão,
|
|
onde a correspondência entre índices e componentes nas $n$-tuplas no
|
|
conjunto resultante é posicional, i.e., o primeiro índice corresponde
|
|
ao primeiro componente, o segundo índice corresponde ao segundo
|
|
componente, etc.
|
|
|
|
% The general rule is: the number of components of $n$-tuples defined by
|
|
% an indexing expression is the same as the number of dummy indices in
|
|
% that expression, where the correspondence between dummy indices and
|
|
% components on $n$-tuples in the resultant set is positional, i.e. the
|
|
% first dummy index corresponds to the first component, the second dummy
|
|
% index corresponds to the second component, etc.
|
|
|
|
Em alguns casos é necessário selecionar um subconjunto do produto
|
|
Cartesiano de alguns \linebreak conjuntos. Isto pode ser alcançado mediante o
|
|
emprego de um predicado lógico opcional, que é especificado na
|
|
expressão indexante.
|
|
|
|
% In some cases it is needed to select a subset from the Cartesian
|
|
% product of some sets. This may be attained by using an optional logical
|
|
% predicate, which is specified in the indexing expression.
|
|
|
|
Considere, por exemplo, a seguinte expressão indexante:
|
|
$$\mbox{{\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}}}$$
|
|
onde a expressão lógica após os dois pontos é um predicado. A
|
|
descrição algorítmica desta expressão indexante é a seguinte:
|
|
|
|
% Consider, for example, the following indexing expression:
|
|
% $$\mbox{{\tt\{i in A, (j,k) in B, l in C: i <= 5 and k <> 'Mar'\}}}$$
|
|
% where the logical expression following the colon is a predicate. The
|
|
% algorithmic description of this indexing expression is the following:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}l@{}}
|
|
{\bf para todo} $i\in A$ {\bf faça}\\
|
|
\hspace{16pt}{\bf para todo} $(j,k)\in B$ {\bf faça}\\
|
|
\hspace{32pt}{\bf para todo} $l\in C$ {\bf faça}\\
|
|
\hspace{48pt}{\bf se} $i\leq 5$ {\bf e} $k\neq`Mar'$ {\bf então}\\
|
|
\hspace{64pt}{\it ação};\\
|
|
\end{tabular}
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}l@{}}
|
|
% {\bf for all} $i\in A$ {\bf do}\\
|
|
% \hspace{16pt}{\bf for all} $(j,k)\in B$ {\bf do}\\
|
|
% \hspace{32pt}{\bf for all} $l\in C$ {\bf do}\\
|
|
% \hspace{48pt}{\bf if} $i\leq 5$ {\bf and} $k\neq`Mar'$ {\bf then}\\
|
|
% \hspace{64pt}{\it action};\\
|
|
% \end{tabular}
|
|
|
|
\noindent Assim, se a expressão indexante fosse usada como uma
|
|
expressão de conjunto primária, o conjunto resultante seria o seguinte:
|
|
$$\{(4,1,Jan,a),(4,1,Fev,a),(4,2,Abr,a),\dots,(4,3,Jun,c)\}.$$
|
|
|
|
Se o predicado não é especificado na expressão indexante assume-se um,
|
|
que recebe o valor {\it verdadeiro}.
|
|
|
|
% \noindent Thus, if this indexing expression were used as a primary set
|
|
% expression, the resultant set would be the following:
|
|
% $$\{(4,1,Jan,a),(4,1,Feb,a),(4,2,Apr,a),\dots,(4,3,Jun,c)\}.$$
|
|
%
|
|
% If no predicate is specified in the indexing expression, one, which
|
|
% takes on the value {\it true}, is assumed.
|
|
|
|
\section{Expressões de conjunto}
|
|
|
|
Uma {\it expressão de conjunto} é uma regra para calcular um conjunto
|
|
elementar, i.e., uma coleção de $n$-tuplas, onde os componentes das
|
|
$n$-tuplas são quantidades numéricas e simbólicas.
|
|
|
|
% A {\it set expression} is a rule for computing an elemental set, i.e.
|
|
% a collection of $n$-tuples, where components of $n$-tuples are numeric
|
|
% and symbolic quantities.
|
|
|
|
A expressão de conjunto primária pode ser um conjunto de literais, um conjunto
|
|
não-indexado, um conjunto indexado, um conjunto ``aritmético'', uma expressão
|
|
indexante, uma expressão de \linebreak conjunto iterada, uma expressão de conjunto
|
|
condicional ou outra expressão cercada por \linebreak parênteses.
|
|
|
|
\para{Exemplos}
|
|
|
|
% The primary set expression may be a literal set, unsubscripted set,
|
|
% subscripted set, ``arithmetic'' set, indexing expression, iterated set
|
|
% expression, conditional set expression, or another set expression
|
|
% enclosed in parentheses.
|
|
%
|
|
% \para{Examples}
|
|
|
|
\noindent
|
|
\begin{tabular}{@{}ll@{}}
|
|
\verb|{(123,'aaa'), (i+1,'bbb'), (j-1,'ccc')}| &(conjunto de literais)\\
|
|
\verb|I| &(conjunto não-indexado)\\
|
|
\verb|S[i-1,j+1]| &(conjunto indexado)\\
|
|
\verb|1..t-1 by 2| &(conjunto ``aritmético'')\\
|
|
\verb|{t in 1..T, (t+1,j) in S: (t,j) in F}| &(expressão indexante)\\
|
|
\verb|setof{i in I, j in J}(i+1,j-1)| &(expressão de conjunto iterado)\\
|
|
\verb|if i < j then S[i,j] else F diff S[i,j]| &(expressão de conjunto
|
|
condicional)\\
|
|
\verb|(1..10 union 21..30)| &(expressão de conjunto parentizado)\\
|
|
\end{tabular}
|
|
|
|
% \noindent
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% \verb|{(123,'aaa'), (i+1,'bbb'), (j-1,'ccc')}| &(literal set)\\
|
|
% \verb|I| &(unsubscripted set)\\
|
|
% \verb|S[i-1,j+1]| &(subscripted set)\\
|
|
% \verb|1..t-1 by 2| &(``arithmetic'' set)\\
|
|
% \verb|{t in 1..T, (t+1,j) in S: (t,j) in F}| &(indexing expression)\\
|
|
% \verb|setof{i in I, j in J}(i+1,j-1)| &(iterated set expression)\\
|
|
% \verb|if i < j then S[i,j] else F diff S[i,j]| &(conditional set
|
|
% expression)\\
|
|
% \verb|(1..10 union 21..30)| &(parenthesized set expression)\\
|
|
% \end{tabular}
|
|
|
|
Expressões de conjuntos mais genéricas contendo duas ou mais expressões
|
|
de conjunto primárias podem ser construídas usando operadores
|
|
específicos de conjunto .
|
|
|
|
\para{Exemplos}
|
|
|
|
% More general set expressions containing two or more primary set
|
|
% expressions may be constructed by using certain set operators.
|
|
%
|
|
% \para{Examples}
|
|
|
|
\begin{verbatim}
|
|
(A union B) inter (I cross J)
|
|
1..10 cross (if i < j then {'a', 'b', 'c'} else {'d', 'e', 'f'})
|
|
\end{verbatim}
|
|
|
|
\subsection{Conjuntos de literais}
|
|
|
|
Um {\it conjunto de literais} é uma expressão de conjunto primária
|
|
que possui as duas formas \linebreak sintáticas seguintes:
|
|
% A {\it literal set} is a primary set expression, which has the
|
|
% following two syntactic forms:
|
|
$$
|
|
{\def\arraystretch{1.4}
|
|
\begin{array}{l}
|
|
\mbox{{\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}}}\\
|
|
\mbox{{\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),}
|
|
{\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,}
|
|
{\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}}}\\
|
|
\end{array}
|
|
}
|
|
$$
|
|
% $$
|
|
% {\def\arraystretch{1.4}
|
|
% \begin{array}{l}
|
|
% \mbox{{\tt\{}$e_1${\tt,} $e_2${\tt,} \dots{\tt,} $e_m${\tt\}}}\\
|
|
% \mbox{{\tt\{(}$e_{11}${\tt,} \dots{\tt,} $e_{1n}${\tt),}
|
|
% {\tt(}$e_{21}${\tt,} \dots{\tt,} $e_{2n}${\tt),} \dots{\tt,}
|
|
% {\tt(}$e_{m1}${\tt,} \dots{\tt,} $e_{mn}${\tt)\}}}\\
|
|
% \end{array}
|
|
% }
|
|
% $$
|
|
onde $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ são expressões
|
|
numéricas ou simbólicas.
|
|
|
|
Se a primeira forma é adotada, o conjunto resultante consiste
|
|
de 1-tuplas (singletos) enumerados entre as chaves.
|
|
É permitido especificar um conjunto vazio como {\tt\{\ \}},
|
|
que não possui 1-tuplas. Se a segunda forma é adotada,
|
|
o conjunto resultante consiste de $n$-tuplas enumeradas entre as chaves,
|
|
onde uma $n$-tupla particular consiste nos componentes correspondentes
|
|
enumerados entre parênteses. Todas as $n$-tuplas devem ter o mesmo
|
|
número de componentes.
|
|
|
|
% where $e_1$, \dots, $e_m$, $e_{11}$, \dots, $e_{mn}$ are numeric or
|
|
% symbolic expressions.
|
|
%
|
|
% If the first form is used, the resultant set consists of 1-tuples
|
|
% (singlets) enumerated within the curly braces. It is allowed to specify
|
|
% an empty set as {\tt\{\ \}}, which has no 1-tuples. If the second form
|
|
% is used, the resultant set consists of $n$-tuples enumerated within the
|
|
% curly braces, where a particular $n$-tuple consists of corresponding
|
|
% components enumerated within the parentheses. All $n$-tuples should
|
|
% have the same number of components.
|
|
|
|
\subsection{Conjuntos não-indexados}
|
|
|
|
Se a expressão de conjunto primária é um conjunto não-indexado
|
|
(que deve ser 0-dimensional), o conjunto resultante é um conjunto
|
|
elementar associado com o objeto conjunto correspondente.
|
|
|
|
% If the primary set expression is an unsubscripted set (which should be
|
|
% 0-dimen\-sional), the resultant set is an elemental set associated with
|
|
% the corresponding set object.
|
|
|
|
\subsection{Conjuntos indexados}
|
|
|
|
A expressão de conjunto primária, que se refere a um conjunto indexado,
|
|
tem a seguinte forma sintática:
|
|
$$\mbox{{\it nome}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}
|
|
$i_n${\tt]}}$$
|
|
onde {\it nome} é o nome simbólico do objeto conjunto e $i_1$, $i_2$,
|
|
\dots, $i_n$ são subíndices.
|
|
|
|
% The primary set expression, which refers to a subscripted set, has the
|
|
% following syntactic form:
|
|
% $$\mbox{{\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}
|
|
% $i_n${\tt]}}$$
|
|
% where {\it name} is the symbolic name of the set object, $i_1$, $i_2$,
|
|
% \dots, $i_n$ are subscripts.
|
|
|
|
Cada subíndice deve ser uma expressão numérica ou simbólica. O número de
|
|
subíndices nas lista de subíndices deve ser o mesmo da dimensão do objeto
|
|
conjunto com o qual as lista de subíndice está associada.
|
|
|
|
Os valores correntes das expressões de subíndices são usados para identificar
|
|
um membro \linebreak particular do objeto conjunto que determina o conjunto resultante.
|
|
|
|
% Each subscript should be a numeric or symbolic expression. The number
|
|
% of subscripts in the subscript list should be the same as the dimension
|
|
% of the set object with which the subscript list is associated.
|
|
%
|
|
% Actual values of subscript expressions are used to identify a
|
|
% particular member of the set object that determines the resultant set.
|
|
|
|
\subsection{Conjuntos ``aritméticos''}
|
|
|
|
A expressão de conjunto primária que constitui um conjunto ``aritmético'',
|
|
possui as duas formas sintáticas seguintes:
|
|
% The primary set expression, which is an ``arithmetic'' set, has the
|
|
% following two syntactic forms:
|
|
$$
|
|
{\def\arraystretch{1.4}
|
|
\begin{array}{l}
|
|
\mbox{$t_0$ {\tt..} $t_1$ {\tt by} $\delta t$}\\
|
|
\mbox{$t_0$ {\tt..} $t_1$}\\
|
|
\end{array}
|
|
}
|
|
$$
|
|
onde $t_0$, $t_1$, e $\delta t$ são expressões numéricas (o valor de
|
|
$\delta t$ não deve ser zero). A segunda forma é equivalente a primeira
|
|
forma, onde $\delta t=1$.
|
|
|
|
Se $\delta t>0$, o conjunto resultante é determinado como segue:
|
|
$$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$
|
|
Caso contrário, se $\delta t<0$, o conjunto resultante é determinado como segue:
|
|
$$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$
|
|
% $$
|
|
% {\def\arraystretch{1.4}
|
|
% \begin{array}{l}
|
|
% \mbox{$t_0$ {\tt..} $t_1$ {\tt by} $\delta t$}\\
|
|
% \mbox{$t_0$ {\tt..} $t_1$}\\
|
|
% \end{array}
|
|
% }
|
|
% $$
|
|
% where $t_0$, $t_1$, and $\delta t$ are numeric expressions (the value
|
|
% of $\delta t$ should not be zero). The second form is equivalent to the
|
|
% first form, where $\delta t=1$.
|
|
%
|
|
% If $\delta t>0$, the resultant set is determined as follows:
|
|
% $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_0\leq t\leq t_1)\}.$$
|
|
% Otherwise, if $\delta t<0$, the resultant set is determined as follows:
|
|
% $$\{t:\exists k\in{\cal Z}(t=t_0+k\delta t,\ t_1\leq t\leq t_0)\}.$$
|
|
|
|
\subsection{Expressões indexantes}
|
|
|
|
Se a expressão primária é uma expressão indexante, o conjunto resultante
|
|
é determinado como descrito anteriormente, na Seção \ref{indexing}, página
|
|
\pageref{indexing}.
|
|
|
|
% If the primary set expression is an indexing expression, the resultant
|
|
% set is determined as described above in Section \ref{indexing}, page
|
|
% \pageref{indexing}.
|
|
|
|
\newpage
|
|
|
|
\subsection{Expressões iteradas}
|
|
|
|
Uma {\it expressão de conjunto iterada} é uma expressão de conjunto
|
|
primária, que possui a seguinte forma sintática:
|
|
$$\mbox{{\tt setof} {\it expressão-indexante} {\it integrando}}$$
|
|
onde {\it expressão-indexante} é uma expressão indexante, que
|
|
introduz índices e controla a iteração, {\it integrando} é
|
|
tanto uma expressão numérica ou simbólica individual, como uma
|
|
lista de expressões numéricas ou simbólicas separadas por vírgula
|
|
e cercadas entre parênteses.
|
|
|
|
% An {\it iterated set expression} is a primary set expression, which has
|
|
% the following syntactic form:
|
|
% $$\mbox{{\tt setof} {\it indexing-expression} {\it integrand}}$$
|
|
% where {\it indexing-expression} is an indexing expression, which
|
|
% introduces dummy indices and controls iterating, {\it integrand} is
|
|
% either a single numeric or symbolic expression or a list of numeric and
|
|
% symbolic expressions separated by commae and enclosed in parentheses.
|
|
|
|
Se o integrando é uma expressão numérica ou simbólica individual, o
|
|
conjunto resultante consiste de 1-tuplas, sendo determinado como segue:
|
|
$$\{x:(i_1,\dots,i_n)\in\Delta\},$$
|
|
\noindent onde $x$ é um valor do integrando, $i_1$, \dots, $i_n$
|
|
são índices introduzidos na expressão indexante, $\Delta$ é
|
|
o domínio, um conjunto de $n$-tuplas especificado pela expressão
|
|
indexante que define valores particulares atribuídos aos índices ao
|
|
realizar a operação de iteração.
|
|
|
|
% If the integrand is a single numeric or symbolic expression, the
|
|
% resultant set consists of 1-tuples and is determined as follows:
|
|
% $$\{x:(i_1,\dots,i_n)\in\Delta\},$$
|
|
% \noindent where $x$ is a value of the integrand, $i_1$, \dots, $i_n$
|
|
% are dummy indices introduced in the indexing expression, $\Delta$ is
|
|
% the domain, a set of $n$-tuples specified by the indexing expression,
|
|
% which defines particular values assigned to the dummy indices on
|
|
% performing the iterated operation.
|
|
|
|
Se o integrando é uma lista contendo $m$ expressões numéricas e simbólicas,
|
|
o conjunto resultante consiste de $m$-tuplas, sendo determinado
|
|
como segue:
|
|
$$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$
|
|
onde $x_1$, \dots, $x_m$ são valores das expressões na lista
|
|
de integrandos, $i_1$, \dots, $i_n$ e $\Delta$ possuem o mesmo significado
|
|
anterior.
|
|
|
|
% If the integrand is a list containing $m$ numeric and symbolic
|
|
% expressions, the resultant set consists of $m$-tuples and is determined
|
|
% as follows:
|
|
% $$\{(x_1,\dots,x_m):(i_1,\dots,i_n)\in\Delta\},$$
|
|
% where $x_1$, \dots, $x_m$ are values of the expressions in the
|
|
% integrand list, $i_1$, \dots, $i_n$ and $\Delta$ have the same meaning
|
|
% as above.
|
|
|
|
\subsection{Expressões condicionais}
|
|
|
|
Uma {\it expressão de conjunto condicional} é uma expressão de conjunto
|
|
primária que possui a seguinte forma sintática:
|
|
$$\mbox{{\tt if} $b$ {\tt then} $X$ {\tt else} $Y$}$$
|
|
onde $b$ é uma expressão lógica, $X$ e $Y$ são expressões de conjunto,
|
|
que devem definir conjuntos da mesma dimensão.
|
|
|
|
% A {\it conditional set expression} is a primary set expression that has
|
|
% the following syntactic form:
|
|
% $$\mbox{{\tt if} $b$ {\tt then} $X$ {\tt else} $Y$}$$
|
|
% where $b$ is an logical expression, $X$ and $Y$ are set expressions,
|
|
% which should define sets of the same dimension.
|
|
|
|
O valor resultante da expressão condicional depende do valor da
|
|
expressão lógica que segue a palavra-chave {\tt if}. Se ela recebe
|
|
o valor {\it verdadeiro}, o conjunto resultante é o valor da expressão
|
|
que segue a palavra-chave {\tt then}. Caso contrário, se a
|
|
expressão lógica recebe o valor {\it falso}, o conjunto resultante é
|
|
o valor da expressão que segue a palavra-chave {\tt else}.
|
|
|
|
% The resultant value of the conditional expression depends on the value
|
|
% of the logical expression that follows the keyword {\tt if}. If it
|
|
% takes on the value {\it true}, the resultant set is the value of the
|
|
% expression that follows the keyword {\tt then}. Otherwise, if the
|
|
% logical expression takes on the value {\it false}, the resultant set is
|
|
% the value of the expression that follows the keyword {\tt else}.
|
|
|
|
\subsection{Expressões parentizadas}
|
|
|
|
Qualquer expressão de conjunto pode ser cercada entre parênteses, o que as tornam
|
|
\linebreak sintaticamente uma expressão de conjunto primária.
|
|
Parênteses podem ser usados em expressões de conjunto, como em álgebra, para
|
|
especificar a ordem desejada nas quais as operações devem ser executadas.
|
|
Quando se usam parênteses, a expressão entre parênteses é avaliada
|
|
antes que o valor resultante seja usado.
|
|
O valor resultante de uma expressão parentizada é idêntico ao valor da expressão
|
|
cercada entre parênteses.
|
|
|
|
% Any set expression may be enclosed in parentheses that syntactically
|
|
% makes it a primary set expression.
|
|
%
|
|
% Parentheses may be used in set expressions, as in algebra, to specify
|
|
% the desired order in which operations are to be performed. Where
|
|
% parentheses are used, the expression within the parentheses is
|
|
% evaluated before the resultant value is used.
|
|
%
|
|
% The resultant value of the parenthesized expression is the same as the
|
|
% value of the expression enclosed within parentheses.
|
|
|
|
\newpage
|
|
|
|
\subsection{Operadores de conjunto}
|
|
|
|
Em MathProg existem os seguintes operadores de conjunto, que podem ser
|
|
usados em expressões de conjunto:
|
|
|
|
% In MathProg there exist the following set operators, which may be used
|
|
% in set expressions:
|
|
|
|
\begin{tabular}{@{}ll@{}}
|
|
$X$ {\tt union} $Y$&união $X\cup Y$\\
|
|
$X$ {\tt diff} $Y$&diferença $X\backslash Y$\\
|
|
$X$ {\tt symdiff} $Y$&diferença simétrica
|
|
$X\oplus Y=(X\backslash Y)\cup(Y\backslash X)$\\
|
|
$X$ {\tt inter} $Y$&interseção $X\cap Y$\\
|
|
$X$ {\tt cross} $Y$&produto Cartesiano (cruzado) $X\times Y$\\
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% $X$ {\tt union} $Y$&union $X\cup Y$\\
|
|
% $X$ {\tt diff} $Y$&difference $X\backslash Y$\\
|
|
% $X$ {\tt symdiff} $Y$&symmetric difference
|
|
% $X\oplus Y=(X\backslash Y)\cup(Y\backslash X)$\\
|
|
% $X$ {\tt inter} $Y$&intersection $X\cap Y$\\
|
|
% $X$ {\tt cross} $Y$&cross (Cartesian) product $X\times Y$\\
|
|
% \end{tabular}
|
|
|
|
\noindent onde $X$ e Y são expressões de conjunto, que devem definir conjuntos
|
|
de dimensões idênticas (exceto o produto Cartesiano).
|
|
|
|
Se a expressão inclui mais de um operador de conjunto, todos operadores
|
|
são executados da esquerda para a direita de acordo com a hierarquia das
|
|
operações (veja adiante).
|
|
|
|
O valor resultante da expressão, que contém operadores de conjunto, é
|
|
o resultado da aplicação dos operadores aos seus operandos.
|
|
|
|
A dimensão do conjunto resultante, i.e., a dimensão das $n$-tuplas,
|
|
dos quais consistem o conjunto resultante, é a mesma da dimensão dos
|
|
operandos, exceto o produto Cartesiano, onde a dimensão do conjunto
|
|
resultante é a soma das dimensões dos seus operandos.
|
|
|
|
% \noindent where $X$ and Y are set expressions, which should define sets
|
|
% of identical dimension (except the Cartesian product).
|
|
%
|
|
% If the expression includes more than one set operator, all operators
|
|
% are performed from left to right according to the hierarchy of
|
|
% operations (see below).
|
|
%
|
|
% The resultant value of the expression, which contains set operators, is
|
|
% the result of applying the operators to their operands.
|
|
%
|
|
% The dimension of the resultant set, i.e. the dimension of $n$-tuples,
|
|
% of which the resultant set consists of, is the same as the dimension of
|
|
% the operands, except the Cartesian product, where the dimension of the
|
|
% resultant set is the sum of the dimensions of its operands.
|
|
|
|
\subsection{Hierarquia das operações}
|
|
|
|
A lista seguinte mostra a hierarquia das operações em expressões de conjunto:
|
|
|
|
% The following list shows the hierarchy of operations in set
|
|
% expressions:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}ll@{}}
|
|
Operação&Hierarquia\\
|
|
\hline
|
|
Avaliação de operações numéricas&
|
|
1{\textsuperscript{\b{a}}}-7{\textsuperscript{\b{a}}}\\
|
|
Avaliação de operações simbólicas&
|
|
8{\textsuperscript{\b{a}}}-9{\textsuperscript{\b{a}}}\\
|
|
Avaliação de conjuntos iterados ou ``aritméticos'' ({\tt setof}, {\tt..})&
|
|
10{\textsuperscript{\b{a}}}\\
|
|
Produto Cartesiano ({\tt cross})&
|
|
11{\textsuperscript{\b{a}}}\\
|
|
Interseção ({\tt inter})&
|
|
12{\textsuperscript{\b{a}}}\\
|
|
União e diferença ({\tt union}, {\tt diff}, {\tt symdiff})&
|
|
13{\textsuperscript{\b{a}}}\\
|
|
Avaliação condicional ({\tt if} \dots {\tt then} \dots {\tt else})&
|
|
14{\textsuperscript{\b{a}}}\\
|
|
\end{tabular}
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% Operation&Hierarchy\\
|
|
% \hline
|
|
% Evaluation of numeric operations&1st-7th\\
|
|
% Evaluation of symbolic operations&8th-9th\\
|
|
% Evaluation of iterated or ``arithmetic'' set ({\tt setof}, {\tt..})&
|
|
% 10th\\
|
|
% Cartesian product ({\tt cross})&11th\\
|
|
% Intersection ({\tt inter})&12th\\
|
|
% Union and difference ({\tt union}, {\tt diff}, {\tt symdiff})&13th\\
|
|
% Conditional evaluation ({\tt if} \dots {\tt then} \dots {\tt else})&
|
|
% 14th\\
|
|
% \end{tabular}
|
|
|
|
Esta hierarquia possui o mesmo significado como explicado anteriormente
|
|
para expressões \linebreak numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}).
|
|
|
|
% This hierarchy has the same meaning as was explained above for numeric
|
|
% expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}).
|
|
|
|
\newpage
|
|
|
|
\section{Expressões lógicas}
|
|
|
|
Uma {\it expressão lógica} é uma regra para calcular um valor lógico
|
|
individual, que pode ser {\it verdadeiro} ou {\it falso}.
|
|
|
|
A expressão lógica primária pode ser uma expressão numérica,
|
|
uma expressão relacional, uma expressão lógica iterada ou
|
|
outra expressão lógica cercada entre parênteses.
|
|
|
|
\para{Exemplos}
|
|
|
|
% A {\it logical expression} is a rule for computing a single logical
|
|
% value, which can be either {\it true} or {\it false}.
|
|
%
|
|
% The primary logical expression may be a numeric expression, relational
|
|
% expression, iterated logical expression, or another logical expression
|
|
% enclosed in parentheses.
|
|
%
|
|
% \para{Examples}
|
|
|
|
\noindent
|
|
\begin{tabular}{@{}ll@{}}
|
|
\verb|i+1| &(expressão numérica)\\
|
|
\verb|a[i,j] < 1.5| &(expressão relacional)\\
|
|
\verb|s[i+1,j-1] <> 'Mar' & year | &(expressão relacional)\\
|
|
\verb|(i+1,'Jan') not in I cross J| &(expressão relacional)\\
|
|
\verb|S union T within A[i] inter B[j]| &(expressão relacional)\\
|
|
\verb|forall{i in I, j in J} a[i,j] < .5 * b[i]| &(expressão lógica iterada)\\
|
|
\verb|(a[i,j] < 1.5 or b[i] >= a[i,j])| &(expressão lógica parentizada)\\
|
|
\end{tabular}
|
|
|
|
% \noindent
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% \verb|i+1| &(numeric expression)\\
|
|
% \verb|a[i,j] < 1.5| &(relational expression)\\
|
|
% \verb|s[i+1,j-1] <> 'Mar' & year | &(relational expression)\\
|
|
% \verb|(i+1,'Jan') not in I cross J| &(relational expression)\\
|
|
% \verb|S union T within A[i] inter B[j]| &(relational expression)\\
|
|
% \verb|forall{i in I, j in J} a[i,j] < .5 * b[i]| &(iterated logical
|
|
% expression)\\
|
|
% \verb|(a[i,j] < 1.5 or b[i] >= a[i,j])| &(parenthesized logical
|
|
% expression)\\
|
|
% \end{tabular}
|
|
|
|
Expressões lógicas mais genéricas, contendo duas ou mais
|
|
expressões lógicas primárias, podem ser construídas usando
|
|
determinados operadores lógicos.
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S
|
|
(i,j) in S or (i,j) not in T diff U
|
|
\end{verbatim}
|
|
|
|
% More general logical expressions containing two or more primary logical
|
|
% expressions may be constructed by using certain logical operators.
|
|
%
|
|
% \para{Examples}
|
|
%
|
|
% \begin{verbatim}
|
|
% not (a[i,j] < 1.5 or b[i] >= a[i,j]) and (i,j) in S
|
|
% (i,j) in S or (i,j) not in T diff U
|
|
% \end{verbatim}
|
|
\vspace*{-8pt}
|
|
|
|
\subsection{Expressões numéricas}
|
|
|
|
O valor resultante da expressão lógica primária, que é uma
|
|
expressão numérica, é {\it verdadeiro}, se o valor resultante da
|
|
expressão numérica é diferente de zero. Caso contrário o valor resultante
|
|
da expressão lógica é {\it falso}.
|
|
|
|
% The resultant value of the primary logical expression, which is a
|
|
% numeric expression, is {\it true}, if the resultant value of the
|
|
% numeric expression is non-zero. Otherwise the resultant value of the
|
|
% logical expression is {\it false}.
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\subsection{Operadores relacionais}
|
|
|
|
Em MathProg existem os seguintes operadores relacionais, que podem
|
|
ser usados em expressões lógicas:
|
|
|
|
% In MathProg there exist the following relational operators, which may
|
|
% be used in logical expressions:
|
|
|
|
\begin{tabular}{@{}ll@{}}
|
|
$x$ {\tt<} $y$&verifica se $x<y$\\
|
|
$x$ {\tt<=} $y$&verifica se $x\leq y$\\
|
|
$x$ {\tt=} $y$, $x$ {\tt==} $y$&verifica se $x=y$\\
|
|
$x$ {\tt>=} $y$&verifica se $x\geq y$\\
|
|
$x$ {\tt>} $y$&verifica se $x>y$\\
|
|
$x$ {\tt<>} $y$, $x$ {\tt!=} $y$&verifica se $x\neq y$\\
|
|
$x$ {\tt in} $Y$&verifica se $x\in Y$\\
|
|
{\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&verifica se
|
|
$(x_1,\dots,x_n)\in Y$\\
|
|
$x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&verifica se $x\not\in Y$\\
|
|
{\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$,
|
|
{\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&verifica se
|
|
$(x_1,\dots,x_n)\not\in Y$\\
|
|
$X$ {\tt within} $Y$&verifica se $X\subseteq Y$\\
|
|
$X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&verifica se
|
|
$X\not\subseteq Y$\\
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% $x$ {\tt<} $y$&test on $x<y$\\
|
|
% $x$ {\tt<=} $y$&test on $x\leq y$\\
|
|
% $x$ {\tt=} $y$, $x$ {\tt==} $y$&test on $x=y$\\
|
|
% $x$ {\tt>=} $y$&test on $x\geq y$\\
|
|
% $x$ {\tt>} $y$&test on $x>y$\\
|
|
% $x$ {\tt<>} $y$, $x$ {\tt!=} $y$&test on $x\neq y$\\
|
|
% $x$ {\tt in} $Y$&test on $x\in Y$\\
|
|
% {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt in} $Y$&test on
|
|
% $(x_1,\dots,x_n)\in Y$\\
|
|
% $x$ {\tt not} {\tt in} $Y$, $x$ {\tt!in} $Y$&test on $x\not\in Y$\\
|
|
% {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt not} {\tt in} $Y$,
|
|
% {\tt(}$x_1${\tt,}\dots{\tt,}$x_n${\tt)} {\tt !in} $Y$&test on
|
|
% $(x_1,\dots,x_n)\not\in Y$\\
|
|
% $X$ {\tt within} $Y$&test on $X\subseteq Y$\\
|
|
% $X$ {\tt not} {\tt within} $Y$, $X$ {\tt !within} $Y$&test on
|
|
% $X\not\subseteq Y$\\
|
|
% \end{tabular}
|
|
|
|
\noindent onde $x$, $x_1$, \dots, $x_n$, $y$ são expressões numéricas ou
|
|
simbólicas, $X$ e $Y$ são expressões de conjunto.
|
|
|
|
% \noindent where $x$, $x_1$, \dots, $x_n$, $y$ are numeric or symbolic
|
|
% expressions, $X$ and $Y$ are set expression.
|
|
|
|
\newpage
|
|
|
|
1. Nas operações {\tt in}, {\tt not in} e {\tt !in} o número
|
|
de componentes nos primeiros operandos deve ser igual a
|
|
dimensão do segundo operando.
|
|
|
|
2. Nas operações {\tt within}, {\tt not within} e {\tt !within}
|
|
ambos operandos devem ter a mesma dimensão.
|
|
|
|
Todos operadores relacionais listados acima têm seus significados
|
|
matemáticos convencionais. O valor resultante é {\it verdadeiro}, se
|
|
a relação correspondente é satisfeita para seus operandos, caso contrário
|
|
é {\it falso}. (Note que valores simbólicos são ordenados de forma
|
|
lexicográfica e qualquer valor numérico precede qualquer valor simbólico.)
|
|
|
|
% 1. In the operations {\tt in}, {\tt not in}, and {\tt !in} the
|
|
% number of components in the first operands should be the same as the
|
|
% dimension of the second operand.
|
|
%
|
|
% 2. In the operations {\tt within}, {\tt not within}, and {\tt !within}
|
|
% both operands should have identical dimension.
|
|
%
|
|
% All the relational operators listed above have their conventional
|
|
% mathematical meaning. The resultant value is {\it true}, if
|
|
% corresponding relation is satisfied for its operands, otherwise
|
|
% {\it false}. (Note that symbolic values are ordered lexicographically,
|
|
% and any numeric value precedes any symbolic value.)
|
|
|
|
\subsection{Expressões iteradas}
|
|
|
|
Uma {\it expressão lógica iterada} é uma expressão lógica primária
|
|
com a seguinte forma sintática:
|
|
$$\mbox{{\it operador-iterado} {\it expressão-indexante}
|
|
{\it integrando}}$$
|
|
onde {\it operador-iterado} é o nome simbólico do operador iterado
|
|
a ser executado (veja adiante), {\it expressão-indexante} é uma
|
|
expressão indexante que introduz índices e controla a iteração, \linebreak
|
|
{\it integrando} é uma expressão numérica que participa da operação.
|
|
|
|
Em MathProg existem dois operadores iterados que podem ser usados
|
|
em expressões lógicas:
|
|
|
|
% An {\it iterated logical expression} is a primary logical expression,
|
|
% which has the following syntactic form:
|
|
% $$\mbox{{\it iterated-operator} {\it indexing-expression}
|
|
% {\it integrand}}$$
|
|
% where {\it iterated-operator} is the symbolic name of the iterated
|
|
% operator to be performed (see below), {\it indexing-expression} is an
|
|
% indexing expression which introduces dummy indices and controls
|
|
% iterating, {\it integrand} is a numeric expression that participates in
|
|
% the operation.
|
|
%
|
|
% In MathProg there exist two iterated operators, which may be used in
|
|
% logical expressions:
|
|
|
|
{\def\arraystretch{1.4}
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}lll@{}}
|
|
{\tt forall}&quantificador-$\forall$&$\displaystyle
|
|
\forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
|
|
{\tt exists}&quantificador-$\exists$&$\displaystyle
|
|
\exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
|
|
\end{tabular}
|
|
}
|
|
|
|
% {\def\arraystretch{1.4}
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}lll@{}}
|
|
% {\tt forall}&$\forall$-quantification&$\displaystyle
|
|
% \forall(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
|
|
% {\tt exists}&$\exists$-quantification&$\displaystyle
|
|
% \exists(i_1,\dots,i_n)\in\Delta[f(i_1,\dots,i_n)],$\\
|
|
% \end{tabular}
|
|
% }
|
|
|
|
\noindent onde $i_1$, \dots, $i_n$ são índices introduzidos na
|
|
expressão indexante, $\Delta$ é o domínio, um conjunto de $n$-tuplas
|
|
especificado pela expressão indexante que define valores específicos
|
|
atribuídos aos índices ao executar a operação iterada, e
|
|
$f(i_1,\dots,i_n)$ é o integrando, uma expressão lógica cujo
|
|
valor resultante depende dos índices.
|
|
|
|
Para o quantificador $\forall$, o valor resultante da expressão
|
|
lógica iterada é {\it verdadeiro}, se o valor do integrando é
|
|
{\it verdadeiro} para todas as $n$-tuplas contidas no domínio,
|
|
caso contrário, é {\it falso}.
|
|
|
|
Para o quantificador $\exists$ o valor resultante da expressão
|
|
lógica iterada é {\it falso}, se o valor do integrando é
|
|
{\it falso} para todas as $n$-tuplas contidas no domínio,
|
|
caso contrário, é {\it verdadeiro}.
|
|
|
|
% \noindent where $i_1$, \dots, $i_n$ are dummy indices introduced in
|
|
% the indexing expression, $\Delta$ is the domain, a set of $n$-tuples
|
|
% specified by the indexing expression which defines particular values
|
|
% assigned to the dummy indices on performing the iterated operation,
|
|
% $f(i_1,\dots,i_n)$ is the integrand, a logical expression whose
|
|
% resultant value depends on the dummy indices.
|
|
%
|
|
% For $\forall$-quantification the resultant value of the iterated
|
|
% logical expression is {\it true}, if the value of the integrand is
|
|
% {\it true} for all $n$-tuples contained in the domain, otherwise
|
|
% {\it false}.
|
|
%
|
|
% For $\exists$-quantification the resultant value of the iterated
|
|
% logical expression is {\it false}, if the value of the integrand is
|
|
% {\it false} for all $n$-tuples contained in the domain, otherwise
|
|
% {\it true}.
|
|
|
|
\subsection{Expressões parentizadas}
|
|
|
|
Qualquer expressão lógica pode ser cercada entre parênteses, o que a
|
|
converte sintaticamente em uma expressão lógica primária.
|
|
|
|
Parênteses podem ser usados em expressões lógicas, como em álgebra, para
|
|
especificar a ordem desejada na qual as operações devem ser executadas.
|
|
Quando se usam parênteses, a expressão entre parênteses é avaliada antes
|
|
que o valor resultante seja usado.
|
|
|
|
O valor resultante da expressão parentizada é idêntico ao valor da expressão
|
|
cercada entre parênteses.
|
|
|
|
% Any logical expression may be enclosed in parentheses that
|
|
% syntactically makes it a primary logical expression.
|
|
%
|
|
% Parentheses may be used in logical expressions, as in algebra, to
|
|
% specify the desired order in which operations are to be performed.
|
|
% Where parentheses are used, the expression within the parentheses is
|
|
% evaluated before the resultant value is used.
|
|
%
|
|
% The resultant value of the parenthesized expression is the same as the
|
|
% value of the expression enclosed within parentheses.
|
|
|
|
\newpage
|
|
|
|
\subsection{Operadores lógicos}
|
|
|
|
Em MathProg existem os seguintes operadores lógicos, que podem ser usados em
|
|
expressões lógicas:
|
|
|
|
% In MathProg there exist the following logical operators, which may be
|
|
% used in logical expressions:
|
|
|
|
\begin{tabular}{@{}ll@{}}
|
|
{\tt not} $x$, {\tt!}$x$&negação $\neg\ x$\\
|
|
$x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunção (``e'' lógico)
|
|
$x\;\&\;y$\\
|
|
$x$ {\tt or} $y$, $x$ {\tt||} $y$&disjunção (``ou'' lógico)
|
|
$x\vee y$\\
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% {\tt not} $x$, {\tt!}$x$&negation $\neg\ x$\\
|
|
% $x$ {\tt and} $y$, $x$ {\tt\&\&} $y$&conjunction (logical ``and'')
|
|
% $x\;\&\;y$\\
|
|
% $x$ {\tt or} $y$, $x$ {\tt||} $y$&disjunction (logical ``or'')
|
|
% $x\vee y$\\
|
|
% \end{tabular}
|
|
|
|
\noindent onde $x$ e $y$ são expressões lógicas.
|
|
|
|
Se a expressão inclui mais de um operador lógico, todos operadores
|
|
são executados da esquerda para a direita de acordo com a hierarquia
|
|
das operações (veja adiante). O valor resultante da \linebreak expressão
|
|
que contém operadores lógicos é o resultado da aplicação dos
|
|
operadores aos seus \linebreak operandos.
|
|
|
|
% \noindent where $x$ and $y$ are logical expressions.
|
|
%
|
|
% If the expression includes more than one logical operator, all
|
|
% operators are performed from left to right according to the hierarchy
|
|
% of the operations (see below). The resultant value of the expression,
|
|
% which contains logical operators, is the result of applying the
|
|
% operators to their operands.
|
|
|
|
\subsection{Hierarquia das operações}
|
|
|
|
A lista seguinte mostra a hierarquia das operações em expressões
|
|
lógicas:
|
|
|
|
% The following list shows the hierarchy of operations in logical
|
|
% expressions:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}ll@{}}
|
|
Operation&Hierarchy\\
|
|
\hline
|
|
Avaliação de operações numéricas&
|
|
1{\textsuperscript{\b{a}}}-7{\textsuperscript{\b{a}}}\\
|
|
Avaliação de operações simbólicas&
|
|
8{\textsuperscript{\b{a}}}-9{\textsuperscript{\b{a}}}\\
|
|
Avaliação de operações de conjunto&
|
|
10{\textsuperscript{\b{a}}}-14{\textsuperscript{\b{a}}}\\
|
|
Operações relacionais ({\tt<}, {\tt<=}, etc.)&
|
|
15{\textsuperscript{\b{a}}}\\
|
|
negação ({\tt not}, {\tt!})&
|
|
16{\textsuperscript{\b{a}}}\\
|
|
Conjunção({\tt and}, {\tt\&\&})&
|
|
17{\textsuperscript{\b{a}}}\\
|
|
Quantificação-$\forall$ e -$\exists$ ({\tt forall}, {\tt exists})&
|
|
18{\textsuperscript{\b{a}}}\\
|
|
Disjunção ({\tt or}, {\tt||})&
|
|
19{\textsuperscript{\b{a}}}\\
|
|
\end{tabular}
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% Operation&Hierarchy\\
|
|
% \hline
|
|
% Evaluation of numeric operations&1st-7th\\
|
|
% Evaluation of symbolic operations&8th-9th\\
|
|
% Evaluation of set operations&10th-14th\\
|
|
% Relational operations ({\tt<}, {\tt<=}, etc.)&15th\\
|
|
% Negation ({\tt not}, {\tt!})&16th\\
|
|
% Conjunction ({\tt and}, {\tt\&\&})&17th\\
|
|
% $\forall$- and $\exists$-quantification ({\tt forall}, {\tt exists})&
|
|
% 18th\\
|
|
% Disjunction ({\tt or}, {\tt||})&19th\\
|
|
% \end{tabular}
|
|
|
|
Esta hierarquia possui o mesmo significado como explicado anteriormente
|
|
para expressões \linebreak numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}).
|
|
|
|
% This hierarchy has the same meaning as was explained above for numeric
|
|
% expressions (see Subsection \ref{hierarchy}, page \pageref{hierarchy}).
|
|
|
|
\newpage
|
|
|
|
\section{Expressões lineares}
|
|
|
|
Uma {\it expressão linear} é uma regra para calcular a chamada
|
|
{\it forma linear} ou simplesmente {\it fórmula}, que é uma função linear (ou
|
|
afim) de variáveis elementares.
|
|
|
|
A expressão linear primária pode ser uma variável não-indexada, uma
|
|
variável indexada, uma expressão linear iterada, uma expressão linear condicional
|
|
ou outra expressão linear cercada entre parênteses.
|
|
|
|
Também e permitido usar uma expressão numérica como a expressão linear
|
|
primária, neste caso, o valor resultante da expressão numérica
|
|
é automaticamente convertido para uma fórmula que inclui o
|
|
termo constante apenas.
|
|
|
|
\para{Exemplos}
|
|
|
|
% A {\it linear expression} is a rule for computing so called
|
|
% a {\it linear form} or simply a {\it formula}, which is a linear (or
|
|
% affine) function of elemental variables.
|
|
%
|
|
% The primary linear expression may be an unsubscripted variable,
|
|
% subscripted variable, iterated linear expression, conditional linear
|
|
% expression, or another linear expression enclosed in parentheses.
|
|
%
|
|
% It is also allowed to use a numeric expression as the primary linear
|
|
% expression, in which case the resultant value of the numeric expression
|
|
% is automatically converted to a formula that includes the constant term
|
|
% only.
|
|
%
|
|
% \para{Examples}
|
|
|
|
\noindent
|
|
\begin{tabular}{@{}ll@{}}
|
|
\verb|z| &(variável não-indexada)\\
|
|
\verb|x[i,j]| &(variável indexada)\\
|
|
\verb|sum{j in J} (a[i,j] * x[i,j] + 3 * y[i-1])| &
|
|
(expressão linear iterada)\\
|
|
\verb|if i in I then x[i,j] else 1.5 * z + 3.25| &
|
|
(expressão linear condicional)\\
|
|
\verb|(a[i,j] * x[i,j] + y[i-1] + .1)| &
|
|
(expressão linear parentizada)\\
|
|
\end{tabular}
|
|
|
|
% \noindent
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% \verb|z| &(unsubscripted variable)\\
|
|
% \verb|x[i,j]| &(subscripted variable)\\
|
|
% \verb|sum{j in J} (a[i,j] * x[i,j] + 3 * y[i-1])| &
|
|
% (iterated linear expression)\\
|
|
% \verb|if i in I then x[i,j] else 1.5 * z + 3.25| &
|
|
% (conditional linear expression)\\
|
|
% \verb|(a[i,j] * x[i,j] + y[i-1] + .1)| &
|
|
% (parenthesized linear expression)\\
|
|
% \end{tabular}
|
|
|
|
Expressões lineares mais genéricas, contendo duas ou mais
|
|
expressões lineares primárias, podem ser construídas usando
|
|
determinados operadores aritméticos.
|
|
|
|
\para{Exemplos}
|
|
|
|
% More general linear expressions containing two or more primary linear
|
|
% expressions may be constructed by using certain arithmetic operators.
|
|
%
|
|
% \para{Examples}
|
|
|
|
\begin{verbatim}
|
|
2 * x[i-1,j+1] + 3.5 * y[k] + .5 * z
|
|
(- x[i,j] + 3.5 * y[k]) / sum{t in T} abs(d[i,j,t])
|
|
\end{verbatim}
|
|
|
|
\vspace*{-5pt}
|
|
|
|
\subsection{Variáveis não-indexadas}
|
|
|
|
Se a expressão linear primária é uma variável não-indexada (que deve
|
|
se 0-dimensional), a fórmula resultante formula é aquela variável
|
|
não-indexada.
|
|
|
|
% If the primary linear expression is an unsubscripted variable (which
|
|
% should be 0-dimensional), the resultant formula is that unsubscripted
|
|
% variable.
|
|
|
|
\vspace*{-5pt}
|
|
|
|
\subsection{Variáveis indexadas}
|
|
|
|
A expressão linear primária que se refere a uma variável indexada possui
|
|
a seguinte forma sintática:
|
|
$$\mbox{{\it nome}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}
|
|
$i_n${\tt]}}$$
|
|
onde {\it nome} é o nome simbólico da variável do modelo, $i_1$,
|
|
$i_2$, \dots, $i_n$ são subíndices.
|
|
|
|
Cada subíndice deve ser uma expressão numérica ou simbólica. O número
|
|
de subíndices na lista de subíndices deve ser igual ao da dimensão da
|
|
variável do modelo com a qual está associada a lista de subíndices.
|
|
|
|
Os valores correntes das expressões dos subíndices são usados para identificar
|
|
um membro \linebreak particular da variável do modelo que determina a fórmula resultante,
|
|
que é uma variável elementar associada com o membro correspondente.
|
|
|
|
% The primary linear expression, which refers to a subscripted variable,
|
|
% has the following syntactic form:
|
|
% $$\mbox{{\it name}{\tt[}$i_1${\tt,} $i_2${\tt,} \dots{\tt,}
|
|
% $i_n${\tt]}}$$
|
|
% where {\it name} is the symbolic name of the model variable, $i_1$,
|
|
% $i_2$, \dots, $i_n$ are subscripts.
|
|
%
|
|
% Each subscript should be a numeric or symbolic expression. The number
|
|
% of subscripts in the subscript list should be the same as the dimension
|
|
% of the model variable with which the subscript list is associated.
|
|
%
|
|
% Actual values of the subscript expressions are used to identify a
|
|
% particular member of the model variable that determines the resultant
|
|
% formula, which is an elemental variable associated with corresponding
|
|
% member.
|
|
|
|
\vspace*{-5pt}
|
|
|
|
\subsection{Expressões iteradas}
|
|
|
|
Uma {\it expressão linear iterada} é uma expressão linear primária,
|
|
que tem a seguinte forma sintática:
|
|
$$\mbox{{\tt sum} {\it expressão-indexante} {\it integrando}}$$
|
|
onde {\it expressão-indexante} é uma expressão indexante, que
|
|
introduz índices e controla iterações, {\it integrando} é
|
|
uma expressão linear que participa da operação.
|
|
|
|
A expressão linear iterada é avaliada exatamente da mesma forma que a
|
|
expressão numérica iterada (ver Subseção \ref{itexpr}, página
|
|
\pageref{itexpr}), exceto que o integrando participante do
|
|
somatório é uma fórmula e não um valor numérico.
|
|
|
|
% An {\it iterated linear expression} is a primary linear expression,
|
|
% which has the following syntactic form:
|
|
% $$\mbox{{\tt sum} {\it indexing-expression} {\it integrand}}$$
|
|
% where {\it indexing-expression} is an indexing expression, which
|
|
% introduces dummy indices and controls iterating, {\it integrand} is
|
|
% a linear expression that participates in the operation.
|
|
%
|
|
% The iterated linear expression is evaluated exactly in the same way as
|
|
% the iterated numeric expression (see Subection \ref{itexpr}, page
|
|
% \pageref{itexpr}) with exception that the integrand participated in the
|
|
% summation is a formula, not a numeric value.
|
|
|
|
\vspace*{-5pt}
|
|
|
|
\subsection{Expressões condicionais}
|
|
|
|
Uma {\it expressão linear condicional} é uma expressão linear primária,
|
|
que possui uma das duas formas sintáticas seguintes:
|
|
$$
|
|
{\def\arraystretch{1.4}
|
|
\begin{array}{l}
|
|
\mbox{{\tt if} $b$ {\tt then} $f$ {\tt else} $g$}\\
|
|
\mbox{{\tt if} $b$ {\tt then} $f$}\\
|
|
\end{array}
|
|
}
|
|
$$
|
|
onde $b$ é uma expressão lógica, $f$ e $g$ são expressões lineares.
|
|
|
|
|
|
% A {\it conditional linear expression} is a primary linear expression,
|
|
% which has one of the following two syntactic forms:
|
|
% $$
|
|
% {\def\arraystretch{1.4}
|
|
% \begin{array}{l}
|
|
% \mbox{{\tt if} $b$ {\tt then} $f$ {\tt else} $g$}\\
|
|
% \mbox{{\tt if} $b$ {\tt then} $f$}\\
|
|
% \end{array}
|
|
% }
|
|
% $$
|
|
% where $b$ is an logical expression, $f$ and $g$ are linear expressions.
|
|
|
|
% \newpage
|
|
|
|
A expressão linear condicional é avaliada exatamente da mesma forma
|
|
que a expressão \linebreak condicional numérica (ver Subseção \ref{ifthen},
|
|
página \pageref{ifthen}), exceto que os operandos que participam da operação
|
|
são fórmulas e não valores numéricos.
|
|
|
|
% The conditional linear expression is evaluated exactly in the same way
|
|
% as the conditional numeric expression (see Subsection \ref{ifthen},
|
|
% page \pageref{ifthen}) with exception that operands participated in the
|
|
% operation are formulae, not numeric values.
|
|
|
|
\subsection{Expressões parentizadas}
|
|
|
|
Qualquer expressão linear pode ser cercada entre parênteses, o que a
|
|
converte sintaticamente em uma expressão linear primária.
|
|
|
|
Parênteses podem ser usados em expressões lineares, como em álgebra, para
|
|
especificar a ordem desejada na qual as operações devem ser executadas.
|
|
Quando se usam parênteses, a expressão entre parênteses é avaliada antes
|
|
que a fórmula resultante seja usada.
|
|
|
|
O valor resultante da expressão parentizada é idêntico ao valor da
|
|
expressão cercada entre parênteses.
|
|
|
|
% Any linear expression may be enclosed in parentheses that syntactically
|
|
% makes it a primary linear expression.
|
|
%
|
|
% Parentheses may be used in linear expressions, as in algebra, to
|
|
% specify the desired order in which operations are to be performed.
|
|
% Where parentheses are used, the expression within the parentheses is
|
|
% evaluated before the resultant formula is used.
|
|
%
|
|
% The resultant value of the parenthesized expression is the same as the
|
|
% value of the expression enclosed within parentheses.
|
|
|
|
\subsection{Operadores aritméticos}
|
|
|
|
Em MathProg existem os seguintes operadores aritméticos, que podem ser
|
|
usados em expressões lineares:
|
|
|
|
% In MathProg there exists the following arithmetic operators, which may
|
|
% be used in linear expressions:
|
|
|
|
\begin{tabular}{@{}ll@{}}
|
|
{\tt+} $f$&mais unário\\
|
|
{\tt-} $f$&menos unário\\
|
|
$f$ {\tt+} $g$&adição\\
|
|
$f$ {\tt-} $g$&subtração\\
|
|
$x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplicação\\
|
|
$f$ {\tt/} $x$&divisão
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% {\tt+} $f$&unary plus\\
|
|
% {\tt-} $f$&unary minus\\
|
|
% $f$ {\tt+} $g$&addition\\
|
|
% $f$ {\tt-} $g$&subtraction\\
|
|
% $x$ {\tt*} $f$, $f$ {\tt*} $x$&multiplication\\
|
|
% $f$ {\tt/} $x$&division
|
|
% \end{tabular}
|
|
|
|
\noindent onde $f$ e $g$ são expressões lineares, $x$ é uma expressão
|
|
numérica (mais precisamente, uma expressão linear contendo apenas o termo
|
|
constante).
|
|
|
|
Se a expressão inclui mais de um operador aritmético, todos
|
|
operadores são executados da esquerda para a direita de acordo com a hierarquia
|
|
das operações (veja adiante). O valor resultante da expressão, que
|
|
contém operadores aritméticos, é o resultado de aplicar os operadores aos
|
|
seus operandos.
|
|
|
|
% \noindent where $f$ and $g$ are linear expressions, $x$ is a numeric
|
|
% expression (more precisely, a linear expression containing only the
|
|
% constant term).
|
|
%
|
|
% If the expression includes more than one arithmetic operator, all
|
|
% operators are performed from left to right according to the hierarchy
|
|
% of operations (see below). The resultant value of the expression, which
|
|
% contains arithmetic operators, is the result of applying the operators
|
|
% to their operands.
|
|
|
|
\subsection{Hierarquia das operações}
|
|
|
|
A hierarquia de operações aritméticas usada em expressões lineares é a mesma
|
|
para expressões numéricas (ver Subseção \ref{hierarchy}, página \pageref{hierarchy}).
|
|
|
|
% The hierarchy of arithmetic operations used in linear expressions is
|
|
% the same as for numeric expressions (see Subsection \ref{hierarchy},
|
|
% page \pageref{hierarchy}).
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\chapter{Sentenças}
|
|
|
|
{\it Sentenças} são unidades básicas da descrição do modelo. Em MathProg
|
|
todas as sentenças são divididas em duas categorias: sentenças de declaração
|
|
e sentenças funcionais.
|
|
|
|
{\it Sentenças de declaração} (sentença {\it set}, sentença {\it parameter},
|
|
sentença {\it variable}, sentença \linebreak {\it constraint}, sentença {\it objective}) são
|
|
usados para declarar objetos de certo tipo do modelo e definir certas propriedades
|
|
de tais objetos.
|
|
|
|
{\it Sentenças funcionais} (sentença {\it solve}, sentença {\it check},
|
|
sentença {\it display}, sentença {\it printf}, sentença {\it loop}, sentença
|
|
{\it table}) são projetadas para executar ações específicas.
|
|
|
|
Note que sentenças de declaração podem seguir em qualquer ordem arbitrária,
|
|
o que não afeta o resultado da tradução. Entretanto, qualquer objeto de modelo
|
|
deve ser declarado antes de ser referenciado por outras sentenças.
|
|
|
|
% {\it Statements} are basic units of the model description. In MathProg
|
|
% all statements are divided into two categories: declaration statements
|
|
% and functional statements.
|
|
%
|
|
% {\it Declaration statements} (set statement, parameter statement,
|
|
% variable statement, constraint statement, objective statement) are used
|
|
% to declare model objects of certain kinds and define certain properties
|
|
% of such objects.
|
|
%
|
|
% {\it Functional statements} (solve statement, check statement, display
|
|
% statement, printf statement, loop statement, table statement) are
|
|
% intended for performing some specific actions.
|
|
%
|
|
% Note that declaration statements may follow in arbitrary order, which
|
|
% does not affect the result of translation. However, any model object
|
|
% should be declared before it is referenced in other statements.
|
|
|
|
\section{Sentença set}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][24pt]{468pt}{
|
|
\hspace{6pt} {\tt set} {\it nome} {\it alias} {\it domínio} {\tt,}
|
|
{\it atributo} {\tt,} \dots {\tt,} {\it atributo} {\tt;}
|
|
}}
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][24pt]{468pt}{
|
|
% \hspace{6pt} {\tt set} {\it name} {\it alias} {\it domain} {\tt,}
|
|
% {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
|
|
% }}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it nome} é um nome simbólico do conjunto;
|
|
|
|
\noindent
|
|
{\it alias} é um literal de cadeia opcional que especifica um pseudônimo
|
|
para o conjunto;
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante opcional que especifica o domínio
|
|
do subíndice do conjunto;
|
|
|
|
\noindent
|
|
{\it atributo}, \dots, {\it atributo} são atributos opcionais do conjunto
|
|
(as vírgulas que precedem os atributos podem ser omitidas.)
|
|
|
|
\para{Atributos opcionais}
|
|
|
|
% \noindent
|
|
% {\it name} is a symbolic name of the set;
|
|
%
|
|
% \noindent
|
|
% {\it alias} is an optional string literal, which specifies an alias of
|
|
% the set;
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an optional indexing expression, which specifies
|
|
% a subscript domain of the set;
|
|
%
|
|
% \noindent
|
|
% {\it attrib}, \dots, {\it attrib} are optional attributes of the set.
|
|
% (Commae preceding attributes may be omitted.)
|
|
%
|
|
% \para{Optional attributes}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\begin{description}
|
|
\item[{\tt dimen} $n$]\hspace*{0pt}\\
|
|
especifica a dimensão de $n$-tuplas das quais o conjunto é consistido;
|
|
\item[{\tt within} {\it expressão}]\hspace*{0pt}\\
|
|
especifica um superconjunto que restringe ao conjunto ou a todos seus
|
|
membros (conjuntos elementares) a estarem incluídos naquele superconjunto;
|
|
\item[{\tt:=} {\it expressão}]\hspace*{0pt}\\
|
|
especifica um conjunto elementar atribuído ao conjunto ou aos seus membros;
|
|
\item[{\tt default} {\it expressão}]\hspace*{0pt}\\
|
|
especifica um conjunto elementar atribuído ao conjunto ou aos seus membros
|
|
sempre que não há dados apropriados disponíveis na seção de dados.
|
|
\end{description}
|
|
|
|
% \begin{description}
|
|
% \item[{\tt dimen} $n$]\hspace*{0pt}\\
|
|
% specifies the dimension of $n$-tuples which the set consists of;
|
|
% \item[{\tt within} {\it expression}]\hspace*{0pt}\\
|
|
% specifies a superset which restricts the set or all its members
|
|
% (elemental sets) to be within that superset;
|
|
% \item[{\tt:=} {\it expression}]\hspace*{0pt}\\
|
|
% specifies an elemental set assigned to the set or its members;
|
|
% \item[{\tt default} {\it expression}]\hspace*{0pt}\\
|
|
% specifies an elemental set assigned to the set or its members whenever
|
|
% no appropriate data are available in the data section.
|
|
% \end{description}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\para{Exemplos}
|
|
|
|
% \para{Examples}
|
|
|
|
\begin{verbatim}
|
|
set nos;
|
|
set arcos within nos cross nos;
|
|
set passo{s in 1..maxiter} dimen 2 := if s = 1 then arcos else passo[s-1]
|
|
union setof{k in nos, (i,k) in passo[s-1], (k,j) in passo[s-1]}(i,j);
|
|
set A{i in I, j in J}, within B[i+1] cross C[j-1], within D diff E,
|
|
default {('abc',123), (321,'cba')};
|
|
\end{verbatim}
|
|
|
|
% \begin{verbatim}
|
|
% set nodes;
|
|
% set arcs within nodes cross nodes;
|
|
% set step{s in 1..maxiter} dimen 2 := if s = 1 then arcs else step[s-1]
|
|
% union setof{k in nodes, (i,k) in step[s-1], (k,j) in step[s-1]}(i,j);
|
|
% set A{i in I, j in J}, within B[i+1] cross C[j-1], within D diff E,
|
|
% default {('abc',123), (321,'cba')};
|
|
% \end{verbatim}
|
|
|
|
A sentença set declara um conjunto. Se o domínio do subíndice não é
|
|
especificado, o conjunto é um conjunto simples, caso contrário será
|
|
uma matriz de conjuntos elementares.
|
|
|
|
O atributo {\tt dimen} especifica a dimensão de $n$-tuplas da qual é
|
|
consistida o conjunto (se o conjunto é simples) ou seus membros
|
|
(se o conjunto é uma matriz de conjuntos elementares),
|
|
em que $n$ deve ser um inteiro de 1 a 20. Pode-se especificar
|
|
no máximo um atributo {\tt dimen}. Se o atributo {\tt dimen} não é
|
|
especificado, a dimensão das $n$-tuplas é implicitamente determinada
|
|
por outros atributos (por exemplo, se há uma expressão que segue
|
|
{\tt:=} ou a palavra-chave {\tt default}, usa-se a dimensão das $n$-tuplas
|
|
do conjunto elementar correspondente).
|
|
Se nenhuma informação de dimensão é fornecida, assume-se
|
|
{\tt dimen 1}.
|
|
|
|
O atributo {\tt within} especifica uma expressão de conjunto cujo
|
|
valor resultante é um superconjunto usado para restringir o conjunto
|
|
(se o conjunto é simples) ou seus membros (se o conjunto é uma matriz
|
|
de conjuntos elementares) a estar incluído naquele superconjunto.
|
|
Um número arbitrário de atributos {\tt within} podem ser especificados
|
|
na mesma sentença set.
|
|
|
|
O atributo de atribuição ({\tt:=}) especifica uma expressão de conjunto
|
|
usada para avaliar conjunto(s) \linebreak elementar(es) atribuído(s) ao conjunto
|
|
(se o conjunto é simples) ou seus membros (se o conjunto é uma matriz
|
|
de conjuntos elementares). Se o atributo de atribuição é especificado,
|
|
o conjunto é {\it calculável}, portanto, não há a necessidade de fornecer
|
|
dados na seção de dados. Se o atributo de atribuição não é especificado,
|
|
deve-se fornecer os dados na seção de dados. Pode-se especificar no
|
|
máximo um atributo de atribuição ou {\tt default} para o mesmo conjunto.
|
|
|
|
O atributo {\tt default} especifica uma expressão de conjunto usado para
|
|
avaliar conjunto(s) \linebreak elementar(es) atribuído(s) ao conjunto
|
|
(se o conjunto é simples) ou seus membros (se o conjunto é uma matriz
|
|
de conjuntos elementares) sempre que não houver dados apropriados
|
|
disponíveis na seção de dados. Se não se especifica nem o atributo de
|
|
atribuição nem o atributo {\tt default}, a falta de dados causará um erro.
|
|
|
|
% The set statement declares a set. If the subscript domain is not
|
|
% specified, the set is a simple set, otherwise it is an array of
|
|
% elemental sets.
|
|
%
|
|
% The {\tt dimen} attribute specifies the dimension of $n$-tuples, which
|
|
% the set (if it is a simple set) or its members (if the set is an array
|
|
% of elemental sets) consist of, where $n$ should be an unsigned integer
|
|
% from 1 to 20. At most one {\tt dimen} attribute can be specified. If
|
|
% the {\tt dimen} attribute is not specified, the dimension of $n$-tuples
|
|
% is implicitly determined by other attributes (for example, if there is
|
|
% a set expression that follows {\tt:=} or the keyword {\tt default}, the
|
|
% dimension of $n$-tuples of corresponding elemental set is used).
|
|
% If no dimension information is available, {\tt dimen 1} is assumed.
|
|
%
|
|
% The {\tt within} attribute specifies a set expression whose resultant
|
|
% value is a superset used to restrict the set (if it is a simple set) or
|
|
% its members (if the set is an array of elemental sets) to be within
|
|
% that superset. Arbitrary number of {\tt within} attributes may be
|
|
% specified in the same set statement.
|
|
%
|
|
% The assign ({\tt:=}) attribute specifies a set expression used to
|
|
% evaluate elemental set(s) assigned to the set (if it is a simple set)
|
|
% or its members (if the set is an array of elemental sets). If the
|
|
% assign attribute is specified, the set is {\it computable} and
|
|
% therefore needs no data to be provided in the data section. If the
|
|
% assign attribute is not specified, the set should be provided with data
|
|
% in the data section. At most one assign or default attribute can be
|
|
% specified for the same set.
|
|
%
|
|
% The {\tt default} attribute specifies a set expression used to evaluate
|
|
% elemental set(s) assigned to the set (if it is a simple set) or its
|
|
% members (if the set is an array of elemental sets) whenever
|
|
% no appropriate data are available in the data section. If neither
|
|
% assign nor default attribute is specified, missing data will cause an
|
|
% error.
|
|
|
|
\newpage
|
|
|
|
\section{Sentença parameter}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][24pt]{468pt}{
|
|
\hspace{6pt} {\tt param} {\it nome} {\it alias} {\it domínio} {\tt,}
|
|
{\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
|
|
}}
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][24pt]{468pt}{
|
|
% \hspace{6pt} {\tt param} {\it name} {\it alias} {\it domain} {\tt,}
|
|
% {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
|
|
% }}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it nome} é um nome simbólico do parâmetro;
|
|
|
|
\noindent
|
|
{\it alias} é um literal de cadeia opcional que especifica um pseudônimo
|
|
para o parâmetro;
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante opcional que especifica o domínio
|
|
do subíndice do parâmetro;
|
|
|
|
\noindent
|
|
{\it atributo}, \dots, {\it atributo} são atributos opcionais do parâmetro
|
|
(as vírgulas que precedem os atributos podem ser omitidas.)
|
|
|
|
\para{Atributos opcionais}
|
|
|
|
% \noindent
|
|
% {\it name} is a symbolic name of the parameter;
|
|
%
|
|
% \noindent
|
|
% {\it alias} is an optional string literal, which specifies an alias of
|
|
% the parameter;
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an optional indexing expression, which specifies
|
|
% a subscript domain of the parameter;
|
|
%
|
|
% \noindent
|
|
% {\it attrib}, \dots, {\it attrib} are optional attributes of the
|
|
% parameter. (Commae preceding attributes may be omitted.)
|
|
%
|
|
% \para{Optional attributes}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\begin{description}
|
|
\item[{\tt integer}]\hspace*{0pt}\\
|
|
especifica que o parâmetro é inteiro;
|
|
\item[{\tt binary}]\hspace*{0pt}\\
|
|
especifica que o parâmetro é binário;
|
|
\item[{\tt symbolic}]\hspace*{0pt}\\
|
|
especifica que o parâmetro é simbólico;
|
|
\item[{\it expressão de relação}]\hspace*{0pt}\\
|
|
(onde {\it relação} é algum de: {\tt<}, {\tt<=}, {\tt=}, {\tt==},
|
|
{\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\
|
|
especifica uma condição que restringe o parâmetro ou seus membros a
|
|
satisfazer aquela condição;
|
|
\item[{\tt in} {\it expressão}]\hspace*{0pt}\\
|
|
especifica um superconjunto que restringe o parâmetro ou seus membros
|
|
a estarem inseridos naquele superconjunto;
|
|
\item[{\tt:=} {\it expressão}]\hspace*{0pt}\\
|
|
especifica um valor atribuído ao parâmetro ou a seus membros;
|
|
\item[{\tt default} {\it expressão}]\hspace*{0pt}\\
|
|
especifica um valor atribuído ao parâmetro ou aos seus membros sempre
|
|
que não houverem dados disponíveis na seção de dados.
|
|
\end{description}
|
|
|
|
% \begin{description}
|
|
% \item[{\tt integer}]\hspace*{0pt}\\
|
|
% specifies that the parameter is integer;
|
|
% \item[{\tt binary}]\hspace*{0pt}\\
|
|
% specifies that the parameter is binary;
|
|
% \item[{\tt symbolic}]\hspace*{0pt}\\
|
|
% specifies that the parameter is symbolic;
|
|
% \item[{\it relation expression}]\hspace*{0pt}\\
|
|
% (where {\it relation} is one of: {\tt<}, {\tt<=}, {\tt=}, {\tt==},
|
|
% {\tt>=}, {\tt>}, {\tt<>}, {\tt!=})\\
|
|
% specifies a condition that restricts the parameter or its members to
|
|
% satisfy that condition;
|
|
% \item[{\tt in} {\it expression}]\hspace*{0pt}\\
|
|
% specifies a superset that restricts the parameter or its members to be
|
|
% in that superset;
|
|
% \item[{\tt:=} {\it expression}]\hspace*{0pt}\\
|
|
% specifies a value assigned to the parameter or its members;
|
|
% \item[{\tt default} {\it expression}]\hspace*{0pt}\\
|
|
% specifies a value assigned to the parameter or its members whenever
|
|
% no appropriate data are available in the data section.
|
|
% \end{description}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\para{Exemplos}
|
|
|
|
% \para{Examples}
|
|
|
|
\begin{verbatim}
|
|
param unidades{insumo, produto} >= 0;
|
|
param lucro{produto, 1..T+1};
|
|
param N := 20 integer >= 0 <= 100;
|
|
param combinacao 'n escolhe k' {n in 0..N, k in 0..n} :=
|
|
if k = 0 or k = n then 1 else combinacao[n-1,k-1] + combinacao[n-1,k];
|
|
param p{i in I, j in J}, integer, >= 0, <= i+j, in A[i] symdiff B[j],
|
|
in C[i,j], default 0.5 * (i + j);
|
|
param mes symbolic default 'Mai' in {'Mar', 'Abr', 'Mai'};
|
|
\end{verbatim}
|
|
|
|
% \begin{verbatim}
|
|
% param units{raw, prd} >= 0;
|
|
% param profit{prd, 1..T+1};
|
|
% param N := 20 integer >= 0 <= 100;
|
|
% param comb 'n choose k' {n in 0..N, k in 0..n} :=
|
|
% if k = 0 or k = n then 1 else comb[n-1,k-1] + comb[n-1,k];
|
|
% param p{i in I, j in J}, integer, >= 0, <= i+j, in A[i] symdiff B[j],
|
|
% in C[i,j], default 0.5 * (i + j);
|
|
% param month symbolic default 'May' in {'Mar', 'Apr', 'May'};
|
|
% \end{verbatim}
|
|
|
|
A sentença parameter declara um parâmetro. Se o domínio de subíndice não
|
|
é especificado, o parâmetro é simples (escalar), caso contrário,
|
|
é uma matriz $n$-dimensional.
|
|
|
|
Os atributos de tipo {\tt integer}, {\tt binary} e {\tt symbolic}
|
|
qualificam os tipos de valores que podem ser atribuídos ao parâmetro, conforme
|
|
demonstrado:
|
|
|
|
% The parameter statement declares a parameter. If a subscript domain is
|
|
% not specified, the parameter is a simple (scalar) parameter, otherwise
|
|
% it is a $n$-dimensional array.
|
|
%
|
|
% The type attributes {\tt integer}, {\tt binary}, and {\tt symbolic}
|
|
% qualify the type of values that can be assigned to the parameter as
|
|
% shown below:
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}ll@{}}
|
|
Tipo de atributo&Valores atribuídos\\
|
|
\hline
|
|
(não especificado)&Qualquer valor numérico\\
|
|
{\tt integer}&Apenas valores numéricos inteiros\\
|
|
{\tt binary}&Tanto 0 quanto 1\\
|
|
{\tt symbolic}&Qualquer valor numérico e simbólico\\
|
|
\end{tabular}
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% Type attribute&Assigned values\\
|
|
% \hline
|
|
% (not specified)&Any numeric values\\
|
|
% {\tt integer}&Only integer numeric values\\
|
|
% {\tt binary}&Either 0 or 1\\
|
|
% {\tt symbolic}&Any numeric and symbolic values\\
|
|
% \end{tabular}
|
|
|
|
O atributo {\tt symbolic} não pode ser especificado juntamente com outros tipos
|
|
de atributos. Uma vez especificado, ele deve preceder todos os outros atributos.
|
|
|
|
O atributo de condição especifica uma condição opcional que restringe
|
|
os valores atribuídos ao parâmetro para satisfazer aquela condição.
|
|
Este atributo tem as seguintes formas sintáticas:
|
|
|
|
% The {\tt symbolic} attribute cannot be specified along with other type
|
|
% attributes. Being specified it should precede all other attributes.
|
|
%
|
|
% The condition attribute specifies an optional condition that restricts
|
|
% values assigned to the parameter to satisfy that condition. This
|
|
% attribute has the following syntactic forms:
|
|
|
|
\begin{tabular}{@{}ll@{}}
|
|
{\tt<} $v$&verifica se $x<v$\\
|
|
{\tt<=} $v$&verifica se $x\leq v$\\
|
|
{\tt=} $v$, {\tt==} $v$&verifica se $x=v$\\
|
|
{\tt>=} $v$&verifica se $x\geq v$\\
|
|
{\tt>} $v$&verifica se $x\geq v$\\
|
|
{\tt<>} $v$, {\tt!=} $v$&verifica se $x\neq v$\\
|
|
\end{tabular}
|
|
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% {\tt<} $v$&check for $x<v$\\
|
|
% {\tt<=} $v$&check for $x\leq v$\\
|
|
% {\tt=} $v$, {\tt==} $v$&check for $x=v$\\
|
|
% {\tt>=} $v$&check for $x\geq v$\\
|
|
% {\tt>} $v$&check for $x\geq v$\\
|
|
% {\tt<>} $v$, {\tt!=} $v$&check for $x\neq v$\\
|
|
% \end{tabular}
|
|
|
|
\noindent onde $x$ é um valor atribuído ao parâmetro, $v$ é o
|
|
valor resultante de uma expressão numérica ou simbólica especificado
|
|
no atributo de condição. Um número arbitrário de atributos de condição
|
|
pode ser especificado para o mesmo parâmetro. Se, durante a avaliação do
|
|
modelo, um valor atribuído ao parâmetro viola pelo menos uma das
|
|
condições especificadas, ocorrerá um erro. (Note que valores simbólicos
|
|
são ordenados de forma lexicográfica e qualquer valor numérico precede
|
|
qualquer valor simbólico.)
|
|
|
|
O atributo {\tt in} é similar ao atributo de condição e especifica
|
|
uma expressão de conjunto cujo valor resultante é um superconjunto usado
|
|
para restringir valores numéricos ou simbólicos atribuídos ao parâmetro
|
|
a estarem incluídos naquele superconjunto. Pode-se especificar um número
|
|
arbitrário de atributos {\tt in} para o mesmo parâmetro. Se, durante a avaliação do
|
|
modelo, o valor atribuído ao parâmetro não pertence a pelo menos um dos
|
|
superconjuntos especificados, ocorrerá um erro.
|
|
|
|
O atributo de atribuição ({\tt:=}) especifica uma expressão numérica
|
|
ou simbólica usada para \linebreak computar um valor atribuído ao parâmetro
|
|
(se é um parâmetro simples) ou seus membros (se o parâmetro é uma matriz).
|
|
Se o atributo de atribuição é especificado,
|
|
o parâmetro é {\it calculável}, \linebreak portanto, não há a necessidade de fornecer
|
|
dados na seção de dados. Se o atributo de atribuição não é especificado,
|
|
deve-se fornecer os dados para o parâmetro na seção de dados. Pode-se especificar no
|
|
máximo um atributo de atribuição ou {\tt default} para o mesmo parâmetro.
|
|
|
|
O atributo {\tt default} especifica uma expressão numérica ou simbólica
|
|
usada para computar um valor atribuído ao parâmetro ou seus membros
|
|
sempre que não houver dados apropriados disponíveis na seção de dados.
|
|
Se não se especifica nem o atributo de atribuição nem o atributo
|
|
{\tt default}, a falta de dados causará um erro.
|
|
|
|
% \noindent where $x$ is a value assigned to the parameter, $v$ is the
|
|
% resultant value of a numeric or symbolic expression specified in the
|
|
% condition attribute. Arbitrary number of condition attributes can be
|
|
% specified for the same parameter. If a value being assigned to the
|
|
% parameter during model evaluation violates at least one of specified
|
|
% conditions, an error is raised. (Note that symbolic values are ordered
|
|
% lexicographically, and any numeric value precedes any symbolic value.)
|
|
%
|
|
% The {\tt in} attribute is similar to the condition attribute and
|
|
% specifies a set expression whose resultant value is a superset used to
|
|
% restrict numeric or symbolic values assigned to the parameter to be in
|
|
% that superset. Arbitrary number of the {\tt in} attributes can be
|
|
% specified for the same parameter. If a value being assigned to the
|
|
% parameter during model evaluation is not in at least one of specified
|
|
% supersets, an error is raised.
|
|
%
|
|
% The assign ({\tt:=}) attribute specifies a numeric or symbolic
|
|
% expression used to compute a value assigned to the parameter (if it is
|
|
% a simple parameter) or its member (if the parameter is an array). If
|
|
% the assign attribute is specified, the parameter is {\it computable}
|
|
% and therefore needs no data to be provided in the data section. If the
|
|
% assign attribute is not specified, the parameter should be provided
|
|
% with data in the data section. At most one assign or {\tt default}
|
|
% attribute can be specified for the same parameter.
|
|
%
|
|
% The {\tt default} attribute specifies a numeric or symbolic expression
|
|
% used to compute a value assigned to the parameter or its member
|
|
% whenever no appropriate data are available in the data section. If
|
|
% neither assign nor {\tt default} attribute is specified, missing data
|
|
% will cause an error.
|
|
|
|
\newpage
|
|
|
|
\section{Sentença variable}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][24pt]{468pt}{
|
|
\hspace{6pt} {\tt var} {\it nome} {\it alias} {\it domínio} {\tt,}
|
|
{\it atrib} {\tt,} \dots {\tt,} {\it atrib} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it nome} é um nome simbólico da variável;
|
|
|
|
\noindent
|
|
{\it alias} é um literal de cadeia opcional que especifica um pseudônimo
|
|
para a variável;
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante opcional que especifica o domínio
|
|
do subíndice da variável;
|
|
|
|
\noindent
|
|
{\it atrib}, \dots, {\it atrib} são atributos opcionais da variável
|
|
(as vírgulas que precedem os atributos podem ser omitidas.)
|
|
|
|
\para{Atributos opcionais}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\begin{description}
|
|
\item[{\tt integer}]\hspace*{0pt}\\
|
|
restringe a variável a ser inteira;
|
|
\item[{\tt binary}]\hspace*{0pt}\\
|
|
restringe a variável a ser binária;
|
|
\item[{\tt>=} {\it expressão}]\hspace*{0pt}\\
|
|
especifica um limite inferior para a variável;
|
|
\item[{\tt<=} {\it expressão}]\hspace*{0pt}\\
|
|
especifica um limite superior para a variável;
|
|
\item[{\tt=} {\it expressão}]\hspace*{0pt}\\
|
|
especifica um valor fixo para a variável;
|
|
\end{description}
|
|
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][24pt]{468pt}{
|
|
% \hspace{6pt} {\tt var} {\it name} {\it alias} {\it domain} {\tt,}
|
|
% {\it attrib} {\tt,} \dots {\tt,} {\it attrib} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it name} is a symbolic name of the variable;
|
|
%
|
|
% \noindent
|
|
% {\it alias} is an optional string literal, which specifies an alias of
|
|
% the variable;
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an optional indexing expression, which specifies
|
|
% a subscript domain of the variable;
|
|
%
|
|
% \noindent
|
|
% {\it attrib}, \dots, {\it attrib} are optional attributes of the
|
|
% variable. (Commae preceding attributes may be omitted.)
|
|
%
|
|
% \para{Optional attributes}
|
|
%
|
|
% \vspace*{-8pt}
|
|
%
|
|
% \begin{description}
|
|
% \item[{\tt integer}]\hspace*{0pt}\\
|
|
% restricts the variable to be integer;
|
|
% \item[{\tt binary}]\hspace*{0pt}\\
|
|
% restricts the variable to be binary;
|
|
% \item[{\tt>=} {\it expression}]\hspace*{0pt}\\
|
|
% specifies an lower bound of the variable;
|
|
% \item[{\tt<=} {\it expression}]\hspace*{0pt}\\
|
|
% specifies an upper bound of the variable;
|
|
% \item[{\tt=} {\it expression}]\hspace*{0pt}\\
|
|
% specifies a fixed value of the variable;
|
|
% \end{description}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\para{Exemplos}
|
|
|
|
% \para{Examples}
|
|
|
|
\begin{verbatim}
|
|
var x >= 0;
|
|
var y{I,J};
|
|
var produzir{p in prod}, integer, >= comprometido[p], <= mercado[p];
|
|
var armazenar{insumo, 1..T+1} >= 0;
|
|
var z{i in I, j in J} >= i+j;
|
|
\end{verbatim}
|
|
|
|
% \begin{verbatim}
|
|
% var x >= 0;
|
|
% var y{I,J};
|
|
% var make{p in prd}, integer, >= commit[p], <= market[p];
|
|
% var store{raw, 1..T+1} >= 0;
|
|
% var z{i in I, j in J} >= i+j;
|
|
% \end{verbatim}
|
|
|
|
A sentença variable declara uma variável. Se não se especifica o
|
|
domínio do subíndice, a variável e uma variável simples (escalar),
|
|
caso contrário é uma matriz $n$-dimensional de variáveis elementares.
|
|
|
|
As variáveis elementares associadas com a variável do modelo
|
|
(se é uma variável simples) ou seus membros (se é uma matriz) corresponde
|
|
às variáveis na formulação do problema PL/PIM (ver Seção \ref{problem},
|
|
página \pageref{problem}). Note que somente variáveis elementares
|
|
realmente referenciadas em algumas restrições e/ou objetivos serão
|
|
incluídas na instância do problema PL/PIM a ser gerado.
|
|
|
|
Os atributos de tipo {\tt integer} e {\tt binary} restringem a variável
|
|
a ser inteira ou binária, \linebreak respectivamente. Se nenhum atributo de tipo
|
|
é especificado, a variável é contínua. Se todas as variáveis no modelo
|
|
são contínuas, o problema correspondente é da classe PL. Se há pelo
|
|
menos uma variável inteira ou binária, o problema é da classe PIM.
|
|
|
|
\newpage
|
|
|
|
O atributo de limite inferior ({\tt>=}) especifica uma expressão numérica
|
|
para calcular um limite inferior da variável. No máximo um limite inferior
|
|
pode ser especificado. Por padrão, todas as variáveis (exceto as binárias)
|
|
não tem limite inferior, assim, se há a necessidade de uma variável ser
|
|
não-negativa, seu limite inferior zero deve ser explicitamente especificado.
|
|
|
|
O atributo de limite superior ({\tt<=}) especifica uma expressão numérica
|
|
para calcular um limite superior da variável. No máximo um limite superior
|
|
pode ser especificado.
|
|
|
|
O atributo de valor fixo ({\tt=}) especifica uma expressão numérica para
|
|
calcular um valor no qual a variável é fixada. Este atributo não pode
|
|
ser especificado junto com os atributos de limite.
|
|
|
|
|
|
% The variable statement declares a variable. If a subscript domain is
|
|
% not specified, the variable is a simple (scalar) variable, otherwise it
|
|
% is a $n$-dimensional array of elemental variables.
|
|
%
|
|
% Elemental variable(s) associated with the model variable (if it is a
|
|
% simple variable) or its members (if it is an array) correspond to the
|
|
% variables in the LP/MIP problem formulation (see Section \ref{problem},
|
|
% page \pageref{problem}). Note that only elemental variables actually
|
|
% referenced in some constraints and/or objectives are included in the
|
|
% LP/MIP problem instance to be generated.
|
|
%
|
|
% The type attributes {\tt integer} and {\tt binary} restrict the
|
|
% variable to be integer or binary, respectively. If no type attribute is
|
|
% specified, the variable is continuous. If all variables in the model
|
|
% are continuous, the corresponding problem is of LP class. If there is
|
|
% at least one integer or binary variable, the problem is of MIP class.
|
|
%
|
|
% The lower bound ({\tt>=}) attribute specifies a numeric expression for
|
|
% computing an lower bound of the variable. At most one lower bound can
|
|
% be specified. By default all variables (except binary ones) have no
|
|
% lower bound, so if a variable is required to be non-negative, its zero
|
|
% lower bound should be explicitly specified.
|
|
%
|
|
% The upper bound ({\tt<=}) attribute specifies a numeric expression for
|
|
% computing an upper bound of the variable. At most one upper bound
|
|
% attribute can be specified.
|
|
%
|
|
% The fixed value ({\tt=}) attribute specifies a numeric expression for
|
|
% computing a value, at which the variable is fixed. This attribute
|
|
% cannot be specified along with the bound attributes.
|
|
|
|
|
|
\section{Sentença constraint}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][106pt]{468pt}{
|
|
\hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
|
|
{\it expressão} {\tt,} {\tt=} {\it expressão} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
|
|
{\it expressão} {\tt,} {\tt<=} {\it expressão} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
|
|
{\it expressão} {\tt,} {\tt>=} {\it expressão} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
|
|
{\it expressão} {\tt,} {\tt<=} {\it expressão} {\tt,} {\tt<=}
|
|
{\it expressão} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt s.t.} {\it nome} {\it alias} {\it domínio} {\tt:}
|
|
{\it expressão} {\tt,} {\tt>=} {\it expressão} {\tt,} {\tt>=}
|
|
{\it expressão} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it nome} é um nome simbólico da restrição;
|
|
|
|
\noindent
|
|
{\it alias} é um literal de cadeia opcional que especifica um pseudônimo
|
|
da restrição;
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante opcional, que especifica
|
|
o domínio do subíndice da restrição;
|
|
|
|
\noindent
|
|
{\it expressão} é uma expressão linear usada para calcular um componente
|
|
da restrição (as vírgulas que precedem os atributos podem ser omitidas).
|
|
|
|
\noindent
|
|
(A palavra-chave {\tt s.t.} pode ser escrita como {\tt subject to}, como
|
|
{\tt subj to} ou pode ser omitido por completo).
|
|
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][106pt]{468pt}{
|
|
% \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
|
|
% {\it expression} {\tt,} {\tt=} {\it expression} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
|
|
% {\it expression} {\tt,} {\tt<=} {\it expression} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
|
|
% {\it expression} {\tt,} {\tt>=} {\it expression} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
|
|
% {\it expression} {\tt,} {\tt<=} {\it expression} {\tt,} {\tt<=}
|
|
% {\it expression} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt s.t.} {\it name} {\it alias} {\it domain} {\tt:}
|
|
% {\it expression} {\tt,} {\tt>=} {\it expression} {\tt,} {\tt>=}
|
|
% {\it expression} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it name} is a symbolic name of the constraint;
|
|
%
|
|
% \noindent
|
|
% {\it alias} is an optional string literal, which specifies an alias of
|
|
% the constraint;
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an optional indexing expression, which specifies
|
|
% a subscript domain of the constraint;
|
|
%
|
|
% \noindent
|
|
% {\it expression} is a linear expression used to compute a component of
|
|
% the constraint. (Commae following expressions may be omitted.)
|
|
%
|
|
% \noindent
|
|
% (The keyword {\tt s.t.} may be written as {\tt subject to} or as
|
|
% {\tt subj to}, or may be omitted at all.)
|
|
|
|
|
|
\para{Exemplos}
|
|
|
|
% \para{Examples}
|
|
|
|
\begin{verbatim}
|
|
s.t. r: x + y + z, >= 0, <= 1;
|
|
limite{t in 1..T}: sum{j in produto} produzir[j,t] <= max_prod;
|
|
subject to balanco{i in insumo, t in 1..T}:
|
|
estoque[i,t+1] = estoque[i,t] - sum{j in produto} unidades[i,j] * produzir[j,t];
|
|
subject to rlim 'limite tempo-regular' {t in tempo}:
|
|
sum{p in produto} pt[p] * rprod[p,t] <= 1.3 * dpp[t] * equipes[t];
|
|
\end{verbatim}
|
|
|
|
% \begin{verbatim}
|
|
% s.t. r: x + y + z, >= 0, <= 1;
|
|
% limit{t in 1..T}: sum{j in prd} make[j,t] <= max_prd;
|
|
% subject to balance{i in raw, t in 1..T}:
|
|
% store[i,t+1] = store[i,t] - sum{j in prd} units[i,j] * make[j,t];
|
|
% subject to rlim 'regular-time limit' {t in time}:
|
|
% sum{p in prd} pt[p] * rprd[p,t] <= 1.3 * dpp[t] * crews[t];
|
|
% \end{verbatim}
|
|
|
|
A sentença de restrição declara uma restrição. Se o domínio do subíndice
|
|
não é especificado, a restrição é uma restrição simples (escalar),
|
|
caso contrário, é uma matriz $n$-dimensional de restrições elementares.
|
|
|
|
Restrições elementares associadas com a restrição do modelo (se é
|
|
uma restrição simples) ou seus membros (se é uma matriz) correspondem
|
|
a restrições lineares na formulação do problema de PL/PIM (ver
|
|
Seção \ref{problem}, página \pageref{problem}).
|
|
|
|
Se a restrição possui a forma de igualdade ou desigualdade simples, i.e.,
|
|
inclui duas expressões, uma segue depois dos dois pontos e a outra
|
|
segue depois do sinal de relação {\tt=}, {\tt<=} ou {\tt>=}, \linebreak ambas
|
|
expressões na sentença podem ser expressões lineares. Se a restrição
|
|
possui a forma de uma \linebreak desigualdade dupla, i.e., inclui três expressões,
|
|
a expressão do meio pode ser uma expressão linear, enquanto a da
|
|
esquerda e a da direita podem ser apenas expressões numéricas.
|
|
|
|
Gerar o modelo é, a grosso modo, gerar suas restrições, que são sempre
|
|
avaliadas para todo domínio do subíndice. Avaliar as restrições,
|
|
por sua vez, leva a avaliação de outros objetos de modelo tais como
|
|
conjuntos, parâmetros e variáveis.
|
|
|
|
A construção de uma restrição linear incluída na instância do problema,
|
|
que corresponde a uma restrição elementar particular, é realizada
|
|
como segue.
|
|
|
|
|
|
% The constraint statement declares a constraint. If a subscript domain
|
|
% is not specified, the\linebreak constraint is a simple (scalar)
|
|
% constraint, otherwise it is a $n$-dimensional array of elemental
|
|
% constraints.
|
|
%
|
|
% Elemental constraint(s) associated with the model constraint (if it is
|
|
% a simple constraint) or its members (if it is an array) correspond to
|
|
% the linear constraints in the LP/MIP problem formulation (see
|
|
% Section \ref{problem}, page \pageref{problem}).
|
|
%
|
|
% If the constraint has the form of equality or single inequality, i.e.
|
|
% includes two expressions, one of which follows the colon and other
|
|
% follows the relation sign {\tt=}, {\tt<=}, or {\tt>=}, both expressions
|
|
% in the statement can be linear expressions. If the constraint has the
|
|
% form of double inequality,\linebreak i.e. includes three expressions,
|
|
% the middle expression can be a linear expression while the leftmost and
|
|
% rightmost ones can be only numeric expressions.
|
|
%
|
|
% Generating the model is, roughly speaking, generating its constraints,
|
|
% which are always evaluated for the entire subscript domain. Evaluation
|
|
% of the constraints leads, in turn, to evaluation of other model objects
|
|
% such as sets, parameters, and variables.
|
|
%
|
|
% Constructing an actual linear constraint included in the problem
|
|
% instance, which (constraint) corresponds to a particular elemental
|
|
% constraint, is performed as follows.
|
|
|
|
|
|
Se a restrição possui a forma de igualdade ou desigualdade simples,
|
|
a avaliação de ambas \linebreak expressões lineares resultam em duas formas lineares:
|
|
$$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r}
|
|
f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\
|
|
g&=&b_1x_1&+&b_2x_2&+\dots+&b_nx_n&+&b_0,\\
|
|
\end{array}$$
|
|
onde $x_1$, $x_2$, \dots, $x_n$ são variáveis elementares; $a_1$, $a_2$,
|
|
\dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ são coeficientes numéricos;
|
|
$a_0$ e $b_0$ são termos constantes. Em seguida, todos os termos lineares
|
|
de $f$ e $g$ são levados ao lado esquerdo, enquanto que os termos constantes
|
|
são levados ao lado direito, resultando na restrição elementar
|
|
final na forma padrão:
|
|
$$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{
|
|
\begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$
|
|
|
|
Se a restrição possui a forma de desigualdade dupla, a avaliação da
|
|
expressão linear do meio resulta na seguinte forma linear:
|
|
$$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
|
|
e a avaliação das expressões numéricas da esquerda e da direita dão
|
|
dois valores numéricos $l$ e $u$, respectivamente. Logo,
|
|
o termo constante da forma linear é levado tanto à esquerda como
|
|
à direita para gerar a restrição elementar final na forma padrão:
|
|
$$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$
|
|
|
|
|
|
% If the constraint has the form of equality or single inequality,
|
|
% evaluation of both linear expressions gives two resultant linear forms:
|
|
% $$\begin{array}{r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r@{\ }c@{\ }r}
|
|
% f&=&a_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&a_0,\\
|
|
% g&=&b_1x_1&+&a_2x_2&+\dots+&a_nx_n&+&b_0,\\
|
|
% \end{array}$$
|
|
% where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$,
|
|
% \dots, $a_n$, $b_1$, $b_2$, \dots, $b_n$ are numeric coefficients;
|
|
% $a_0$ and $b_0$ are constant terms. Then all linear terms of $f$ and
|
|
% $g$ are carried to the left-hand side, and the constant terms are
|
|
% carried to the right-hand side, that gives the final elemental
|
|
% constraint in the standard form:
|
|
% $$(a_1-b_1)x_1+(a_2-b_2)x_2+\dots+(a_n-b_n)x_n\left\{
|
|
% \begin{array}{@{}c@{}}=\\\leq\\\geq\\\end{array}\right\}b_0-a_0.$$
|
|
%
|
|
% If the constraint has the form of double inequality, evaluation of the
|
|
% middle linear expression gives the resultant linear form:
|
|
% $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
|
|
% and evaluation of the leftmost and rightmost numeric expressions gives
|
|
% two numeric values $l$ and $u$, respectively. Then the constant term of
|
|
% the linear form is carried to both left-hand and right-handsides that
|
|
% gives the final elemental constraint in the standard form:
|
|
% $$l-a_0\leq a_1x_1+a_2x_2+\dots+a_nx_n\leq u-a_0.$$
|
|
|
|
|
|
\section{Sentença objective}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][44pt]{468pt}{
|
|
\hspace{6pt} {\tt minimize} {\it nome} {\it alias} {\it domínio} {\tt:}
|
|
{\it expressão} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt maximize} {\it nome} {\it alias} {\it domínio} {\tt:}
|
|
{\it expressão} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it nome} é um nome simbólico do objetivo;
|
|
|
|
\noindent
|
|
{\it alias} é uma literal de cadeia opcional que especifica um
|
|
pseudônimo do objetivo;
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante opcional que especifica
|
|
um domínio do subíndice do objetivo;
|
|
|
|
\noindent
|
|
{\it expressão} é uma expressão linear usada pra calcular a forma
|
|
linear do objetivo.
|
|
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][44pt]{468pt}{
|
|
% \hspace{6pt} {\tt minimize} {\it name} {\it alias} {\it domain} {\tt:}
|
|
% {\it expression} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt maximize} {\it name} {\it alias} {\it domain} {\tt:}
|
|
% {\it expression} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it name} is a symbolic name of the objective;
|
|
%
|
|
% \noindent
|
|
% {\it alias} is an optional string literal, which specifies an alias of
|
|
% the objective;
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an optional indexing expression, which specifies
|
|
% a subscript domain of the objective;
|
|
%
|
|
% \noindent
|
|
% {\it expression} is a linear expression used to compute the linear form
|
|
% of the objective.
|
|
|
|
\newpage
|
|
|
|
\para{Exemplos}
|
|
|
|
% \para{Examples}
|
|
|
|
\begin{verbatim}
|
|
minimize obj: x + 1.5 * (y + z);
|
|
maximize lucro_total: sum{p in produto} lucro[p] * produzir[p];
|
|
\end{verbatim}
|
|
|
|
% \begin{verbatim}
|
|
% minimize obj: x + 1.5 * (y + z);
|
|
% maximize total_profit: sum{p in prd} profit[p] * make[p];
|
|
% \end{verbatim}
|
|
|
|
A sentença objective declara um objetivo. Se o domínio do subíndice
|
|
não é especificado, o objetivo é um objetivo simples (escalar). Caso contrário,
|
|
é uma matriz $n$-dimensional de objetivos elementares.
|
|
|
|
Objetivos elementares associados com o objetivo do modelo (se é um
|
|
objetivo simples) ou seus membros (se é uma matriz) correspondem
|
|
a restrições lineares genéricas na formulação do problema PL/PIM
|
|
(ver Seção \ref{problem}, página \pageref{problem}). No entanto,
|
|
diferentemente das restrições, estas formas lineares são livres
|
|
(ilimitadas).
|
|
|
|
A construção de uma forma linear incluída na instância do problema,
|
|
a qual corresponde a uma restrição elementar particular,
|
|
é realizada como segue. A expressão linear especificada da na
|
|
sentença objective é avaliada para resultar na seguinte forma linear:
|
|
$$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
|
|
onde $x_1$, $x_2$, \dots, $x_n$ são variáveis elementares; $a_1$, $a_2$,
|
|
\dots, $a_n$ são coeficientes numéricos; $a_0$ é o termo constante. Logo,
|
|
a forma linear é usada para construir a restrição final elementar na
|
|
forma padrão:
|
|
$$-\infty<a_1x_1+a_2x_2+\dots+a_nx_n+a_0<+\infty.$$
|
|
|
|
Como via de regra, a descrição do modelo contém apenas uma sentença objective
|
|
que define a função objetivo usada na instância do problema.
|
|
No entanto, é permitido declarar uma quantidade arbitrária de objetivos.
|
|
Neste caso, a função objetivo real será o primeiro objetivo
|
|
encontrado na descrição do modelo. Outros objetivos também estão
|
|
incluídos na instância do problema, mas eles não afetam a função
|
|
objetivo.
|
|
|
|
|
|
|
|
% The objective statement declares an objective. If a subscript domain is
|
|
% not specified, the objective is a simple (scalar) objective. Otherwise
|
|
% it is a $n$-dimensional array of elemental objectives.
|
|
%
|
|
% Elemental objective(s) associated with the model objective (if it is a
|
|
% simple objective) or its members (if it is an array) correspond to
|
|
% general linear constraints in the LP/MIP problem formulation (see
|
|
% Section \ref{problem}, page \pageref{problem}). However, unlike
|
|
% constraints the corresponding linear forms are free (unbounded).
|
|
%
|
|
% Constructing an actual linear constraint included in the problem
|
|
% instance, which (constraint) corresponds to a particular elemental
|
|
% constraint, is performed as follows. The linear expression specified in
|
|
% the objective statement is evaluated that, gives the resultant linear
|
|
% form:
|
|
% $$f=a_1x_1+a_2x_2+\dots+a_nx_n+a_0,$$
|
|
% where $x_1$, $x_2$, \dots, $x_n$ are elemental variables; $a_1$, $a_2$,
|
|
% \dots, $a_n$ are numeric coefficients; $a_0$ is the constant term. Then
|
|
% the linear form is used to construct the final elemental constraint in
|
|
% the standard form:
|
|
% $$-\infty<a_1x_1+a_2x_2+\dots+a_nx_n+a_0<+\infty.$$
|
|
%
|
|
% As a rule the model description contains only one objective statement
|
|
% that defines the objective function used in the problem instance.
|
|
% However, it is allowed to declare arbitrary number of objectives, in
|
|
% which case the actual objective function is the first objective
|
|
% encountered in the model description. Other objectives are also
|
|
% included in the problem instance, but they do not affect the objective
|
|
% function.
|
|
|
|
\section{Sentença solve}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][24pt]{468pt}{
|
|
\hspace{6pt} {\tt solve} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
A sentença solve é opcional e pode ser usada apenas uma vez.
|
|
Se a sentença solve não é usada, ela é assumida ao final da seção de modelo.
|
|
|
|
A sentença solve provoca que o modelo seja resolvido, o que significa calcular
|
|
os valores numéricos de todas as variáveis do modelo. Isto permite usar
|
|
variáveis em sentenças abaixo da sentença solve como se fossem parâmetros
|
|
numéricos.
|
|
|
|
Note que a sentença variable, constraint e objective não podem ser usadas
|
|
abaixo da sentença solve, i.e., todos os principais componentes do modelo
|
|
devem ser declarados acima da sentença solve.
|
|
|
|
|
|
% The solve statement is optional and can be used only once. If no solve
|
|
% statement is used, one is assumed at the end of the model section.
|
|
%
|
|
% The solve statement causes the model to be solved, that means computing
|
|
% numeric values of all model variables. This allows using variables in
|
|
% statements below the solve statement in the same way as if they were
|
|
% numeric parameters.
|
|
%
|
|
% Note that the variable, constraint, and objective statements cannot be
|
|
% used below the solve statement, i.e. all principal components of the
|
|
% model should be declared above the solve statement.
|
|
|
|
\newpage
|
|
|
|
\section{Sentença check}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][24pt]{468pt}{
|
|
\hspace{6pt} {\tt check} {\it domínio} {\tt:} {\it expressão} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante opcional que especifica o
|
|
domínio do subíndice da sentença check;
|
|
|
|
\noindent
|
|
{\it expressão} é uma expressão lógica que especifica a condição
|
|
lógica a ser verificada (os dois pontos que precedem a {\it expressão}
|
|
podem ser omitidos).
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
check: x + y <= 1 and x >= 0 and y >= 0;
|
|
check sum{i in ORIG} suprimento[i] = sum{j in DEST} demanda[j];
|
|
check{i in I, j in 1..10}: S[i,j] in U[i] union V[j];
|
|
\end{verbatim}
|
|
|
|
A sentença check permite a verificação do valor resultante
|
|
de uma expressão lógica especificada na sentença. Se o valor
|
|
é {\it falso}, um erro é reportado.
|
|
|
|
Se o domínio do subíndice não é especificado, a verificação é realizada
|
|
apenas uma vez. \linebreak Especificar o domínio do subíndice
|
|
permite a execução de verificações múltiplas para cada $n$-tupla
|
|
no conjunto domínio. Neste último caso, a expressão lógica pode
|
|
incluir índices introduzidos na expressão indexante correspondente.
|
|
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][24pt]{468pt}{
|
|
% \hspace{6pt} {\tt check} {\it domain} {\tt:} {\it expression} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an optional indexing expression, which specifies
|
|
% a subscript domain of the check statement;
|
|
%
|
|
% \noindent
|
|
% {\it expression} is an logical expression which specifies the logical
|
|
% condition to be checked. (The colon preceding {\it expression} may be
|
|
% omitted.)
|
|
%
|
|
% \para{Examples}
|
|
%
|
|
% \begin{verbatim}
|
|
% check: x + y <= 1 and x >= 0 and y >= 0;
|
|
% check sum{i in ORIG} supply[i] = sum{j in DEST} demand[j];
|
|
% check{i in I, j in 1..10}: S[i,j] in U[i] union V[j];
|
|
% \end{verbatim}
|
|
%
|
|
% The check statement allows checking the resultant value of an logical
|
|
% expression specified in the statement. If the value is {\it false}, an
|
|
% error is reported.
|
|
%
|
|
% If the subscript domain is not specified, the check is performed only
|
|
% once. Specifying the subscript domain allows performing multiple check
|
|
% for every $n$-tuple in the domain set. In the latter case the logical
|
|
% expression may include dummy indices introduced in corresponding
|
|
% indexing expression.
|
|
|
|
\section{Sentença display}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][24pt]{468pt}{
|
|
\hspace{6pt} {\tt display} {\it domínio} {\tt:} {\it item} {\tt,}
|
|
\dots {\tt,} {\it item} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante opcional que especifica
|
|
um domínio do subíndice da sentença display;
|
|
|
|
\noindent
|
|
{\it item}, \dots, {\it item} são itens a serem mostrados (os dois pontos
|
|
que precedem o primeiro item podem ser omitidos).
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
display: 'x =', x, 'y =', y, 'z =', z;
|
|
display sqrt(x ** 2 + y ** 2 + z ** 2);
|
|
display{i in I, j in J}: i, j, a[i,j], b[i,j];
|
|
\end{verbatim}
|
|
|
|
A sentença display avalia todos itens especificados na sentença
|
|
e escreve seus valores em saída padrão (terminal) em formato de
|
|
texto plano.
|
|
|
|
Se um domínio de subíndice não é especificado, os itens são avaliados e
|
|
mostrados apenas uma vez. Ao especificar o domínio do subíndice, itens
|
|
são avaliados e mostrados para cada $n$-tupla no conjunto do domínio. No
|
|
último caso, os itens podem incluir índices introduzidos na expressão
|
|
indexante correspondente.
|
|
|
|
Um item a ser mostrado pode ser um objeto de modelo (conjunto, parâmetro,
|
|
variável, restrição, objetivo) ou uma expressão.
|
|
|
|
Se um item é um objeto calculável (i.e., um conjunto ou parâmetro com
|
|
o atributo de atribuição), o objeto é avaliado por todo domínio
|
|
e em seguida, seu conteúdo (i.e., o conteúdo da matriz de objetos) é
|
|
mostrado. Caso contrário, se o item não é um objeto calculável, somente seu
|
|
seu conteúdo corrente (i.e., os membros realmente gerados durante a
|
|
avaliação do modelo) é mostrado.
|
|
|
|
Se o item é uma expressão, a expressão é avaliada e seu valor
|
|
resultante é mostrado.
|
|
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][24pt]{468pt}{
|
|
% \hspace{6pt} {\tt display} {\it domain} {\tt:} {\it item} {\tt,}
|
|
% \dots {\tt,} {\it item} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an optional indexing expression, which specifies
|
|
% a subscript domain of the display statement;
|
|
%
|
|
% \noindent
|
|
% {\it item}, \dots, {\it item} are items to be displayed. (The colon
|
|
% preceding the first item may be omitted.)
|
|
%
|
|
% \para{Examples}
|
|
%
|
|
% \begin{verbatim}
|
|
% display: 'x =', x, 'y =', y, 'z =', z;
|
|
% display sqrt(x ** 2 + y ** 2 + z ** 2);
|
|
% display{i in I, j in J}: i, j, a[i,j], b[i,j];
|
|
% \end{verbatim}
|
|
%
|
|
% The display statement evaluates all items specified in the statement
|
|
% and writes their values on the standard output (terminal) in plain text
|
|
% format.
|
|
%
|
|
% If a subscript domain is not specified, items are evaluated and then
|
|
% displayed only once. Specifying the subscript domain causes items to be
|
|
% evaluated and displayed for every $n$-tuple in the domain set. In the
|
|
% latter case items may include dummy indices introduced in corresponding
|
|
% indexing expression.
|
|
%
|
|
% An item to be displayed can be a model object (set, parameter,
|
|
% variable, constraint, objective) or an expression.
|
|
%
|
|
% If the item is a computable object (i.e. a set or parameter provided
|
|
% with the assign attribute), the object is evaluated over the entire
|
|
% domain and then its content (i.e. the content of the object array) is
|
|
% displayed. Otherwise, if the item is not a computable object, only its
|
|
% current content (i.e. members actually generated during the model
|
|
% evaluation) is displayed.
|
|
%
|
|
% If the item is an expression, the expression is evaluated and its
|
|
% resultant value is displayed.
|
|
|
|
\section{Sentença printf}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][64pt]{468pt}{
|
|
\hspace{6pt} {\tt printf} {\it domínio} {\tt:} {\it formato} {\tt,}
|
|
{\it expressão} {\tt,} \dots {\tt,} {\it expressão} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt printf} {\it domínio} {\tt:} {\it formato} {\tt,}
|
|
{\it expressão} {\tt,} \dots {\tt,} {\it expressão} {\tt>}
|
|
{\it nome-do-arquivo} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt printf} {\it domínio} {\tt:} {\it formato} {\tt,}
|
|
{\it expressão} {\tt,} \dots {\tt,} {\it expressão} {\tt>>}
|
|
{\it nome-do-arquivo} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante opcional que especifica o domínio
|
|
do subíndice da sentença printf;
|
|
|
|
\noindent
|
|
{\it formato} é uma expressão simbólica cujo valor especifica uma cadeia de
|
|
controle de formato (os dois pontos que precedem a expressão de formato
|
|
podem ser omitidos).
|
|
|
|
\noindent
|
|
{\it expressão}, \dots, {\it expressão} são zero ou mais expressões
|
|
cujos valores devem ser formatados e impressos. Cada expressão deve
|
|
ser de tipo numérico, simbólico ou lógico.
|
|
|
|
\noindent
|
|
{\it nome-do-arquivo} é uma expressão simbólica cujo valor especifica um nome
|
|
de um arquivo de texto para onde a saída é redirecionada. O sinal {\tt>}
|
|
significa criar um novo aquivo vazio, enquanto o sinal {\tt>>} significa
|
|
acrescentar a saída a um arquivo existente. Se o nome do arquivo não é especificado,
|
|
a saída é escrita na saída padrão (terminal).
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
printf 'Ola, mundo!\n';
|
|
printf: "x = %.3f; y = %.3f; z = %.3f\n", x, y, z > "resultado.txt";
|
|
printf{i in I, j in J}: "fluxo de %s para %s eh %d\n", i, j, x[i,j]
|
|
>> arquivo_resultado & ".txt";
|
|
printf{i in I} 'fluxo total de %s eh %g\n', i, sum{j in J} x[i,j];
|
|
printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"),
|
|
k, x[k];
|
|
\end{verbatim}
|
|
|
|
A sentença printf é similar a sentença display, no entanto, ela
|
|
permite formatar os dados a serem escritos.
|
|
|
|
Se um domínio do subíndice não é especificado, a sentença printf
|
|
é executada apenas uma vez. Especificar um domínio do subíndice gera
|
|
a execução da sentença printf para cada $n$-tupla no conjunto do domínio.
|
|
No último caso, o formato e a expressão podem incluir índices introduzidos
|
|
nas expressões indexantes correspondentes.
|
|
|
|
A cadeia de controle de formato é valor da expressão simbólica
|
|
{\it formato} especificada na sentença printf. Ela é composta de zero
|
|
ou mais diretivas, como segue: tanto caracteres ordinários (exceto {\tt\%}), que
|
|
são copiados sem modificação ao fluxo de saída, quanto especificações de conversão,
|
|
provocam a avaliação da expressão correspondente especificada na sentença
|
|
printf, do seu formato e da escrita do valor resultante no fluxo de saída.
|
|
|
|
As especificações de conversão que podem ser usadas na cadeia de controle
|
|
de formato são as seguintes: {\tt d}, {\tt i}, {\tt f}, {\tt F},
|
|
{\tt e}, {\tt E}, {\tt g}, {\tt G} e {\tt s}. Estas especificações
|
|
possuem a mesma sintaxe e semântica que na linguagem de programação C.
|
|
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][64pt]{468pt}{
|
|
% \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,}
|
|
% {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,}
|
|
% {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>}
|
|
% {\it filename} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt printf} {\it domain} {\tt:} {\it format} {\tt,}
|
|
% {\it expression} {\tt,} \dots {\tt,} {\it expression} {\tt>>}
|
|
% {\it filename} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an optional indexing expression, which specifies
|
|
% a subscript domain of the printf statement;
|
|
%
|
|
% \noindent
|
|
% {\it format} is a symbolic expression whose value specifies a format
|
|
% control string. (The colon preceding the format expression may be
|
|
% omitted.)
|
|
%
|
|
% \noindent
|
|
% {\it expression}, \dots, {\it expression} are zero or more expressions
|
|
% whose values have to be formatted and printed. Each expression should
|
|
% be of numeric, symbolic, or logical type.
|
|
%
|
|
% \noindent
|
|
% {\it filename} is a symbolic expression whose value specifies a name
|
|
% of a text file, to which the output is redirected. The flag {\tt>}
|
|
% means creating a new empty file while the flag {\tt>>} means appending
|
|
% the output to an existing file. If no file name is specified, the
|
|
% output is written on the standard output (terminal).
|
|
%
|
|
% \para{Examples}
|
|
%
|
|
% \begin{verbatim}
|
|
% printf 'Hello, world!\n';
|
|
% printf: "x = %.3f; y = %.3f; z = %.3f\n", x, y, z > "result.txt";
|
|
% printf{i in I, j in J}: "flow from %s to %s is %d\n", i, j, x[i,j]
|
|
% >> result_file & ".txt";
|
|
% printf{i in I} 'total flow from %s is %g\n', i, sum{j in J} x[i,j];
|
|
% printf{k in K} "x[%s] = " & (if x[k] < 0 then "?" else "%g"),
|
|
% k, x[k];
|
|
% \end{verbatim}
|
|
%
|
|
% The printf statement is similar to the display statement, however, it
|
|
% allows formatting data to be written.
|
|
%
|
|
% If a subscript domain is not specified, the printf statement is
|
|
% executed only once. Specifying a subscript domain causes executing the
|
|
% printf statement for every $n$-tuple in the domain set. In the latter
|
|
% case the format and expression may include dummy indices introduced in
|
|
% corresponding indexing expression.
|
|
%
|
|
% The format control string is a value of the symbolic expression
|
|
% {\it format} specified in the printf statement. It is composed of zero
|
|
% or more directives as follows: ordinary characters (not {\tt\%}), which
|
|
% are copied unchanged to the output stream, and conversion
|
|
% specifications, each of which causes evaluating corresponding
|
|
% expression specified in the printf statement, formatting it, and
|
|
% writing its resultant value to the output stream.
|
|
%
|
|
% Conversion specifications that may be used in the format control string
|
|
% are the following:\linebreak {\tt d}, {\tt i}, {\tt f}, {\tt F},
|
|
% {\tt e}, {\tt E}, {\tt g}, {\tt G}, and {\tt s}. These specifications
|
|
% have the same syntax and semantics as in the C programming language.
|
|
|
|
\section{Sentença for}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][44pt]{468pt}{
|
|
\hspace{6pt} {\tt for} {\it domínio} {\tt:} {\it sentença} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt for} {\it domínio} {\tt:} {\tt\{} {\it sentença}
|
|
\dots {\it sentença} {\tt\}} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante que especifica um
|
|
domínio do subíndice da sentença for. (Os dois pontos que seguem a
|
|
expressão indexante podem ser omitidos).
|
|
|
|
\noindent
|
|
{\it sentença} é uma sentença que deve ser executada sob o controle
|
|
da sentença for;
|
|
|
|
\noindent
|
|
{\it sentença}, \dots, {\it sentença} é uma sequência de sentenças
|
|
(cercada entre chaves) que deve ser executada sob o controle da
|
|
sentença for.
|
|
|
|
Apenas as sentenças seguintes podem ser usadas dentro da
|
|
sentença for: check, display, printf e outro for.
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
for {(i,j) in E: i != j}
|
|
{ printf "fluxo de %s para %s eh %g\n", i, j, x[i,j];
|
|
check x[i,j] >= 0;
|
|
}
|
|
for {i in 1..n}
|
|
{ for {j in 1..n} printf " %s", if x[i,j] then "Q" else ".";
|
|
printf("\n");
|
|
}
|
|
for {1..72} printf("*");
|
|
\end{verbatim}
|
|
|
|
A sentença for faz com que a sentença, ou uma sequência de sentenças
|
|
especificadas como parte da sentença for, seja executada para cada
|
|
$n$-tupla no conjunto do domínio. Assim, sentenças dentro da sentença for
|
|
podem incluir índices introduzidos na expressão indexante correspondente.
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][44pt]{468pt}{
|
|
% \hspace{6pt} {\tt for} {\it domain} {\tt:} {\it statement} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt for} {\it domain} {\tt:} {\tt\{} {\it statement}
|
|
% \dots {\it statement} {\tt\}} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an indexing expression which specifies a subscript
|
|
% domain of the for statement. (The colon following the indexing
|
|
% expression may be omitted.)
|
|
%
|
|
% \noindent
|
|
% {\it statement} is a statement, which should be executed under control
|
|
% of the for statement;
|
|
%
|
|
% \noindent
|
|
% {\it statement}, \dots, {\it statement} is a sequence of statements
|
|
% (enclosed in curly braces), which should be executed under control of
|
|
% the for statement.
|
|
%
|
|
% Only the following statements can be used within the for statement:
|
|
% check, display, printf, and another for.
|
|
%
|
|
% \para{Examples}
|
|
%
|
|
% \begin{verbatim}
|
|
% for {(i,j) in E: i != j}
|
|
% { printf "flow from %s to %s is %g\n", i, j, x[i,j];
|
|
% check x[i,j] >= 0;
|
|
% }
|
|
% for {i in 1..n}
|
|
% { for {j in 1..n} printf " %s", if x[i,j] then "Q" else ".";
|
|
% printf("\n");
|
|
% }
|
|
% for {1..72} printf("*");
|
|
% \end{verbatim}
|
|
%
|
|
% The for statement causes a statement or a sequence of statements
|
|
% specified as part of the for statement to be executed for every
|
|
% $n$-tuple in the domain set. Thus, statements within the for statement
|
|
% may include dummy indices introduced in corresponding indexing
|
|
% expression.
|
|
|
|
\newpage
|
|
|
|
\section{Sentença table}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][80pt]{468pt}{
|
|
\hspace{6pt} {\tt table} {\it nome} {\it alias} {\tt IN} {\it controlador}
|
|
{\it arg} \dots {\it arg} {\tt:}
|
|
|
|
\hspace{6pt} {\tt\ \ \ \ \ } {\it conjunto} {\tt<-} {\tt[} {\it cmp} {\tt,}
|
|
\dots {\tt,} {\it cmp} {\tt]} {\tt,} {\it par} {\tt\textasciitilde}
|
|
{\it cmp} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it cmp}
|
|
{\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt table} {\it nome} {\it alias} {\it domínio} {\tt OUT}
|
|
{\it controlador} {\it arg} \dots {\it arg} {\tt:}
|
|
|
|
\hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it cmp}
|
|
{\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it cmp} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it nome} é um nome simbólico da tabela;
|
|
|
|
\noindent
|
|
{\it alias} é um literal de cadeia opcional que especifica um pseudônimo
|
|
da tabela;
|
|
|
|
\noindent
|
|
{\it domínio} é uma expressão indexante que especifica o domínio do
|
|
subíndice da tabela (de saída);
|
|
|
|
\noindent
|
|
{\tt IN} significa ler dados de uma tabela de entrada;
|
|
|
|
\noindent
|
|
{\tt OUT} significa escrever dados em uma tabela de saída;
|
|
|
|
\noindent
|
|
{\it controlador} é uma expressão simbólica que especifica o controlador
|
|
usado para acessar a tabela (para mais detalhes, ver Apêndice \ref{drivers},
|
|
página \pageref{drivers});
|
|
|
|
\noindent
|
|
{\it arg} é uma expressão simbólica opcional, que é um argumento
|
|
passado ao controlador da tabela. Esta expressão simbólica não deveria
|
|
incluir índices especificados no domínio;
|
|
|
|
\noindent
|
|
{\it conjunto} é o nome de um conjunto simples opcional chamado
|
|
{\it conjunto de controle}. Pode ser omitido junto com o delimitador {\tt<-};
|
|
|
|
\noindent
|
|
{\it cmp} é um nome de campo. Entre colchetes, pelo menos um campo deve ser
|
|
especificado. O nome do campo, que segue o nome do parâmetro ou de uma
|
|
expressão, é opcional e pode ser omitido juntamente com o
|
|
delimitador~{\tt\textasciitilde}. Neste caso o nome do objeto de modelo
|
|
correspondente é usado como nome de campo;
|
|
|
|
\noindent
|
|
{\it par} é um nome simbólico de um parâmetro do modelo;
|
|
|
|
\noindent
|
|
{\it expr} é uma expressão numérica ou simbólica.
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
table dados IN "CSV" "dados.csv": S <- [DE,PARA], d~DISTANCIA,
|
|
c~CUSTO;
|
|
table resultado{(d,p) in S} OUT "CSV" "resultado.csv": d~DE, p~PARA,
|
|
x[d,p]~FLUXO;
|
|
\end{verbatim}
|
|
|
|
A sentença table permite a leitura de dados de uma tabela para objetos
|
|
de modelo como conjuntos e parâmetros (não-escalares) assim como escrever
|
|
dados do modelo para uma tabela.
|
|
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][80pt]{468pt}{
|
|
% \hspace{6pt} {\tt table} {\it name} {\it alias} {\tt IN} {\it driver}
|
|
% {\it arg} \dots {\it arg} {\tt:}
|
|
%
|
|
% \hspace{6pt} {\tt\ \ \ \ \ } {\it set} {\tt<-} {\tt[} {\it fld} {\tt,}
|
|
% \dots {\tt,} {\it fld} {\tt]} {\tt,} {\it par} {\tt\textasciitilde}
|
|
% {\it fld} {\tt,} \dots {\tt,} {\it par} {\tt\textasciitilde} {\it fld}
|
|
% {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt table} {\it name} {\it alias} {\it domain} {\tt OUT}
|
|
% {\it driver} {\it arg} \dots {\it arg} {\tt:}
|
|
%
|
|
% \hspace{6pt} {\tt\ \ \ \ \ } {\it expr} {\tt\textasciitilde} {\it fld}
|
|
% {\tt,} \dots {\tt,} {\it expr} {\tt\textasciitilde} {\it fld} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it name} is a symbolic name of the table;
|
|
%
|
|
% \noindent
|
|
% {\it alias} is an optional string literal, which specifies an alias of
|
|
% the table;
|
|
%
|
|
% \noindent
|
|
% {\it domain} is an indexing expression, which specifies a subscript
|
|
% domain of the (output) table;
|
|
%
|
|
% \noindent
|
|
% {\tt IN} means reading data from the input table;
|
|
%
|
|
% \noindent
|
|
% {\tt OUT} means writing data to the output table;
|
|
%
|
|
% \noindent
|
|
% {\it driver} is a symbolic expression, which specifies the driver used
|
|
% to access the table (for details see Appendix \ref{drivers}, page
|
|
% \pageref{drivers});
|
|
%
|
|
% \noindent
|
|
% {\it arg} is an optional symbolic expression, which is an argument
|
|
% pass\-ed to the table driver. This symbolic expression should not
|
|
% include dummy indices specified in the domain;
|
|
%
|
|
% \noindent
|
|
% {\it set} is the name of an optional simple set called {\it control
|
|
% set}. It can be omitted along with the delimiter {\tt<-};
|
|
%
|
|
% \noindent
|
|
% {\it fld} is a field name. Within square brackets at least one field
|
|
% should be specified. The field name following a parameter name or
|
|
% expression is optional and can be omitted along with the
|
|
% delimiter~{\tt\textasciitilde}, in which case the name of corresponding
|
|
% model object is used as the field name;
|
|
%
|
|
% \noindent
|
|
% {\it par} is a symbolic name of a model parameter;
|
|
%
|
|
% \noindent
|
|
% {\it expr} is a numeric or symbolic expression.
|
|
%
|
|
% \para{Examples}
|
|
%
|
|
% \begin{verbatim}
|
|
% table data IN "CSV" "data.csv": S <- [FROM,TO], d~DISTANCE,
|
|
% c~COST;
|
|
% table result{(f,t) in S} OUT "CSV" "result.csv": f~FROM, t~TO,
|
|
% x[f,t]~FLOW;
|
|
% \end{verbatim}
|
|
%
|
|
% The table statement allows reading data from a table into model
|
|
% objects such as sets and (non-scalar) parameters as well as writing
|
|
% data from the model to a table.
|
|
|
|
\newpage
|
|
|
|
\subsection{Estrutura de tabelas}
|
|
|
|
Uma {\it tabela de dados} é um conjunto (desordenado) de {\it registros}, onde cada
|
|
registro consiste do mesmo número de {\it campos} e cada campo possui um único
|
|
nome simbólico denominado o {\it nome do campo}. Por exemplo:
|
|
|
|
\bigskip
|
|
|
|
\begin{tabular}{@{\hspace*{42mm}}c@{\hspace*{11mm}}c@{\hspace*{10mm}}c
|
|
@{\hspace*{9mm}}c}
|
|
Primeiro&Segundo&&Último\\
|
|
campo&campo&.\ \ .\ \ .&campo\\
|
|
$\downarrow$&$\downarrow$&&$\downarrow$\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{ll@{}}
|
|
Cabeçalho da tabela&$\rightarrow$\\
|
|
Primeiro registro&$\rightarrow$\\
|
|
Segundo registro&$\rightarrow$\\
|
|
\\
|
|
\hfil .\ \ .\ \ .\\
|
|
\\
|
|
Último registro&$\rightarrow$\\
|
|
\end{tabular}
|
|
\begin{tabular}{|l|l|c|c|}
|
|
\hline
|
|
{\tt DE}&{\tt PARA}&{\tt DISTANCIA}&{\tt CUSTO}\\
|
|
\hline
|
|
{\tt Seattle} &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\
|
|
{\tt Seattle} &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\
|
|
{\tt Seattle} &{\tt Topeka} &{\tt 1.8}&{\tt 0.09}\\
|
|
{\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\
|
|
{\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\
|
|
{\tt San-Diego}&{\tt Topeka} &{\tt 1.4}&{\tt 0.07}\\
|
|
\hline
|
|
\end{tabular}
|
|
|
|
|
|
% A {\it data table} is an (unordered) set of {\it records}, where each
|
|
% record consists of the same number of {\it fields}, and each field is
|
|
% provided with a unique symbolic name called the {\it field name}. For
|
|
% example:
|
|
%
|
|
% \bigskip
|
|
%
|
|
% \begin{tabular}{@{\hspace*{42mm}}c@{\hspace*{11mm}}c@{\hspace*{10mm}}c
|
|
% @{\hspace*{9mm}}c}
|
|
% First&Second&&Last\\
|
|
% field&field&.\ \ .\ \ .&field\\
|
|
% $\downarrow$&$\downarrow$&&$\downarrow$\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{ll@{}}
|
|
% Table header&$\rightarrow$\\
|
|
% First record&$\rightarrow$\\
|
|
% Second record&$\rightarrow$\\
|
|
% \\
|
|
% \hfil .\ \ .\ \ .\\
|
|
% \\
|
|
% Last record&$\rightarrow$\\
|
|
% \end{tabular}
|
|
% \begin{tabular}{|l|l|c|c|}
|
|
% \hline
|
|
% {\tt FROM}&{\tt TO}&{\tt DISTANCE}&{\tt COST}\\
|
|
% \hline
|
|
% {\tt Seattle} &{\tt New-York}&{\tt 2.5}&{\tt 0.12}\\
|
|
% {\tt Seattle} &{\tt Chicago} &{\tt 1.7}&{\tt 0.08}\\
|
|
% {\tt Seattle} &{\tt Topeka} &{\tt 1.8}&{\tt 0.09}\\
|
|
% {\tt San-Diego}&{\tt New-York}&{\tt 2.5}&{\tt 0.15}\\
|
|
% {\tt San-Diego}&{\tt Chicago} &{\tt 1.8}&{\tt 0.10}\\
|
|
% {\tt San-Diego}&{\tt Topeka} &{\tt 1.4}&{\tt 0.07}\\
|
|
% \hline
|
|
% \end{tabular}
|
|
|
|
\subsection{Lendo dados de uma tabela de entrada}
|
|
|
|
A sentença tabela de entrada faz a leitura de dados
|
|
da tabela especificada, registro por registro.
|
|
|
|
Uma vez que o registro subsequente foi lido, valores numéricos ou simbólicos
|
|
dos campos, cujos nomes são cercados entre colchetes na sentença table,
|
|
são reunidos em um $n$-tuplo. Se o conjunto de controle é especificado
|
|
na sentença table, este $n$-tuplo é adicionado a ele. Além disso, um valor
|
|
numérico ou simbólico de cada campo associado com um parâmetro do modelo
|
|
é atribuído ao membro do parâmetro identificado por subíndices, que são
|
|
componentes da $n$-tupla que acabou de ser lida.
|
|
|
|
Por exemplo, a seguinte sentença de tabela de entrada:
|
|
|
|
\noindent\hfil
|
|
\verb|table dados IN "...": S <- [DE,PARA], d~DISTANCIA, c~CUSTO;|
|
|
|
|
\noindent
|
|
faz a leitura de valores de quatro campos chamados {\tt DE}, {\tt PARA},
|
|
{\tt DISTANCIA} e {\tt CUSTO} de cada registro da tabela especificada.
|
|
Os valores dos campos {\tt DE} e {\tt PARA} dão um par $(f,t)$, que é
|
|
adicionado ao conjunto de controle {\tt S}. O valor do campo {\tt DISTANCIA} é
|
|
atribuído ao membro do parâmetro ${\tt d}[f,t]$ enquanto que o valor do campo
|
|
{\tt CUSTO} é atribuído ao membro do parâmetro ${\tt c}[f,t]$.
|
|
|
|
Note que a tabela de entrada pode conter campos adicionais cujos nomes
|
|
não sejam especificados na sentença tabela, neste caso, os valores destes
|
|
campos serão ignorados na leitura da tabela.
|
|
|
|
% The input table statement causes reading data from the specified table
|
|
% record by record.
|
|
%
|
|
% Once a next record has been read, numeric or symbolic values of fields,
|
|
% whose names are enclosed in square brackets in the table statement, are
|
|
% gathered into $n$-tuple, and if the control set is specified in the
|
|
% table statement, this $n$-tuple is added to it. Besides, a numeric or
|
|
% symbolic value of each field associated with a model parameter is
|
|
% assigned to the parameter member identified by subscripts, which are
|
|
% components of the $n$-tuple just read.
|
|
%
|
|
% For example, the following input table statement:
|
|
%
|
|
% \noindent\hfil
|
|
% \verb|table data IN "...": S <- [FROM,TO], d~DISTANCE, c~COST;|
|
|
%
|
|
% \noindent
|
|
% causes reading values of four fields named {\tt FROM}, {\tt TO},
|
|
% {\tt DISTANCE}, and {\tt COST} from each record of the specified table.
|
|
% Values of fields {\tt FROM} and {\tt TO} give a pair $(f,t)$, which is
|
|
% added to the control set {\tt S}. The value of field {\tt DISTANCE} is
|
|
% assigned to parameter member ${\tt d}[f,t]$, and the value of field
|
|
% {\tt COST} is assigned to parameter member ${\tt c}[f,t]$.
|
|
%
|
|
% Note that the input table may contain extra fields whose names are not
|
|
% specified in the table statement, in which case values of these fields
|
|
% on reading the table are ignored.
|
|
|
|
\subsection{Escrevendo dados em uma tabela de saída}
|
|
|
|
A sentença tabela de saída gera a escrita de dados na tabela especificada.
|
|
Note que alguns controladores (chamados CSV e xBASE) destroem a tabela de saída
|
|
antes de escrever os dados, i.e., deletam todos os registros existentes.
|
|
|
|
Cada $n$-tupla no domínio do conjunto especificado gera um registro escrito na
|
|
tabela de saída. Os valores dos campos são valores numéricos ou simbólicos
|
|
das expressões correspondentes especificadas na sentença table. Estas
|
|
expressões são avaliadas para cada $n$-tupla no conjunto do domínio,
|
|
portanto, podem incluir índices introduzidos na expressão indexante correspondente.
|
|
|
|
Por exemplo, a seguinte sentença da tabela de saída:
|
|
|
|
\noindent\hfil
|
|
\verb|table resultado{(f,t) in S} OUT "...": f~DE, t~PARA, x[f,t]~FLUXO;|
|
|
|
|
\noindent
|
|
gera a escrita de registros; um registro para cada par $(f,t)$ no conjunto
|
|
{\tt S} para a tabela de saída, onde cada registro consiste de três campos
|
|
chamados {\tt DE}, {\tt PARA} e {\tt FLUXO}. Os valores escritos nos campos
|
|
{\tt DE} e {\tt PARA} são os valores correntes dos índices {\tt f} e {\tt t}.
|
|
O valor escrito no campo {\tt FLUXO} é um valor do membro ${\tt x}[f,t]$
|
|
do correspondente parâmetro ou variável indexada.
|
|
|
|
|
|
% The output table statement causes writing data to the specified table.
|
|
% Note that some drivers (namely, CSV and xBASE) destroy the output table
|
|
% before writing data, i.e. delete all its existing records.
|
|
%
|
|
% Each $n$-tuple in the specified domain set generates one record written
|
|
% to the output table. Values of fields are numeric or symbolic values of
|
|
% corresponding expressions specified in the table statement. These
|
|
% expressions are evaluated for each $n$-tuple in the domain set and,
|
|
% thus, may include dummy indices introduced in the corresponding indexing
|
|
% expression.
|
|
%
|
|
% For example, the following output table statement:
|
|
%
|
|
% \noindent\hfil
|
|
% \verb|table result{(f,t) in S} OUT "...": f~FROM, t~TO, x[f,t]~FLOW;|
|
|
%
|
|
% \noindent
|
|
% causes writing records, by one record for each pair $(f,t)$ in set
|
|
% {\tt S}, to the output table, where each record consists of three
|
|
% fields named {\tt FROM}, {\tt TO}, and {\tt FLOW}. The values written
|
|
% to fields {\tt FROM} and {\tt TO} are current values of dummy indices
|
|
% {\tt f} and {\tt t}, and the value written to field {\tt FLOW} is
|
|
% a value of member ${\tt x}[f,t]$ of corresponding subscripted parameter
|
|
% or variable.
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\chapter{Dados do modelo}
|
|
|
|
Os {\it dados do modelo} includem conjuntos elementares, que são ``valores'' dos
|
|
conjuntos do modelo, e valores numéricos e simbólicos dos parâmetros do modelo.
|
|
|
|
Em MathProg existem duas formas diferentes de fornecer valores aos conjuntos
|
|
e parâmetros do modelo. Uma forma é simplesmente prover os dados necessários
|
|
usando o atributo de atribuição. No entanto, em muitos casos é mais prático separar
|
|
o modelo próprio dos dados particulares necessários para o modelo. Para o último
|
|
caso, em MathProg há uma outra forma, em que a descrição do modelo é dividida
|
|
em duas partes: a seção de modelo e a seção de dados.
|
|
|
|
A {\it seção de modelo} é a principal parte da descrição do modelo. Ela contém
|
|
todas as declarações de todos objetos do modelo, sendo comum a todos problemas
|
|
baseados naquele modelo.
|
|
|
|
A {\it seção de dados} é uma parte opcional da descrição do modelo que contém
|
|
dados específicos para um problema particular.
|
|
|
|
Em MathProg seções de modelo e de dados podem ser localizadas tanto em um arquivo
|
|
de texto ou em dois arquivos de texto separados.
|
|
|
|
1. Se ambas seções de modelo e de dados estão localizados em um arquivo,
|
|
o arquivo é composto como segue:
|
|
|
|
|
|
|
|
\bigskip
|
|
|
|
\noindent\hfil
|
|
\framebox{\begin{tabular}{l}
|
|
{\it sentença}{\tt;}\\
|
|
{\it sentença}{\tt;}\\
|
|
\hfil.\ \ .\ \ .\\
|
|
{\it sentença}{\tt;}\\
|
|
{\tt data;}\\
|
|
{\it bloco de dados}{\tt;}\\
|
|
{\it bloco de dados}{\tt;}\\
|
|
\hfil.\ \ .\ \ .\\
|
|
{\it bloco de dados}{\tt;}\\
|
|
{\tt end;}
|
|
\end{tabular}}
|
|
|
|
|
|
|
|
% {\it Model data} include elemental sets, which are ``values'' of model
|
|
% sets, and numeric and symbolic values of model parameters.
|
|
%
|
|
% In MathProg there are two different ways to saturate model sets and
|
|
% parameters with data. One way is simply providing necessary data using
|
|
% the assign attribute. However, in many cases it is more practical to
|
|
% separate the model itself and particular data needed for the model. For
|
|
% the latter reason in MathProg there is another way, when the model
|
|
% description is divided into two parts: model section and data section.
|
|
%
|
|
% A {\it model section} is a main part of the model description that
|
|
% contains declarations of all model objects and is common for all
|
|
% problems based on that model.
|
|
%
|
|
% A {\it data section} is an optional part of the model description that
|
|
% contains model data specific for a particular problem.
|
|
%
|
|
% In MathProg model and data sections can be placed either in one text
|
|
% file or in two separate text files.
|
|
%
|
|
% 1. If both model and data sections are placed in one file, the file is
|
|
% composed as follows:
|
|
%
|
|
% \bigskip
|
|
%
|
|
% \noindent\hfil
|
|
% \framebox{\begin{tabular}{l}
|
|
% {\it statement}{\tt;}\\
|
|
% {\it statement}{\tt;}\\
|
|
% \hfil.\ \ .\ \ .\\
|
|
% {\it statement}{\tt;}\\
|
|
% {\tt data;}\\
|
|
% {\it data block}{\tt;}\\
|
|
% {\it data block}{\tt;}\\
|
|
% \hfil.\ \ .\ \ .\\
|
|
% {\it data block}{\tt;}\\
|
|
% {\tt end;}
|
|
% \end{tabular}}
|
|
|
|
% 2. Se a seção de modelo e dados são posicionados em dois arquivos separados, os
|
|
% arquivos são compostos como segue:
|
|
|
|
\newpage
|
|
|
|
2. Se a seção de modelo e dados são posicionados em dois arquivos separados, os
|
|
arquivos são compostos como segue:
|
|
|
|
\bigskip
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{@{}c@{}}
|
|
\framebox{\begin{tabular}{l}
|
|
{\it sentença}{\tt;}\\
|
|
{\it sentença}{\tt;}\\
|
|
\hfil.\ \ .\ \ .\\
|
|
{\it sentença}{\tt;}\\
|
|
{\tt end;}\\
|
|
\end{tabular}}\\
|
|
\\\\Arquivo de modelo\\
|
|
\end{tabular}
|
|
\hspace{32pt}
|
|
\begin{tabular}{@{}c@{}}
|
|
\framebox{\begin{tabular}{l}
|
|
{\tt data;}\\
|
|
{\it bloco de dados}{\tt;}\\
|
|
{\it bloco de dados}{\tt;}\\
|
|
\hfil.\ \ .\ \ .\\
|
|
{\it bloco de dados}{\tt;}\\
|
|
{\tt end;}\\
|
|
\end{tabular}}\\
|
|
\\Arquivo de dados\\
|
|
\end{tabular}
|
|
|
|
\bigskip
|
|
|
|
Nota: Se a seção de dados é posicionada em um arquivo separado, a palavra-chave
|
|
{\tt data} é opcional e pode ser omitida juntamente como o ponto e vírgula que a segue.
|
|
|
|
|
|
% \bigskip
|
|
%
|
|
% \noindent\hfil
|
|
% \begin{tabular}{@{}c@{}}
|
|
% \framebox{\begin{tabular}{l}
|
|
% {\it statement}{\tt;}\\
|
|
% {\it statement}{\tt;}\\
|
|
% \hfil.\ \ .\ \ .\\
|
|
% {\it statement}{\tt;}\\
|
|
% {\tt end;}\\
|
|
% \end{tabular}}\\
|
|
% \\\\Model file\\
|
|
% \end{tabular}
|
|
% \hspace{32pt}
|
|
% \begin{tabular}{@{}c@{}}
|
|
% \framebox{\begin{tabular}{l}
|
|
% {\tt data;}\\
|
|
% {\it data block}{\tt;}\\
|
|
% {\it data block}{\tt;}\\
|
|
% \hfil.\ \ .\ \ .\\
|
|
% {\it data block}{\tt;}\\
|
|
% {\tt end;}\\
|
|
% \end{tabular}}\\
|
|
% \\Data file\\
|
|
% \end{tabular}
|
|
%
|
|
% \bigskip
|
|
%
|
|
% Note: If the data section is placed in a separate file, the keyword
|
|
% {\tt data} is optional and may be omitted along with the semicolon that
|
|
% follows it.
|
|
|
|
|
|
\section{Programando a seção de dados}
|
|
|
|
A {\it seção de dados} é uma sequência de blocos de dados em vários formatos
|
|
e são discutidos nas seções seguintes. A ordem na qual os blocos de dados
|
|
seguem na seção de dados pode ser arbitrária, portanto, não precisa ser
|
|
necessariamente a mesma ordem que seguem os elementos correspondentes
|
|
da seção de modelo.
|
|
|
|
As regras para programar a seção de dados são comumente as mesmas que as regras
|
|
de \linebreak programar a descrição do modelo (ver Seção \ref{coding}, página
|
|
\pageref{coding}), i.e., blocos de dados são compostos com unidades léxicas
|
|
básicas, como nomes simbólicos, literais numéricos e de cadeia,
|
|
palavras-chave, \linebreak delimitadores e comentários. No entanto, por conveniência
|
|
e para melhorar legibilidade, há um desvio da regra comum: se um literal
|
|
de cadeia consiste unicamente de caracteres alfanuméricos (incluindo
|
|
o caractere sublinhado), os sinais {\tt+} e {\tt-} e/ou o ponto decimal,
|
|
ele pode ser programado sem aspas limitadoras (simples ou duplas).
|
|
|
|
Todo material numérico e simbólico provido na seção de dados é programado
|
|
na forma de números e símbolos, i.e., diferentemente da seção de modelo,
|
|
não são permitidas expressões na seção de dados. Apesar disso, os sinais
|
|
{\tt+} e {\tt-} podem preceder literais numéricos para permitir a programação
|
|
de quantidades numéricas com sinais. Neste caso não deve haver caractere de
|
|
espaço em branco entre o sinal e o literal numérico seguinte (se houver
|
|
pelo menos uma espaço em branco, o sinal e o literal numérico seguinte são
|
|
reconhecidos como duas unidades léxicas diferentes).
|
|
|
|
|
|
|
|
% The {\it data section} is a sequence of data blocks in various formats,
|
|
% which are discussed in following sections. The order, in which data
|
|
% blocks follow in the data section, may be arbitrary, not necessarily
|
|
% the same, in which corresponding model objects follow in the model
|
|
% section.
|
|
%
|
|
% The rules of coding the data section are commonly the same as the rules
|
|
% of coding the model description (see Section \ref{coding}, page
|
|
% \pageref{coding}), i.e. data blocks are composed from basic lexical
|
|
% units such as symbolic names, numeric and string literals, keywords,
|
|
% delimiters, and comments. However, for the sake of convenience and for
|
|
% improving readability there is one deviation from the common rule: if
|
|
% a string literal consists of only alphanumeric characters (including
|
|
% the underscore character), the signs {\tt+} and {\tt-}, and/or the
|
|
% decimal point, it may be coded without bordering by (single or double)
|
|
% quotes.
|
|
%
|
|
% All numeric and symbolic material provided in the data section is coded
|
|
% in the form of numbers and symbols, i.e. unlike the model section
|
|
% no expressions are allowed in the data section. Nevertheless, the signs
|
|
% {\tt+} and {\tt-} can precede numeric literals to allow coding signed
|
|
% numeric quantities, in which case there should be no white-space
|
|
% characters between the sign and following numeric literal (if there is
|
|
% at least one white-space, the sign and following numeric literal are
|
|
% recognized as two different lexical units).
|
|
|
|
\newpage
|
|
|
|
\section{Bloco de dados set}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][44pt]{468pt}{
|
|
\hspace{6pt} {\tt set} {\it nome} {\tt,} {\it registro} {\tt,} \dots
|
|
{\tt,} {\it registro} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt set} {\it nome} {\tt[} {\it símbolo} {\tt,} \dots
|
|
{\tt,} {\it símbolo} {\tt]} {\tt,} {\it registro} {\tt,} \dots {\tt,}
|
|
{\it registro} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it nome} é um nome simbólico do conjunto;
|
|
|
|
\noindent
|
|
{\it símbolo}, \dots, {\it símbolo} são subíndices que especificam
|
|
um membro particular do conjunto \linebreak(se o conjunto é uma matriz, i.e.,
|
|
um conjunto de conjuntos);
|
|
|
|
\noindent
|
|
{\it registro}, \dots, {\it registro} são registros.
|
|
|
|
\noindent
|
|
As vírgulas que precedem os registros podem ser omitidas.
|
|
|
|
\para{Registros}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\begin{description}
|
|
\item[{\tt :=}]\hspace*{0pt}\\
|
|
é um elemento de atribuição de registro não-significativo que pode ser usado
|
|
livremente para melhorar a legibilidade;
|
|
\item[{\tt(} {\it fatia} {\tt)}]\hspace*{0pt}\\
|
|
especifica uma fatia;
|
|
\item[{\it dados-simples}]\hspace*{0pt}\\
|
|
especifica os dados do conjunto em formato simples;
|
|
\item[{\tt:} {\it dados matriciais}]\hspace*{0pt}\\
|
|
especifica os dados do conjunto em formato de matriz;
|
|
\item[{\tt(tr)} {\tt:} {\it dados matriciais}]\hspace*{0pt}\\
|
|
especifica os dados do conjunto em formato de matriz transposta.
|
|
(Neste caso, os dois pontos que seguem a palavra-chave {\tt(tr)} podem ser omitidos).
|
|
\end{description}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
set mes := Jan Fev Mar Abr Mai Jun;
|
|
set mes "Jan", "Fev", "Mar", "Abr", "Mai", "Jun";
|
|
set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4);
|
|
set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 3 4;
|
|
set A[3,'Mar'] : 1 2 3 4 :=
|
|
1 - + - -
|
|
2 - + + -
|
|
3 + - - +
|
|
4 - + - + ;
|
|
set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1);
|
|
set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1;
|
|
set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1);
|
|
set B := (1,*,*) : 1 2 3 :=
|
|
1 + - -
|
|
2 - + +
|
|
3 - + -
|
|
(2,*,*) : 1 2 3 :=
|
|
1 + - +
|
|
2 - - -
|
|
3 + - - ;
|
|
\end{verbatim}
|
|
|
|
\noindent(Nestes exemplos {\tt mes} é um conjunto simples de singletos,
|
|
{\tt A} é uma matriz 2-dimensional de duplas e {\tt B} é um conjunto
|
|
simples de triplas. Os blocos de dados para o mesmo conjunto são equivalentes
|
|
no sentido que especificam os mesmos dados em formatos distintos.)
|
|
|
|
O {\it bloco de dados do conjunto} é usado para especificar um conjunto elementar
|
|
completo que é atribuído a um conjunto (se é um conjunto simples) ou a um de
|
|
seus membros (se o conjunto é uma matriz de conjuntos).\footnote{Há uma outra forma
|
|
de especificar dados para um conjunto simples com dados para os parâmetros.
|
|
Esta questão é discutida na próxima seção.}
|
|
|
|
Blocos de dados podem ser especificados somente para conjuntos não-calculáveis,
|
|
i.e., para \linebreak conjuntos que possuem o atributo de atribuição ({\tt:=})
|
|
na sentença set correspondente.
|
|
|
|
Se o conjunto é um conjunto simples, somente seus nomes simbólicos devem ser
|
|
especificados no cabeçalho do bloco de dados. Caso contrário, se o conjunto
|
|
é uma matriz $n$-dimensional, seus nomes simbólicos devem ser fornecidos com
|
|
uma lista completa de subíndices separados por vírgulas e cercados em colchetes
|
|
para especificar um membro particular da matriz de conjuntos. O número de
|
|
subíndices deve ser igual ao da dimensão da matriz de conjuntos, onde
|
|
cada subíndice deve ser um número ou um símbolo.
|
|
|
|
Um conjunto elementar definido no bloco de dados é programado como uma sequência
|
|
de \linebreak registros descritos abaixo.\footnote{{\it Registro} é simplesmente
|
|
um termo técnico. Não significa que os mesmos possuem qualquer formato
|
|
especial.}
|
|
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][44pt]{468pt}{
|
|
% \hspace{6pt} {\tt set} {\it name} {\tt,} {\it record} {\tt,} \dots
|
|
% {\tt,} {\it record} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt set} {\it name} {\tt[} {\it symbol} {\tt,} \dots
|
|
% {\tt,} {\it symbol} {\tt]} {\tt,} {\it record} {\tt,} \dots {\tt,}
|
|
% {\it record} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it name} is a symbolic name of the set;
|
|
%
|
|
% \noindent
|
|
% {\it symbol}, \dots, {\it symbol} are subscripts, which specify
|
|
% a particular member of the set (if the set is an array, i.e. a set of
|
|
% sets);
|
|
%
|
|
% \noindent
|
|
% {\it record}, \dots, {\it record} are data records.
|
|
%
|
|
% \noindent
|
|
% Commae preceding data records may be omitted.
|
|
%
|
|
% \para{Data records}
|
|
%
|
|
% \vspace*{-8pt}
|
|
%
|
|
% \begin{description}
|
|
% \item[{\tt :=}]\hspace*{0pt}\\
|
|
% is a non-significant data record, which may be used freely to improve
|
|
% readability;
|
|
% \item[{\tt(} {\it slice} {\tt)}]\hspace*{0pt}\\
|
|
% specifies a slice;
|
|
% \item[{\it simple-data}]\hspace*{0pt}\\
|
|
% specifies set data in the simple format;
|
|
% \item[{\tt:} {\it matrix-data}]\hspace*{0pt}\\
|
|
% specifies set data in the matrix format;
|
|
% \item[{\tt(tr)} {\tt:} {\it matrix-data}]\hspace*{0pt}\\
|
|
% specifies set data in the transposed matrix format. (In this case the
|
|
% colon following the keyword {\tt(tr)} may be omitted.)
|
|
% \end{description}
|
|
%
|
|
% \vspace*{-8pt}
|
|
%
|
|
% \para{Examples}
|
|
%
|
|
% \begin{verbatim}
|
|
% set month := Jan Feb Mar Apr May Jun;
|
|
% set month "Jan", "Feb", "Mar", "Apr", "May", "Jun";
|
|
% set A[3,Mar] := (1,2) (2,3) (4,2) (3,1) (2,2) (4,4) (3,4);
|
|
% set A[3,'Mar'] := 1 2 2 3 4 2 3 1 2 2 4 4 3 4;
|
|
% set A[3,'Mar'] : 1 2 3 4 :=
|
|
% 1 - + - -
|
|
% 2 - + + -
|
|
% 3 + - - +
|
|
% 4 - + - + ;
|
|
% set B := (1,2,3) (1,3,2) (2,3,1) (2,1,3) (1,2,2) (1,1,1) (2,1,1);
|
|
% set B := (*,*,*) 1 2 3, 1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1;
|
|
% set B := (1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1);
|
|
% set B := (1,*,*) : 1 2 3 :=
|
|
% 1 + - -
|
|
% 2 - + +
|
|
% 3 - + -
|
|
% (2,*,*) : 1 2 3 :=
|
|
% 1 + - +
|
|
% 2 - - -
|
|
% 3 + - - ;
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent(In these examples {\tt month} is a simple set of singlets,
|
|
% {\tt A} is a 2-dimensional array of doublets, and {\tt B} is a simple
|
|
% set of triplets. Data blocks for the same set are equivalent in the
|
|
% sense that they specify the same data in different formats.)
|
|
%
|
|
% The {\it set data block} is used to specify a complete elemental set,
|
|
% which is assigned to a set (if it is a simple set) or one of its
|
|
% members (if the set is an array of sets).\footnote{There is another way
|
|
% to specify data for a simple set along with data for parameters. This
|
|
% feature is discussed in the next section.}
|
|
%
|
|
% Data blocks can be specified only for non-computable sets, i.e. for
|
|
% sets, which have no assign attribute ({\tt:=}) in the corresponding set
|
|
% statements.
|
|
%
|
|
% If the set is a simple set, only its symbolic name should be specified
|
|
% in the header of the data block. Otherwise, if the set is a
|
|
% $n$-dimensional array, its symbolic name should be provided with a
|
|
% complete list of subscripts separated by commae and enclosed in square
|
|
% brackets to specify a particular member of the set array. The number of
|
|
% subscripts should be the same as the dimension of the set array, where
|
|
% each subscript should be a number or symbol.
|
|
%
|
|
% An elemental set defined in the set data block is coded as a sequence
|
|
% of data records described below.\footnote{{\it Data record} is simply a
|
|
% technical term. It does not mean that data records have any special
|
|
% formatting.}
|
|
|
|
|
|
\subsection{Registro de atribuição de dados}
|
|
|
|
O {\it registro de atribuição de dados} ({\tt:=}) é um elemento não-significante.
|
|
Ele pode ser usado para melhorar a legibilidade de blocos de dados.
|
|
|
|
% The {\it assign data record} ({\tt:=}) is a non-signficant element.
|
|
% It may be used for improving readability of data blocks.
|
|
|
|
\subsection{Registro em fatia de dados}
|
|
|
|
O {\it registro em fatia de dados} é um registro de controle que especifica
|
|
uma {\it fatia} do conjunto elementar definido no bloco de dados. Ele possui
|
|
a seguinte forma sintática:
|
|
$$\mbox{{\tt(} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt)}}$$
|
|
onde $s_1$, $s_2$, \dots, $s_n$ são componentes da fatia.
|
|
|
|
Cada componente da fatia pode ser um número, símbolo ou asterisco
|
|
({\tt*}). O número de \linebreak componentes na fatia deve ser o mesmo da
|
|
dimensão $n$-tuplas do conjunto elementar a ser definido. Por exemplo,
|
|
se o conjunto elementar contém 4-tuplas (quádruplas), a fatia deve ter
|
|
quatro \linebreak componentes. O número de asteriscos na fatia denomina a
|
|
{\it dimensão da fatia}.
|
|
|
|
O efeito de usar fatias é o seguinte: se uma fatia $m$-dimensional
|
|
(i.e., uma fatia contendo $m$ asteriscos) é especificada no bloco de dados,
|
|
todos registros subsequentes devem especificar tuplas de dimensão~$m$.
|
|
Sempre que uma $m$-tupla é encontrada, cada asterisco da fatia é substituído
|
|
pelos componentes correspondentes da $m$-tupla, o que resulta na
|
|
$n$-tupla, que é incluída no conjunto \linebreak elementar a ser definido.
|
|
Por exemplo, se a fatia $(a,*,1,2,*)$ está vigente e a dupla
|
|
$(3,b)$ é encontrada no registro subsequente, a 5-tupla resultante a ser incluída
|
|
no conjunto elementar é $(a,3,1,2,b)$.
|
|
|
|
Se a fatia não possui asteriscos, ela própria define uma $n$-tupla completa
|
|
que é incluída no conjunto elementar.
|
|
|
|
Uma vez especificada uma fatia, a mesma está vigente até que apareça uma nova
|
|
fatia ou até que se encontre o fim do bloco de dados. Note que se uma fatia
|
|
não é especificada no bloco de dados, assume-se uma cujos componentes são
|
|
asteriscos em todas as posições.
|
|
|
|
|
|
% The {\it slice data record} is a control record, which specifies a
|
|
% {\it slice} of the elemental set defined in the data block. It has the
|
|
% following syntactic form:
|
|
% $$\mbox{{\tt(} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt)}}$$
|
|
% where $s_1$, $s_2$, \dots, $s_n$ are components of the slice.
|
|
%
|
|
% Each component of the slice can be a number or symbol or the asterisk
|
|
% ({\tt*}). The number of components in the slice should be the same as
|
|
% the dimension of $n$-tuples in the elemental set to be defined. For
|
|
% instance, if the elemental set contains 4-tuples (quadruplets), the
|
|
% slice should have four components. The number of asterisks in the slice
|
|
% is called the {\it slice dimension}.
|
|
%
|
|
% The effect of using slices is the following. If a $m$-dimensional slice
|
|
% (i.e. a slice having $m$ asterisks) is specified in the data block, all
|
|
% subsequent data records should specify tuples of the dimension~$m$.
|
|
% Whenever a $m$-tuple is encountered, each asterisk in the slice is
|
|
% replaced by corresponding components of the $m$-tuple that gives the
|
|
% resultant $n$-tuple, which is included in the elemental set to be
|
|
% defined. For example, if the slice $(a,*,1,2,*)$ is in effect, and
|
|
% 2-tuple $(3,b)$ is encountered in a subsequent data record, the
|
|
% resultant 5-tuple included in the elemental set is $(a,3,1,2,b)$.
|
|
%
|
|
% The slice having no asterisks itself defines a complete $n$-tuple,
|
|
% which is included in the elemental set.
|
|
%
|
|
% Being once specified the slice effects until either a new slice or the
|
|
% end of data block is encountered. Note that if no slice is specified in
|
|
% the data block, one, components of which are all asterisks, is assumed.
|
|
|
|
\subsection{Registro simples}
|
|
|
|
O {\it registro simples} define uma $n$-tupla em um formato simples
|
|
e possui a seguinte forma sintática:
|
|
$$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$}$$
|
|
onde $t_1$, $t_2$, \dots, $t_n$ são componentes da $n$-tupla. Cada
|
|
componente pode ser um número ou um símbolo. As vírgulas entre os componentes
|
|
são opcionais e podem ser omitidas.
|
|
|
|
% The {\it simple data record} defines one $n$-tuple in a simple format
|
|
% and has the following syntactic form:
|
|
% $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$}$$
|
|
% where $t_1$, $t_2$, \dots, $t_n$ are components of the $n$-tuple. Each
|
|
% component can be a number or symbol. Commae between components are
|
|
% optional and may be omitted.
|
|
|
|
\subsection{Registro de matriz}
|
|
|
|
O {\it registro de matriz} define diversas 2-tuplas (duplas) em
|
|
um formato matricial e possui a seguinte forma sintática:
|
|
$$\begin{array}{cccccc}
|
|
\mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
|
|
r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
|
|
r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
|
|
\multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
|
|
r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
|
|
\end{array}$$
|
|
onde $r_1$, $r_2$, \dots, $r_m$ são números e/ou símbolos
|
|
que correspondem a linhas da matriz; $c_1$, $c_2$, \dots, $c_n$ são
|
|
números e/ou símbolos que correspondem a colunas da matriz, $a_{11}$,
|
|
$a_{12}$, \dots, $a_{mn}$ são elementos da matriz, que podem ser tanto
|
|
{\tt+} como {\tt-}. (Neste registro, o delimitador {\tt:} que precede a
|
|
lista de colunas e o delimitador {\tt:=} que segue após a lista de colunas,
|
|
não podem ser omitidos.)
|
|
|
|
Cada elemento $a_{ij}$ do bloco de dados matricial (onde $1\leq i\leq m$,
|
|
$1\leq j\leq n$) correspondem a 2-tuplas $(r_i,c_j)$. Se $a_{ij}$ é o
|
|
sinal mais ({\tt+}), a 2-tupla correspondente (ou uma $n$-tupla maior, se uma
|
|
fatia é usada) é incluída no conjunto elementar. Caso contrário, se $a_{ij}$ é o
|
|
sinal menos ({\tt-}), aquela 2-tupla não é incluída no conjunto elementar.
|
|
|
|
Uma vez que o registro de matriz define 2-tuplas, tanto o conjunto elementar
|
|
quanto a fatia vigente devem ser 2-dimensional.
|
|
|
|
\newpage
|
|
|
|
\subsection{Registro de matriz transposta}
|
|
|
|
O {\it registro de matriz transposta} possui a seguinte forma sintática:
|
|
$$\begin{array}{cccccc}
|
|
\mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
|
|
r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
|
|
r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
|
|
\multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
|
|
r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
|
|
\end{array}$$
|
|
(Neste caso, o delimitador {\tt:} que segue a palavra-chave {\tt(tr)} é
|
|
opcional e pode ser omitido.)
|
|
|
|
Este registro é completamente análogo ao registro de matriz (ver
|
|
anteriormente) com a única exceção de que neste caso, cada elemento $a_{ij}$ da
|
|
matriz passa a corresponder a 2-tupla $(c_j,r_i)$ ao invés de $(r_i,c_j)$.
|
|
|
|
Uma vez especificado, o indicador {\tt(tr)} tem alcance em todos registros
|
|
subsequentes até que se encontre outra fatia ou o fim do bloco de dados.
|
|
|
|
|
|
% The {\it transposed matrix data record} has the following syntactic
|
|
% form:
|
|
% $$\begin{array}{cccccc}
|
|
% \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
|
|
% r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
|
|
% r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
|
|
% \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
|
|
% r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
|
|
% \end{array}$$
|
|
% (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is
|
|
% optional and may be omitted.)
|
|
%
|
|
% This data record is completely analogous to the matrix data record (see
|
|
% above) with only exception that in this case each element $a_{ij}$ of
|
|
% the matrix corresponds to 2-tuple $(c_j,r_i)$ rather than $(r_i,c_j)$.
|
|
%
|
|
% Being once specified the {\tt(tr)} indicator affects all subsequent
|
|
% data records until either a slice or the end of data block is
|
|
% encountered.
|
|
|
|
\section{Bloco de dados de parâmetro}
|
|
|
|
\noindent
|
|
\framebox[468pt][l]{
|
|
\parbox[c][88pt]{468pt}{
|
|
\hspace{6pt} {\tt param} {\it nome} {\tt,} {\it registro} {\tt,} \dots
|
|
{\tt,} {\it registro} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt param} {\it nome} {\tt default} {\it valor} {\tt,}
|
|
{\it registro} {\tt,} \dots {\tt,} {\it registro} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt param} {\tt:} {\it dados-tabulação} {\tt;}
|
|
|
|
\medskip
|
|
|
|
\hspace{6pt} {\tt param} {\tt default} {\it valor} {\tt:}
|
|
{\it dados-tabulação} {\tt;}
|
|
}}
|
|
|
|
\medskip
|
|
|
|
\noindent
|
|
{\it nome} é um nome simbólico do parâmetro;
|
|
|
|
\noindent
|
|
{\it valor} é um valor opcional padrão do parâmetro;
|
|
|
|
\noindent
|
|
{\it registro}, \dots, {\it registro} são registros;
|
|
|
|
\noindent
|
|
{\it dados-tabulação} especifica os dados do parâmetro em formato tabulação.
|
|
|
|
\noindent
|
|
As vírgulas que precedem os registros podem ser omitidas.
|
|
|
|
\para{Registros}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\begin{description}
|
|
\item[{\tt :=}]\hspace*{0pt}\\
|
|
é um elemento de atribuição de registro não-significativo que pode ser usado
|
|
livremente para melhorar a legibilidade;
|
|
\item[{\tt[} {\it fatia} {\tt]}]\hspace*{0pt}\\
|
|
especifica uma fatia;
|
|
\item[{\it dados-planos}]\hspace*{0pt}\\
|
|
especifica os dados do parâmetro em formato simples;
|
|
\item[{\tt:} {\it dados-tabulares}]\hspace*{0pt}\\
|
|
especifica dados do parâmetro em formato tabular;
|
|
\item[{\tt(tr)} {\tt:} {\it dados-tabulares}]\hspace*{0pt}\\
|
|
especifica dados do parâmetro no formato tabular transposto.
|
|
(Neste caso, os dois pontos que seguem a palavra-chave {\tt(tr)} podem ser omitidos).
|
|
\end{description}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\para{Exemplos}
|
|
|
|
\begin{verbatim}
|
|
param T := 4;
|
|
param mes := 1 Jan 2 Fev 3 Mar 4 Abr 5 Mai;
|
|
param mes := [1] 'Jan', [2] 'Fev', [3] 'Mar', [4] 'Abr', [5] 'Mai';
|
|
param estoque_inicial := ferro 7.32 niquel 35.8;
|
|
param estoque_inicial [*] ferro 7.32, niquel 35.8;
|
|
param custo [ferro] .025 [niquel] .03;
|
|
param valor := ferro -.1, niquel .02;
|
|
param : estoque_inicial custo valor :=
|
|
ferro 7.32 .025 -.1
|
|
niquel 35.8 .03 .02 ;
|
|
param : insumo : estoque_inicial custo valor :=
|
|
ferro 7.32 .025 -.1
|
|
niquel 35.8 .03 .02 ;
|
|
param demanda default 0 (tr)
|
|
: FRA DET LAN WIN STL FRE LAF :=
|
|
chapa 300 . 100 75 . 225 250
|
|
bobina 500 750 400 250 . 850 500
|
|
placa 100 . . 50 200 . 250 ;
|
|
param custo_transporte :=
|
|
[*,*,chapa]: FRA DET LAN WIN STL FRE LAF :=
|
|
GARY 30 10 8 10 11 71 6
|
|
CLEV 22 7 10 7 21 82 13
|
|
PITT 19 11 12 10 25 83 15
|
|
[*,*,bobina]: FRA DET LAN WIN STL FRE LAF :=
|
|
GARY 39 14 11 14 16 82 8
|
|
CLEV 27 9 12 9 26 95 17
|
|
PITT 24 14 17 13 28 99 20
|
|
[*,*,placa]: FRA DET LAN WIN STL FRE LAF :=
|
|
GARY 41 15 12 16 17 86 8
|
|
CLEV 29 9 13 9 28 99 18
|
|
PITT 26 14 17 13 31 104 20 ;
|
|
\end{verbatim}
|
|
|
|
O {\it bloco de dados do parâmetro} é usado para especificar dados
|
|
completos para um parâmetro (ou parâmetros, se os dados são especificados
|
|
no formato tabulação).
|
|
|
|
Os blocos de dados podem ser especificados apenas para parâmetros não-calculáveis, i.e.,
|
|
para parâmetros que não possuem o atributo de atribuição ({\tt:=}) nas
|
|
sentenças parameter correspondentes.
|
|
|
|
Os dados definidos no bloco de dados do parâmetro são programados como uma sequência
|
|
de registros descritos em seguida. Adicionalmente, o bloco de dados pode vir com
|
|
o atributo opcional {\tt default}, que especifica um valor numérico ou simbólico
|
|
padrão do parâmetro (ou parâmetros). Este valor padrão é atribuído ao parâmetro ou
|
|
a seus membros quando não se definem valores apropriados no bloco de dados do
|
|
parâmetro. O atributo {\tt default} não pode ser usado se ele já tiver sido
|
|
especificado na sentença parameter correspondente.
|
|
|
|
|
|
% \noindent
|
|
% \framebox[468pt][l]{
|
|
% \parbox[c][88pt]{468pt}{
|
|
% \hspace{6pt} {\tt param} {\it name} {\tt,} {\it record} {\tt,} \dots
|
|
% {\tt,} {\it record} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt param} {\it name} {\tt default} {\it value} {\tt,}
|
|
% {\it record} {\tt,} \dots {\tt,} {\it record} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt param} {\tt:} {\it tabbing-data} {\tt;}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \hspace{6pt} {\tt param} {\tt default} {\it value} {\tt:}
|
|
% {\it tabbing-data} {\tt;}
|
|
% }}
|
|
%
|
|
% \medskip
|
|
%
|
|
% \noindent
|
|
% {\it name} is a symbolic name of the parameter;
|
|
%
|
|
% \noindent
|
|
% {\it value} is an optional default value of the parameter;
|
|
%
|
|
% \noindent
|
|
% {\it record}, \dots, {\it record} are data records;
|
|
%
|
|
% \noindent
|
|
% {\it tabbing-data} specifies parameter data in the tabbing format.
|
|
%
|
|
% \noindent
|
|
% Commae preceding data records may be omitted.
|
|
%
|
|
% \para{Data records}
|
|
%
|
|
% \vspace*{-8pt}
|
|
%
|
|
% \begin{description}
|
|
% \item[{\tt :=}]\hspace*{0pt}\\
|
|
% is a non-significant data record, which may be used freely to improve
|
|
% readability;
|
|
% \item[{\tt[} {\it slice} {\tt]}]\hspace*{0pt}\\
|
|
% specifies a slice;
|
|
% \item[{\it plain-data}]\hspace*{0pt}\\
|
|
% specifies parameter data in the plain format;
|
|
% \item[{\tt:} {\it tabular-data}]\hspace*{0pt}\\
|
|
% specifies parameter data in the tabular format;
|
|
% \item[{\tt(tr)} {\tt:} {\it tabular-data}]\hspace*{0pt}\\
|
|
% specifies set data in the transposed tabular format. (In this case the
|
|
% colon following the keyword {\tt(tr)} may be omitted.)
|
|
% \end{description}
|
|
%
|
|
% \vspace*{-8pt}
|
|
%
|
|
% \para{Examples}
|
|
%
|
|
% \begin{verbatim}
|
|
% param T := 4;
|
|
% param month := 1 Jan 2 Feb 3 Mar 4 Apr 5 May;
|
|
% param month := [1] 'Jan', [2] 'Feb', [3] 'Mar', [4] 'Apr', [5] 'May';
|
|
% param init_stock := iron 7.32 nickel 35.8;
|
|
% param init_stock [*] iron 7.32, nickel 35.8;
|
|
% param cost [iron] .025 [nickel] .03;
|
|
% param value := iron -.1, nickel .02;
|
|
% param : init_stock cost value :=
|
|
% iron 7.32 .025 -.1
|
|
% nickel 35.8 .03 .02 ;
|
|
% param : raw : init stock cost value :=
|
|
% iron 7.32 .025 -.1
|
|
% nickel 35.8 .03 .02 ;
|
|
% param demand default 0 (tr)
|
|
% : FRA DET LAN WIN STL FRE LAF :=
|
|
% bands 300 . 100 75 . 225 250
|
|
% coils 500 750 400 250 . 850 500
|
|
% plate 100 . . 50 200 . 250 ;
|
|
% param trans_cost :=
|
|
% [*,*,bands]: FRA DET LAN WIN STL FRE LAF :=
|
|
% GARY 30 10 8 10 11 71 6
|
|
% CLEV 22 7 10 7 21 82 13
|
|
% PITT 19 11 12 10 25 83 15
|
|
% [*,*,coils]: FRA DET LAN WIN STL FRE LAF :=
|
|
% GARY 39 14 11 14 16 82 8
|
|
% CLEV 27 9 12 9 26 95 17
|
|
% PITT 24 14 17 13 28 99 20
|
|
% [*,*,plate]: FRA DET LAN WIN STL FRE LAF :=
|
|
% GARY 41 15 12 16 17 86 8
|
|
% CLEV 29 9 13 9 28 99 18
|
|
% PITT 26 14 17 13 31 104 20 ;
|
|
% \end{verbatim}
|
|
%
|
|
% The {\it parameter data block} is used to specify complete data for a
|
|
% parameter (or parameters, if data are specified in the tabbing format).
|
|
%
|
|
% Data blocks can be specified only for non-computable parameters, i.e.
|
|
% for parameters, which have no assign attribute ({\tt:=}) in the
|
|
% corresponding parameter statements.
|
|
%
|
|
% Data defined in the parameter data block are coded as a sequence of
|
|
% data records described below. Additionally the data block can be
|
|
% provided with the optional {\tt default} attribute, which specifies a
|
|
% default numeric or symbolic value of the parameter (parameters). This
|
|
% default value is assigned to the parameter or its members when
|
|
% no appropriate value is defined in the parameter data block. The
|
|
% {\tt default} attribute cannot be used, if it is already specified in
|
|
% the corresponding parameter statement.
|
|
|
|
\subsection{Registro de atribuição}
|
|
|
|
O {\it registro de atribuição} ({\tt:=}) é um elemento não-significativo.
|
|
Ele pode ser usado para melhorar a legibilidade dos blocos de dados;
|
|
|
|
% The {\it assign data record} ({\tt:=}) is a non-signficant element.
|
|
% It may be used for improving readability of data blocks.
|
|
|
|
\subsection{Registro em fatia}
|
|
|
|
O {\it registro em fatia} é um registro de controle que especifica uma
|
|
{\it fatia} da matriz do parâmetro. Ele tem a seguinte forma sintática:
|
|
$$\mbox{{\tt[} $s_1$ {\tt,} $s_2$ {\tt,} \dots {\tt,} $s_n$ {\tt]}}$$
|
|
onde $s_1$, $s_2$, \dots, $s_n$ são componentes da fatia.
|
|
|
|
Cada componente da fatia pode ser um número, símbolo ou asterisco
|
|
({\tt*}). O número de componentes na fatia deve ser o mesmo da
|
|
dimensão $n$-tuplas do parâmetro. Por exemplo,
|
|
se o parâmetro é uma matriz 4-dimensional, a fatia deve ter
|
|
quatro componentes. O número de \linebreak asteriscos na fatia denomina a
|
|
{\it dimensão da fatia}.
|
|
|
|
O efeito de usar fatias é o seguinte: se uma fatia $m$-dimensional
|
|
(i.e., uma fatia contendo $m$ asteriscos) é especificada no bloco de dados,
|
|
todos registros subsequentes devem especificar os subíndices do membros do
|
|
parâmetro, como se o parâmetro fosse $m$-dimensional, não $n$-dimensional.
|
|
|
|
Sempre que $m$ subíndices são encontrados, cada asterisco da fatia é substituído
|
|
pelos \linebreak componentes correspondentes que dão $n$ subíndices, que definem o
|
|
membro corrente do parâmetro.
|
|
Por exemplo, se a fatia $(a,*,1,2,*)$ está vigente e os subíndices 3 e
|
|
$b$ são encontradas no \linebreak registro subsequente, a lista completa de subíndices
|
|
usada para escolher o membro do parâmetro é $(a,3,1,2,b)$.
|
|
|
|
|
|
É permitido especificar uma fatia que não tenha asteriscos. Tal fatia, em si
|
|
própria, define uma lista completa de subíndice, em cujo caso o próximo
|
|
registro deve definir apenas um único valor do membro correspondentes do parâmetro.
|
|
|
|
Uma vez especificada uma fatia, a mesma está vigente até que apareça uma nova
|
|
fatia ou até que se encontre o fim do bloco de dados. Note que se uma fatia
|
|
não é especificada no bloco de dados, assume-se uma cujos componentes são
|
|
asteriscos em todas as posições.
|
|
|
|
|
|
\subsection{Registro plano}
|
|
|
|
O {\it registro plano} define uma lista de subíndice e um valor individual
|
|
no formato plano. Este registro possui a seguinte forma sintática:
|
|
$$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$}$$
|
|
onde $t_1$, $t_2$, \dots, $t_n$ são subíndices e $v$ é um valor.
|
|
Cada subíndice, assim como o valor, pode ser um número ou um símbolo. As
|
|
vírgulas que seguem os subíndices são opcionais e podem ser omitidas.
|
|
|
|
No caso de um parâmetro ou fatia 0-dimensional, o registro plano não possui
|
|
subíndice e consiste de um valor individual apenas.
|
|
|
|
|
|
% The {\it plain data record} defines a subscript list and a single value
|
|
% in the plain format. This record has the following syntactic form:
|
|
% $$\mbox{$t_1$ {\tt,} $t_2$ {\tt,} \dots {\tt,} $t_n$ {\tt,} $v$}$$
|
|
% where $t_1$, $t_2$, \dots, $t_n$ are subscripts, and $v$ is a value.
|
|
% Each subscript as well as the value can be a number or symbol. Commae
|
|
% following subscripts are optional and may be omitted.
|
|
%
|
|
% In case of 0-dimensional parameter or slice the plain data record has
|
|
% no subscripts and consists of a single value only.
|
|
|
|
\subsection{Registro tabular}
|
|
|
|
O {\it registro tabular} define diversos valores onde cada valor é provido
|
|
de dois subíndices. Este registro possui a seguinte forma sintática:
|
|
$$\begin{array}{cccccc}
|
|
\mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
|
|
r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
|
|
r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
|
|
\multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
|
|
r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
|
|
\end{array}$$
|
|
onde $r_1$, $r_2$, \dots, $r_m$ são números e/ou símbolos
|
|
que correspondem a linhas da tabela; enquanto que $c_1$, $c_2$, \dots, $c_n$ são
|
|
são números e/ou símbolos que correspondem a colunas da tabela, $a_{11}$,
|
|
$a_{12}$, \dots, $a_{mn}$ são elementos da tabela. Cada elemento pode ser
|
|
um número, símbolo ou o ponto decimal ({\tt.}) individual. (neste registro,
|
|
o delimitador {\tt:} que precede a lista de colunas e o delimitador
|
|
{\tt:=} que segue após a lista de colunas, não podem ser omitidos).
|
|
|
|
Cada elemento $a_{ij}$ do bloco de dados tabulares ($1\leq i\leq m$,
|
|
$1\leq j\leq n$) define dois subíndices, onde o primeiro subíndice é
|
|
$r_i$ e o segundo é $c_j$. Estes subíndices são usados juntamente com
|
|
a fatia vigente para formar a lista completa de subíndices que identifica
|
|
um membro particular da matriz de parâmetros. Se $a_{ij}$
|
|
é um número ou um símbolo, este valor é atribuído ao membro do parâmetro.
|
|
No entanto, se $a_{ij}$ é um ponto decimal individual, o membro é atribuído
|
|
ao valor padrão especificado ou no bloco de dados do parâmetro
|
|
ou na sentença parameter, ou ainda, se nenhum valor padrão é especificado,
|
|
o membro permanece indefinido.
|
|
|
|
Uma vez que o registro tabular fornece dois subíndices para cada valor,
|
|
tanto o parâmetro quanto a fatia vigente em uso devem ser 2-dimensional.
|
|
|
|
|
|
% The {\it tabular data record} defines several values, where each value
|
|
% is provided with two subscripts. This record has the following
|
|
% syntactic form:
|
|
% $$\begin{array}{cccccc}
|
|
% \mbox{{\tt:}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
|
|
% r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
|
|
% r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
|
|
% \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
|
|
% r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
|
|
% \end{array}$$
|
|
% where $r_1$, $r_2$, \dots, $r_m$ are numbers and/or symbols
|
|
% corresponding to rows of the table; $c_1$, $c_2$, \dots, $c_n$ are
|
|
% numbers and/or symbols corresponding to columns of the table, $a_{11}$,
|
|
% $a_{12}$, \dots, $a_{mn}$ are table elements. Each element can be a
|
|
% number or symbol or the single decimal point ({\tt.}). (In this data
|
|
% record the delimiter {\tt:} preceding the column list and the delimiter
|
|
% {\tt:=} following the column list cannot be omitted.)
|
|
%
|
|
% Each element $a_{ij}$ of the tabular data block ($1\leq i\leq m$,
|
|
% $1\leq j\leq n$) defines two subscripts, where the first subscript is
|
|
% $r_i$, and the second one is $c_j$. These subscripts are used in
|
|
% conjunction with the current slice to form the complete subscript list
|
|
% that identifies a particular member of the parameter array. If $a_{ij}$
|
|
% is a number or symbol, this value is assigned to the parameter member.
|
|
% However, if $a_{ij}$ is the single decimal point, the member is
|
|
% assigned a default value specified either in the parameter data block
|
|
% or in the parameter statement, or, if no default value is specified,
|
|
% the member remains undefined.
|
|
%
|
|
% Since the tabular data record provides two subscripts for each value,
|
|
% either the parameter or the slice currently used should be
|
|
% 2-dimensional.
|
|
|
|
\subsection{Registro tabular transposto}
|
|
|
|
O {\it registro tabular transposto} possui a seguinte forma sintática:
|
|
$$\begin{array}{cccccc}
|
|
\mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
|
|
r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
|
|
r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
|
|
\multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
|
|
r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
|
|
\end{array}$$
|
|
(Neste caso, o delimitador {\tt:} que segue a palavra-chave {\tt(tr)} é
|
|
opcional e pode ser omitida.)
|
|
|
|
Este registro é completamente análogo ao registro tabular
|
|
(ver anteriormente) com a única exceção que o primeiro subíndice definido
|
|
pelo elemento $a_{ij}$ é $c_j$ enquanto que o segundo é $r_i$.
|
|
|
|
Uma vez especificado, o indicador {\tt(tr)} afeta todos registros subsequentes
|
|
até que se encontre outra fatia ou o fim do bloco de dados.
|
|
|
|
|
|
% The {\it transposed tabular data record} has the following syntactic
|
|
% form:
|
|
% $$\begin{array}{cccccc}
|
|
% \mbox{{\tt(tr) :}}&c_1&c_2&\dots&c_n&\mbox{{\tt:=}}\\
|
|
% r_1&a_{11}&a_{12}&\dots&a_{1n}&\\
|
|
% r_2&a_{21}&a_{22}&\dots&a_{2n}&\\
|
|
% \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .}&\\
|
|
% r_m&a_{m1}&a_{m2}&\dots&a_{mn}&\\
|
|
% \end{array}$$
|
|
% (In this case the delimiter {\tt:} following the keyword {\tt(tr)} is
|
|
% optional and may be omitted.)
|
|
%
|
|
% This data record is completely analogous to the tabular data record
|
|
% (see above) with only exception that the first subscript defined by
|
|
% element $a_{ij}$ is $c_j$ while the second one is $r_i$.
|
|
%
|
|
% Being once specified the {\tt(tr)} indicator affects all subsequent
|
|
% data records until either a slice or the end of data block is
|
|
% encountered.
|
|
|
|
% \newpage
|
|
|
|
\subsection{Formato de dados em tabulação}
|
|
|
|
O bloco de dados do parâmetro no {\it formato tabulação} possui a seguinte
|
|
forma sintática:
|
|
$$
|
|
\begin{array}{*{8}{l}}
|
|
\multicolumn{4}{l}
|
|
{{\tt param}\ {\tt default}\ valor\ {\tt :}\ s\ {\tt :}}&
|
|
p_1\ \ \verb|,|&p_2\ \ \verb|,|&\dots\ \verb|,|&p_r\ \ \verb|:=|\\
|
|
r_{11}\ \verb|,|& r_{12}\ \verb|,|& \dots\ \verb|,|& r_{1n}\ \verb|,|&
|
|
a_{11}\ \verb|,|& a_{12}\ \verb|,|& \dots\ \verb|,|& a_{1r}\ \verb|,|\\
|
|
r_{21}\ \verb|,|& r_{22}\ \verb|,|& \dots\ \verb|,|& r_{2n}\ \verb|,|&
|
|
a_{21}\ \verb|,|& a_{22}\ \verb|,|& \dots\ \verb|,|& a_{2r}\ \verb|,|\\
|
|
\dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\
|
|
r_{m1}\ \verb|,|& r_{m2}\ \verb|,|& \dots\ \verb|,|& r_{mn}\ \verb|,|&
|
|
a_{m1}\ \verb|,|& a_{m2}\ \verb|,|& \dots\ \verb|,|& a_{mr}\ \verb|;|\\
|
|
\end{array}
|
|
$$
|
|
|
|
1. A palavra-chave {\tt default} pode ser omitida juntamente
|
|
com o valor que a segue.
|
|
|
|
2. O nome simbólico $s$ pode ser omitido juntamente com
|
|
os dois pontos que o segue.
|
|
|
|
3. Todas as vírgulas são opcionais e podem ser omitidas.
|
|
|
|
O bloco de dados no formato tabulação mostrado acima é exatamente
|
|
equivalente aos seguintes blocos de dados:
|
|
|
|
\verb|set| $s$\ \verb|:=|\ $
|
|
\verb|(|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|) |
|
|
\verb|(|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|) |
|
|
\dots
|
|
\verb| (|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|);|$
|
|
|
|
\verb|param| $p_1$\ \verb|default|\ $valor$\ \verb|:=|
|
|
|
|
$\verb| |
|
|
\verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{11}
|
|
\verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{21}
|
|
\verb| |\dots
|
|
\verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m1}
|
|
\verb|;|
|
|
$
|
|
|
|
\verb|param| $p_2$\ \verb|default|\ $valor$\ \verb|:=|
|
|
|
|
$\verb| |
|
|
\verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{12}
|
|
\verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{22}
|
|
\verb| |\dots
|
|
\verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m2}
|
|
\verb|;|
|
|
$
|
|
|
|
\verb| |.\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .
|
|
|
|
\verb|param| $p_r$\ \verb|default|\ $valor$\ \verb|:=|
|
|
|
|
$\verb| |
|
|
\verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{1r}
|
|
\verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{2r}
|
|
\verb| |\dots
|
|
\verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{mr}
|
|
\verb|;|
|
|
$
|
|
|
|
|
|
% The parameter data block in the {\it tabbing format} has the following
|
|
% syntactic form:
|
|
% $$
|
|
% \begin{array}{*{8}{l}}
|
|
% \multicolumn{4}{l}
|
|
% {{\tt param}\ {\tt default}\ value\ {\tt :}\ s\ {\tt :}}&
|
|
% p_1\ \ \verb|,|&p_2\ \ \verb|,|&\dots\ \verb|,|&p_r\ \ \verb|:=|\\
|
|
% r_{11}\ \verb|,|& r_{12}\ \verb|,|& \dots\ \verb|,|& r_{1n}\ \verb|,|&
|
|
% a_{11}\ \verb|,|& a_{12}\ \verb|,|& \dots\ \verb|,|& a_{1r}\ \verb|,|\\
|
|
% r_{21}\ \verb|,|& r_{22}\ \verb|,|& \dots\ \verb|,|& r_{2n}\ \verb|,|&
|
|
% a_{21}\ \verb|,|& a_{22}\ \verb|,|& \dots\ \verb|,|& a_{2r}\ \verb|,|\\
|
|
% \dots & \dots & \dots & \dots & \dots & \dots & \dots & \dots \\
|
|
% r_{m1}\ \verb|,|& r_{m2}\ \verb|,|& \dots\ \verb|,|& r_{mn}\ \verb|,|&
|
|
% a_{m1}\ \verb|,|& a_{m2}\ \verb|,|& \dots\ \verb|,|& a_{mr}\ \verb|;|\\
|
|
% \end{array}
|
|
% $$
|
|
%
|
|
% 1. The keyword {\tt default} may be omitted along with a value
|
|
% following it.
|
|
%
|
|
% 2. Symbolic name $s$ may be omitted along with the colon following it.
|
|
%
|
|
% 3. All commae are optional and may be omitted.
|
|
%
|
|
% The data block in the tabbing format shown above is exactly equivalent
|
|
% to the following data blocks:
|
|
%
|
|
% \verb|set| $s$\ \verb|:=|\ $
|
|
% \verb|(|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|) |
|
|
% \verb|(|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|) |
|
|
% \dots
|
|
% \verb| (|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|);|$
|
|
%
|
|
% \verb|param| $p_1$\ \verb|default|\ $value$\ \verb|:=|
|
|
%
|
|
% $\verb| |
|
|
% \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{11}
|
|
% \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{21}
|
|
% \verb| |\dots
|
|
% \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m1}
|
|
% \verb|;|
|
|
% $
|
|
%
|
|
% \verb|param| $p_2$\ \verb|default|\ $value$\ \verb|:=|
|
|
%
|
|
% $\verb| |
|
|
% \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{12}
|
|
% \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{22}
|
|
% \verb| |\dots
|
|
% \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{m2}
|
|
% \verb|;|
|
|
% $
|
|
%
|
|
% \verb| |.\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .\ \ \ .
|
|
%
|
|
% \verb|param| $p_r$\ \verb|default|\ $value$\ \verb|:=|
|
|
%
|
|
% $\verb| |
|
|
% \verb|[|r_{11}\verb|,|r_{12}\verb|,|\dots\verb|,|r_{1n}\verb|] |a_{1r}
|
|
% \verb| [|r_{21}\verb|,|r_{22}\verb|,|\dots\verb|,|r_{2n}\verb|] |a_{2r}
|
|
% \verb| |\dots
|
|
% \verb| [|r_{m1}\verb|,|r_{m2}\verb|,|\dots\verb|,|r_{mn}\verb|] |a_{mr}
|
|
% \verb|;|
|
|
% $
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\appendix
|
|
|
|
\chapter{Usando sufixos}
|
|
|
|
\vspace*{-12pt}
|
|
|
|
Sufixos podem ser usados para recuperar valores adicionais
|
|
associados com as variáveis, restrições e objetivos do modelo.
|
|
|
|
Um {\it sufixo} consiste de um ponto ({\tt.}) seguido por uma palavra-chave
|
|
não-reservada. Por exemplo, se {\tt x} é uma variável bi-dimensional,
|
|
{\tt x[i,j].lb} é um valor numérico igual ao limite inferior da variável
|
|
elementar {\tt x[i,j]}, que (cujo valor) pode ser usado em expressões
|
|
como um parâmetro numérico.
|
|
|
|
Para as variáveis do modelo, os sufixos possuem o seguinte significado:
|
|
|
|
\begin{tabular}{@{}ll@{}}
|
|
{\tt.lb}&limite inferior (lower bound)\\
|
|
{\tt.ub}&limite superior (upper bound)\\
|
|
{\tt.status}&status na solução:\\
|
|
&0 --- indefinida\\
|
|
&1 --- básica\\
|
|
&2 --- não-básica no limite inferior\\
|
|
&3 --- não-básica no limite superior\\
|
|
&4 --- variável não-básica livre (ilimitada)\\
|
|
&5 --- variável não-básica fixa\\
|
|
{\tt.val}&valor primal na solução\\
|
|
{\tt.dual}&valor dual (custo reduzido) na solução\\
|
|
\end{tabular}
|
|
|
|
Para as restrições e objetivos do modelo, os sufixos têm os seguintes significados:
|
|
|
|
\begin{tabular}{@{}ll@{}}
|
|
{\tt.lb}&limite inferior (lower bound) da forma linear\\
|
|
{\tt.ub}&limite superior (upper bound) da forma linear\\
|
|
{\tt.status}&status na solução:\\
|
|
&0 --- indefinida\\
|
|
&1 --- não-limitante\\
|
|
&2 --- limitante no limite inferior\\
|
|
&3 --- limitante no limite superior\\
|
|
&4 --- linha limitante livre (ilimitada)\\
|
|
&5 --- restrição de igualdade limitante\\
|
|
{\tt.val}&valor primal da forma linear na solução\\
|
|
{\tt.dual}&valor dual (custo reduzido) da forma linear na solução\\
|
|
\end{tabular}
|
|
|
|
Note que os sufixos {\tt.status}, {\tt.val} e {\tt.dual} podem ser usados
|
|
apenas abaixo da sentença solve.
|
|
|
|
|
|
% Suffixes can be used to retrieve additional values associated with
|
|
% model variables, constraints, and objectives.
|
|
%
|
|
% A {\it suffix} consists of a period ({\tt.}) followed by a non-reserved
|
|
% keyword. For example, if {\tt x} is a two-dimensional variable,
|
|
% {\tt x[i,j].lb} is a numeric value equal to the lower bound of
|
|
% elemental variable {\tt x[i,j]}, which (value) can be used everywhere
|
|
% in expressions like a numeric parameter.
|
|
%
|
|
% For model variables suffixes have the following meaning:
|
|
%
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% {\tt.lb}&lower bound\\
|
|
% {\tt.ub}&upper bound\\
|
|
% {\tt.status}&status in the solution:\\
|
|
% &0 --- undefined\\
|
|
% &1 --- basic\\
|
|
% &2 --- non-basic on lower bound\\
|
|
% &3 --- non-basic on upper bound\\
|
|
% &4 --- non-basic free (unbounded) variable\\
|
|
% &5 --- non-basic fixed variable\\
|
|
% {\tt.val}&primal value in the solution\\
|
|
% {\tt.dual}&dual value (reduced cost) in the solution\\
|
|
% \end{tabular}
|
|
%
|
|
% For model constraints and objectives suffixes have the following
|
|
% meaning:
|
|
%
|
|
% \begin{tabular}{@{}ll@{}}
|
|
% {\tt.lb}&lower bound of the linear form\\
|
|
% {\tt.ub}&upper bound of the linear form\\
|
|
% {\tt.status}&status in the solution:\\
|
|
% &0 --- undefined\\
|
|
% &1 --- non-active\\
|
|
% &2 --- active on lower bound\\
|
|
% &3 --- active on upper bound\\
|
|
% &4 --- active free (unbounded) row\\
|
|
% &5 --- active equality constraint\\
|
|
% {\tt.val}&primal value of the linear form in the solution\\
|
|
% {\tt.dual}&dual value (reduced cost) of the linear form in the
|
|
% solution\\
|
|
% \end{tabular}
|
|
%
|
|
% Note that suffixes {\tt.status}, {\tt.val}, and {\tt.dual} can be used
|
|
% only below the solve statement.
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\chapter{Funções de data e hora}
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{c}
|
|
por Andrew Makhorin \verb|<mao@gnu.org>|\\
|
|
e Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>|\\
|
|
\end{tabular}
|
|
|
|
\section{Obtendo o tempo de calendário corrente}
|
|
\label{gmtime}
|
|
|
|
Para obter o tempo de calendário corrente em MathProg existe a função
|
|
{\tt gmtime}. Ela não possui argumentos e retorna o número de segundos
|
|
transcorridos desde 00:00:00 de 1{\textsuperscript{\b{o}}}
|
|
de Janeiro de 1970, pelo
|
|
Tempo Universal Coordenado (UTC). Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
param utc := gmtime();
|
|
\end{verbatim}
|
|
|
|
MathProg não possui uma função para converter o tempo UTC retornado pela função
|
|
{\tt gmtime} para os tempos de calendário {\it local}. Assim, para
|
|
determinar o tempo de calendário local corrente, é preciso que adicione ao
|
|
tempo UTC retornado a diferença de horas, com respeito a UTC, expressa em
|
|
segundos. Por exemplo, a hora em Berlim durante o inverno é uma hora à frente
|
|
do UTC, que corresponde a uma diferença horária de +1~hora~= +3600~segundos,
|
|
assim, o tempo de calendário corrente no inverno em Berlim pode ser determinado
|
|
como segue:
|
|
|
|
\begin{verbatim}
|
|
param now := gmtime() + 3600;
|
|
\end{verbatim}
|
|
|
|
\noindent De forma análoga, o horário de verão em Chicago (Zona Horária Central-CDT)
|
|
é cinco horas atrás da UTC, de modo que o horário corrente do calendário local
|
|
pode ser determinado como segue:
|
|
|
|
\begin{verbatim}
|
|
param now := gmtime() - 5 * 3600;
|
|
\end{verbatim}
|
|
|
|
Note que o valor retornado por {\tt gmtime} é volátil, i.e., ao ser
|
|
chamada diversas vezes, esta função pode retornar diferentes valores.
|
|
|
|
% \noindent\hfil
|
|
% \begin{tabular}{c}
|
|
% by Andrew Makhorin \verb|<mao@gnu.org>|\\
|
|
% and Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>|\\
|
|
% \end{tabular}
|
|
%
|
|
% \section{Obtaining current calendar time}
|
|
% \label{gmtime}
|
|
%
|
|
% To obtain the current calendar time in MathProg there exists the
|
|
% function {\tt gmtime}. It has no arguments and returns the number of
|
|
% seconds elapsed since 00:00:00 on January 1, 1970, Coordinated
|
|
% Universal Time (UTC). For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% param utc := gmtime();
|
|
% \end{verbatim}
|
|
%
|
|
% MathProg has no function to convert UTC time returned by the function
|
|
% {\tt gmtime} to {\it local} calendar times. Thus, if you need to
|
|
% determine the current local calendar time, you have to add to the UTC
|
|
% time returned the time offset from UTC expressed in seconds. For
|
|
% example, the time in Berlin during the winter is one hour ahead of UTC
|
|
% that corresponds to the time offset +1~hour~= +3600~secs, so the
|
|
% current winter calendar time in Berlin may be determined as follows:
|
|
%
|
|
% \begin{verbatim}
|
|
% param now := gmtime() + 3600;
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent Similarly, the summer time in Chicago (Central Daylight Time)
|
|
% is five hours behind UTC, so the corresponding current local calendar
|
|
% time may be determined as follows:
|
|
%
|
|
% \begin{verbatim}
|
|
% param now := gmtime() - 5 * 3600;
|
|
% \end{verbatim}
|
|
%
|
|
% Note that the value returned by {\tt gmtime} is volatile, i.e. being
|
|
% called several times this function may return different values.
|
|
|
|
\section{Convertendo cadeia de caracteres ao tempo de calendário}
|
|
\label{str2time}
|
|
|
|
A função {\tt str2time(}{\it s}{\tt,} {\it f}{\tt)} converte uma
|
|
cadeia de caractere (impressão da data e hora) \linebreak especificada pelo seu
|
|
primeiro argumento {\it s}, que deve ser uma expressão simbólica,
|
|
para o tempo de calendário apropriado para cálculos aritméticos.
|
|
A conversão é controlada pela cadeia de formato especificado {\it f}
|
|
(o segundo argumento), que também deve ser uma expressão simbólica.
|
|
|
|
|
|
% The function {\tt str2time(}{\it s}{\tt,} {\it f}{\tt)} converts a
|
|
% character string (timestamp) specified by its first argument {\it s},
|
|
% which should be a symbolic expression, to the calendar time suitable
|
|
% for arithmetic calculations. The conversion is controlled by the
|
|
% specified format string {\it f} (the second argument), which also
|
|
% should be a symbolic expression.
|
|
|
|
% \newpage
|
|
|
|
|
|
A conversão resultante retornada por {\tt str2time} possui o mesmo significado
|
|
dos valores retornados pela função {\tt gmtime} (ver Subseção
|
|
\ref{gmtime}, página \pageref{gmtime}). Note que {\tt str2time}
|
|
{\tt não corrige} o tempo de calendário retornado para zona horária local,
|
|
i.e., ao se aplicar a 00:00:00 de 1{\textsuperscript{\b{o}}}
|
|
de Janeiro de 1970, ela sempre retorna 0.
|
|
|
|
% The result of conversion returned by {\tt str2time} has the same
|
|
% meaning as values returned by the function {\tt gmtime} (see Subsection
|
|
% \ref{gmtime}, page \pageref{gmtime}). Note that {\tt str2time} does
|
|
% {\tt not} correct the calendar time returned for the local timezone,
|
|
% i.e. being applied to 00:00:00 on January 1, 1970 it always returns 0.
|
|
|
|
Por exemplo, as sentenças de modelo:
|
|
|
|
\begin{verbatim}
|
|
param s, symbolic, := "07/14/98 13:47";
|
|
param t := str2time(s, "%m/%d/%y %H:%M");
|
|
display t;
|
|
\end{verbatim}
|
|
|
|
\noindent produz a seguinte saída:
|
|
|
|
\begin{verbatim}
|
|
t = 900424020
|
|
\end{verbatim}
|
|
|
|
\noindent onde o tempo de calendário impresso corresponde a 13:47:00 em
|
|
14 de Julho de 1998.
|
|
|
|
A cadeia de formato passada à função {\tt str2time} consiste de
|
|
especificadores de conversão e caracteres ordinários. Cada especificador de
|
|
conversão inicia com um caractere de porcentagem ({\tt\%}) seguido de
|
|
uma letra.
|
|
|
|
Os seguintes especificadores de conversão podem ser usados na cadeia de formato:
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%b}&O nome do mês abreviado (insensível a maiúsculas). Pelo menos as três
|
|
primeiras letras do mês devem aparecer na cadeia de entrada.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%d}&O dia do mês como número decimal (de 1 até 31).
|
|
Se permite o zero como primeiro dígito, embora não seja necessário.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%h}&O mesmo que {\tt\%b}.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%H}&A hora como um número decimal, usando um relógio de 24-horas (de 0
|
|
a 23). Se permite o zero como primeiro dígito, embora não seja necessário.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%m}&O mês como um número decimal (de 1 a 12).
|
|
Se permite o zero como primeiro dígito, embora não seja necessário.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%M}&O minuto como um número decimal (de 0 a 59).
|
|
Se permite o zero como primeiro dígito, embora não seja necessário.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%S}&O segundo como um número decimal (de 0 to 60).
|
|
Se permite o zero como primeiro dígito, embora não seja necessário.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%y}&O ano sem o século, como um número decimal (de 0 to 99).
|
|
Se permite o zero como primeiro dígito, embora não seja necessário.
|
|
Valores de entrada de 0 a 68 são considerados dos anos 2000 a 2068
|
|
enquanto que os valores 69 até 99 como dos anos 1969 to 1999.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%z}&A diferença horária do GMT no formato ISO 8601.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%\%}&Um caractere {\tt\%} literal.\\
|
|
\end{tabular}
|
|
|
|
Todos os outros caracteres (ordinários) na cadeia de formato devem ter um
|
|
caractere \linebreak correspondente com a cadeia de entrada a ser convertida. Exceções
|
|
são espaços na cadeia de entrada, a qual pode coincidir com zero ou mais
|
|
caracteres de espaço na cadeia de formato.
|
|
|
|
% For example, the model statements:
|
|
%
|
|
% \begin{verbatim}
|
|
% param s, symbolic, := "07/14/98 13:47";
|
|
% param t := str2time(s, "%m/%d/%y %H:%M");
|
|
% display t;
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent produce the following printout:
|
|
%
|
|
% \begin{verbatim}
|
|
% t = 900424020
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent where the calendar time printed corresponds to 13:47:00 on
|
|
% July 14, 1998.
|
|
%
|
|
% The format string passed to the function {\tt str2time} consists of
|
|
% conversion specifiers and ordinary characters. Each conversion
|
|
% specifier begins with a percent ({\tt\%}) character followed by a
|
|
% letter.
|
|
%
|
|
% The following conversion specifiers may be used in the format string:
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%b}&The abbreviated month name (case insensitive). At least three
|
|
% first letters of the month name should appear in the input string.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%d}&The day of the month as a decimal number (range 1 to 31).
|
|
% Leading zero is permitted, but not required.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%h}&The same as {\tt\%b}.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 0
|
|
% to 23). Leading zero is permitted, but not required.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%m}&The month as a decimal number (range 1 to 12). Leading zero is
|
|
% permitted, but not required.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%M}&The minute as a decimal number (range 0 to 59). Leading zero
|
|
% is permitted, but not required.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%S}&The second as a decimal number (range 0 to 60). Leading zero
|
|
% is permitted, but not required.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%y}&The year without a century as a decimal number (range 0 to 99).
|
|
% Leading zero is permitted, but not required. Input values in the range
|
|
% 0 to 68 are considered as the years 2000 to 2068 while the values 69 to
|
|
% 99 as the years 1969 to 1999.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%z}&The offset from GMT in ISO 8601 format.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%\%}&A literal {\tt\%} character.\\
|
|
% \end{tabular}
|
|
%
|
|
% All other (ordinary) characters in the format string should have a
|
|
% matching character in the input string to be converted. Exceptions are
|
|
% spaces in the input string which can match zero or more space
|
|
% characters in the format string.
|
|
|
|
% \newpage
|
|
|
|
Se algum componente de data e/ou hora estão ausentes no formato e,
|
|
portanto, na cadeia de entrada, a função {\tt str2time} usa seus valores
|
|
padrão correspondendo a 00:00:00 de 1{\textsuperscript{\b{o}}}
|
|
de Janeiro de 1970, ou seja, o valor padrão para o ano é 1970, o valor
|
|
padrão para o mês é Janeiro, etc.
|
|
|
|
A função {\tt str2time} é aplicável a todos horários calendário desde
|
|
00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 0001 até 23:59:59
|
|
de 31 de Dezembro de 4000 do calendário Gregoriano.
|
|
|
|
% If some date and/or time component(s) are missing in the format and,
|
|
% therefore, in the input string, the function {\tt str2time} uses their
|
|
% default values corresponding to 00:00:00 on January 1, 1970, that is,
|
|
% the default value of the year is 1970, the default value of the month
|
|
% is January, etc.
|
|
%
|
|
% The function {\tt str2time} is applicable to all calendar times in the
|
|
% range 00:00:00 on January 1, 0001 to 23:59:59 on December 31, 4000 of
|
|
% the Gregorian calendar.
|
|
|
|
|
|
|
|
\section{Convertendo tempo de calendário a uma cadeia de caracteres}
|
|
\label{time2str}
|
|
|
|
A função {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} converte o tempo
|
|
de calendário especificado pelo seu primeiro \linebreak argumento {\it t}, que
|
|
deve ser uma expressão numérica, para uma cadeia de caracteres
|
|
(valor \linebreak simbólico). A conversão é controlada pela cadeia de formato
|
|
{\it f} (o segundo argumento), que deve ser uma expressão numérica.
|
|
|
|
O tempo de calendário passado para {\tt time2str} possui o mesmo
|
|
significado dos valores retornados pela função {\tt gmtime} (ver Subseção
|
|
\ref{gmtime}, página \pageref{gmtime}). Note que {\tt time2str}
|
|
{\it não corrige} o tempo de calendário especificado para zona horária local,
|
|
i.e., o tempo de calendário 0 sempre corresponde a 00:00:00 de
|
|
1{\textsuperscript{\b{o}}} de Janeiro de 1970.
|
|
|
|
Por exemplo, as sentenças de modelo:
|
|
|
|
\begin{verbatim}
|
|
param s, symbolic, := time2str(gmtime(), "%FT%TZ");
|
|
display s;
|
|
\end{verbatim}
|
|
|
|
\noindent pode produzir a seguinte impressão:
|
|
|
|
\begin{verbatim}
|
|
s = '2008-12-04T00:23:45Z'
|
|
\end{verbatim}
|
|
|
|
\noindent que é a impressão da data e hora no formato ISO.
|
|
|
|
A cadeia de formato passada para a função {\tt time2str} consiste de
|
|
especificadores de conversão e caracteres ordinários. Cada especificador
|
|
de conversão começa com um caractere de porcentagem ({\tt\%}) seguido
|
|
de uma letra.
|
|
|
|
Os seguintes especificadores de conversão podem ser usados na cadeia de formato:
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%a}&O nome do dia da semana abreviado(2 caracteres).\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%A}&O nome do dia da semana completo.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%b}&O nome do dia do mês abreviado (3 caracteres).\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%B}&O nome do mês completo.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%C}&O século do ano, ou seja, o maior inteiro não maior que o
|
|
ano dividido por~100.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%d}&O dia do mês como um número decimal (de 01 até 31).\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%D}&A data usando o formato \verb|%m/%d/%y|.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%e}&O dia do mês, como em \verb|%d|, mas preenchido com espaço
|
|
em branco ao invés de zero.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%F}&A data usando o formato \verb|%Y-%m-%d|.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%g}&O ano correspondente ao número de semana ISO, mas sem o século
|
|
(de 00 até~99). Este possui o mesmo formato e valor que \verb|%y|,
|
|
exceto que se o número de semana ISO (ver \verb|%V|) pertence
|
|
ao ano anterior ou seguinte, se usa aquele ano em seu lugar.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%G}&O ano correspondente ao número de semana ISO.
|
|
Este possui o mesmo formato e valor que \verb|%Y|,
|
|
exceto que se o número de semana ISO (ver \verb|%V|) pertence
|
|
ao ano anterior ou seguinte, se usa aquele ano em seu lugar.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%h}&O mesmo que \verb|%b|.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%H}&A hora como um número decimal usando um relógio 24 horas (de 00 até 23).\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%I}&A hora como um número decimal usando um relógio 12 horas (de 01 até 12).\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%j}&O dia do ano como um número decimal (de 001 até 366).\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%k}&A hora como um número decimal usando um relógio 24 horas, como
|
|
\verb|%H|, mas preenchido com espaço em branco ao invés de zero.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%l}&A hora como um número decimal usando um relógio 12 horas, como
|
|
\verb|%I|, mas preenchido com espaço em branco ao invés de zero.
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%m}&O mês como um número decimal (de 01 até 12).\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%M}&O minuto como um número decimal (de 00 até 59).\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%p}&Tanto {\tt AM} como {\tt PM}, de acordo com o valor da hora fornecido.
|
|
Meia-noite é tratada como {\tt AM} e meio-dia, como {\tt PM}.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%P}&Tanto {\tt am} como {\tt pm}, de acordo com o valor da hora fornecido.
|
|
Meia-noite é tratada como {\tt am} e meio-dia, como {\tt pm}.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%R}&A hora e minuto em números decimais usando o formato
|
|
\verb|%H:%M|.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%S}&O segundo como um número decimal (de 00 até 59).\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%T}&A hora do dia em números decimais usando o formato
|
|
\verb|%H:%M:%S|.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%u}&O dia da semana como número decimal (de 1 até 7) em que Segunda
|
|
é 1.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%U}&O número da semana do ano corrente como um número decimal (de
|
|
00 até 53) iniciando com o primeiro Domingo como o primeiro dia da
|
|
primeira semana. Os dias que precedem o primeiro Domingo do ano são
|
|
considerados parte da semana 00.
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%V}&O número da semana ISO como um número decimal (de 01 até 53).
|
|
Semanas ISO iniciam com Segunda e finalizam com Domingo.
|
|
A semana 01 de um ano é a primeira semana que possui a maioria de
|
|
seus dias naquele ano. Isto é equivalente à semana contendo 4 de
|
|
Janeiro. A semana 01 de um ano pode conter dias do ano anterior.
|
|
A semana anterior à semana 01 de um ano é a última semana
|
|
(52 ou 53) do ano anterior, mesmo se ela contém dias do novo ano.
|
|
Em outras palavras, se 1{\textsuperscript{\b{o}}} de Janeiro
|
|
é Segunda, Terça, Quarta ou Quinta, ele está na semana 01;
|
|
Se 1{\textsuperscript{\b{o}}} de Janeiro é Sexta,
|
|
Sábado ou Domingo, ele está na semana 52 ou 53 do ano anterior.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%w}&O dia da semana como um número decimal (de 0 até 6) em que Domingo
|
|
é 0.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%W}&O número da semana do ano corrente como um número decimal (de
|
|
00 até 53), iniciando com a primeira Segunda como o primeiro dia da primeira
|
|
semana. Dias que precedem a primeira Segunda do ano são considerados parte
|
|
da semana 00.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%y}&O ano sem o século como um número decimal (de 00 até
|
|
99), ou seja, o ano \verb|mod|~100.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%Y}&O ano como um número decimal, usando o calendário Gregoriano.\\
|
|
\end{tabular}
|
|
|
|
\begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
{\tt\%\%}&Um caractere \verb|%| literal.\\
|
|
\end{tabular}
|
|
|
|
Todos os outros caracteres (ordinários) na cadeia de formato são simplesmente copiados
|
|
à cadeia resultante.
|
|
|
|
O primeiro argumento (tempo do calendário) passado para a função {\tt time2str}
|
|
deve estar entre $-62135596800$ até $+64092211199$, o que corresponde ao período
|
|
de 00:00:00 de 1{\textsuperscript{\b{o}}} de Janeiro de 0001 até 23:59:59
|
|
de 31 de Dezembro de 4000 do calendário Gregoriano.
|
|
|
|
|
|
% The function {\tt time2str(}{\it t}{\tt,} {\it f}{\tt)} converts the
|
|
% calendar time specified by its first argument {\it t}, which should be
|
|
% a numeric expression, to a character string (symbolic value). The
|
|
% conversion is controlled by the specified format string {\it f} (the
|
|
% second argument), which should be a symbolic expression.
|
|
%
|
|
% The calendar time passed to {\tt time2str} has the same meaning as
|
|
% values returned by the function {\tt gmtime} (see Subsection
|
|
% \ref{gmtime}, page \pageref{gmtime}). Note that {\tt time2str} does
|
|
% {\it not} correct the specified calendar time for the local timezone,
|
|
% i.e. the calendar time 0 always corresponds to 00:00:00 on January 1,
|
|
% 1970.
|
|
%
|
|
% For example, the model statements:
|
|
%
|
|
% \begin{verbatim}
|
|
% param s, symbolic, := time2str(gmtime(), "%FT%TZ");
|
|
% display s;
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent may produce the following printout:
|
|
%
|
|
% \begin{verbatim}
|
|
% s = '2008-12-04T00:23:45Z'
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent which is a timestamp in the ISO format.
|
|
%
|
|
% The format string passed to the function {\tt time2str} consists of
|
|
% conversion specifiers and ordinary characters. Each conversion
|
|
% specifier begins with a percent ({\tt\%}) character followed by a
|
|
% letter.
|
|
%
|
|
% The following conversion specifiers may be used in the format string:
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%a}&The abbreviated (2-character) weekday name.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%A}&The full weekday name.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%b}&The abbreviated (3-character) month name.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%B}&The full month name.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%C}&The century of the year, that is the greatest integer not
|
|
% greater than the year divided by~100.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%d}&The day of the month as a decimal number (range 01 to 31).\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%D}&The date using the format \verb|%m/%d/%y|.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%e}&The day of the month like with \verb|%d|, but padded with
|
|
% blank rather than zero.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%F}&The date using the format \verb|%Y-%m-%d|.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%g}&The year corresponding to the ISO week number, but without the
|
|
% century (range 00 to~99). This has the same format and value as
|
|
% \verb|%y|, except that if the ISO week number (see \verb|%V|) belongs
|
|
% to the previous or next year, that year is used instead.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%G}&The year corresponding to the ISO week number. This has the
|
|
% same format and value as \verb|%Y|, except that if the ISO week number
|
|
% (see \verb|%V|) belongs to the previous or next year, that year is used
|
|
% instead.
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%h}&The same as \verb|%b|.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%H}&The hour as a decimal number, using a 24-hour clock (range 00
|
|
% to 23).\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%I}&The hour as a decimal number, using a 12-hour clock (range 01
|
|
% to 12).\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%j}&The day of the year as a decimal number (range 001 to 366).\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%k}&The hour as a decimal number, using a 24-hour clock like
|
|
% \verb|%H|, but padded with blank rather than zero.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%l}&The hour as a decimal number, using a 12-hour clock like
|
|
% \verb|%I|, but padded with blank rather than zero.
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%m}&The month as a decimal number (range 01 to 12).\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%M}&The minute as a decimal number (range 00 to 59).\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%p}&Either {\tt AM} or {\tt PM}, according to the given time value.
|
|
% Midnight is treated as {\tt AM} and noon as {\tt PM}.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%P}&Either {\tt am} or {\tt pm}, according to the given time value.
|
|
% Midnight is treated as {\tt am} and noon as {\tt pm}.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%R}&The hour and minute in decimal numbers using the format
|
|
% \verb|%H:%M|.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%S}&The second as a decimal number (range 00 to 59).\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%T}&The time of day in decimal numbers using the format
|
|
% \verb|%H:%M:%S|.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%u}&The day of the week as a decimal number (range 1 to 7), Monday
|
|
% being 1.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%U}&The week number of the current year as a decimal number (range
|
|
% 00 to 53), starting with the first Sunday as the first day of the first
|
|
% week. Days preceding the first Sunday in the year are considered to be
|
|
% in week 00.
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%V}&The ISO week number as a decimal number (range 01 to 53). ISO
|
|
% weeks start with Monday and end with Sunday. Week 01 of a year is the
|
|
% first week which has the majority of its days in that year; this is
|
|
% equivalent to the week containing January 4. Week 01 of a year can
|
|
% contain days from the previous year. The week before week 01 of a year
|
|
% is the last week (52 or 53) of the previous year even if it contains
|
|
% days from the new year. In other word, if 1 January is Monday, Tuesday,
|
|
% Wednesday or Thursday, it is in week 01; if 1 January is Friday,
|
|
% Saturday or Sunday, it is in week 52 or 53 of the previous year.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%w}&The day of the week as a decimal number (range 0 to 6), Sunday
|
|
% being 0.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%W}&The week number of the current year as a decimal number (range
|
|
% 00 to 53), starting with the first Monday as the first day of the first
|
|
% week. Days preceding the first Monday in the year are considered to be
|
|
% in week 00.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%y}&The year without a century as a decimal number (range 00 to
|
|
% 99), that is the year modulo~100.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%Y}&The year as a decimal number, using the Gregorian calendar.\\
|
|
% \end{tabular}
|
|
%
|
|
% \begin{tabular}{@{}p{20pt}p{421.5pt}@{}}
|
|
% {\tt\%\%}&A literal \verb|%| character.\\
|
|
% \end{tabular}
|
|
%
|
|
% All other (ordinary) characters in the format string are simply copied
|
|
% to the resultant string.
|
|
%
|
|
% The first argument (calendar time) passed to the function {\tt time2str}
|
|
% should be in the range from $-62135596800$ to $+64092211199$ that
|
|
% corresponds to the period from 00:00:00 on January 1, 0001 to 23:59:59
|
|
% on December 31, 4000 of the Gregorian calendar.
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
|
\chapter{Controladores de tabelas}
|
|
\label{drivers}
|
|
|
|
\noindent\hfil
|
|
\begin{tabular}{c}
|
|
por Andrew Makhorin \verb|<mao@gnu.org>|\\
|
|
e Heinrich Schuchardt \verb|<heinrich.schuchardt@gmx.de>|\\
|
|
\end{tabular}
|
|
|
|
\bigskip\bigskip
|
|
|
|
O {\it controlador de tabelas} é um módulo do programa que permite transmitir
|
|
dados entre objetos de um modelo MathProg e tabela de dados.
|
|
|
|
Atualmente, o pacote GLPK possui quatro controladores de tabelas:
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\begin{itemize}
|
|
\item controlador interno de tabelas CSV;
|
|
\item controlador interno de tabelas xBASE;
|
|
\item controlador de tabelas ODBC;
|
|
\item controlador de tabelas MySQL.
|
|
\end{itemize}
|
|
|
|
|
|
% The {\it table driver} is a program module which provides transmitting
|
|
% data between MathProg model objects and data tables.
|
|
%
|
|
% Currently the GLPK package has four table drivers:
|
|
%
|
|
% \vspace*{-8pt}
|
|
%
|
|
% \begin{itemize}
|
|
% \item built-in CSV table driver;
|
|
% \item built-in xBASE table driver;
|
|
% \item ODBC table driver;
|
|
% \item MySQL table driver.
|
|
% \end{itemize}
|
|
|
|
\vspace*{-8pt}
|
|
|
|
\section{Controlador de tabelas CSV}
|
|
|
|
O controlador de tabelas CSV assume que a tabela de dados está representada
|
|
na forma de \linebreak arquivo de texto plano, em formato de arquivo CSV
|
|
(valores serparados por vígula: \linebreak comma-separated values) como descrito
|
|
abaixo.
|
|
|
|
Para escolher o controlador de tabelas CSV, seu nome na sentença table deve ser
|
|
especificado como \verb|"CSV"| e o único argumento deve especificar o nome do
|
|
arquivo de texto plano contendo a tabela. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
table dados IN "CSV" "dados.csv": ... ;
|
|
\end{verbatim}
|
|
|
|
O sufixo do nome do arquivo pode ser arbitrário, no entanto,
|
|
é recomendado usar o sufixo `\verb|.csv|'.
|
|
|
|
Ao ler tabelas de entrada o controlador de tabelas CSV fornece um campo
|
|
implícito chamado \verb|RECNO|, que contém o número do registro corrente.
|
|
Este campo pode ser especificado na sentença de entrada table, como
|
|
se realmente houvesse um campo chamado \verb|RECNO| no arquivo CSV. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
table lista IN "CSV" "lista.csv": num <- [RECNO], ... ;
|
|
\end{verbatim}
|
|
|
|
|
|
% The CSV table driver assumes that the data table is represented in the
|
|
% form of a plain text file in the CSV (comma-separated values) file
|
|
% format as described below.
|
|
%
|
|
% To choose the CSV table driver its name in the table statement should
|
|
% be specified as \verb|"CSV"|, and the only argument should specify the
|
|
% name of a plain text file containing the table. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% table data IN "CSV" "data.csv": ... ;
|
|
% \end{verbatim}
|
|
%
|
|
% The filename suffix may be arbitrary, however, it is recommended to use
|
|
% the suffix `\verb|.csv|'.
|
|
%
|
|
% On reading input tables the CSV table driver provides an implicit field
|
|
% named \verb|RECNO|, which contains the current record number. This
|
|
% field can be specified in the input table statement as if there were
|
|
% the actual field named \verb|RECNO| in the CSV file. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% table list IN "CSV" "list.csv": num <- [RECNO], ... ;
|
|
% \end{verbatim}
|
|
|
|
\newpage
|
|
|
|
\subsection*{Formato CSV\footnote{Este material é baseado no documento RFC
|
|
4180.}}
|
|
|
|
O formato CSV (\textit{comma-separated values}) é um formato de arquivo de texto plano
|
|
definido como segue.
|
|
|
|
1. Cada registro é localizado em uma linha separada, delimitada por uma quebra de linha. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
aaa,bbb,ccc\n
|
|
xxx,yyy,zzz\n
|
|
\end{verbatim}
|
|
|
|
\noindent
|
|
onde \verb|\n| significa o caractere de controle \verb|LF| ({\tt 0x0A}).
|
|
|
|
2. O último registro no arquivo pode ou não ter a quebra de linha. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
aaa,bbb,ccc\n
|
|
xxx,yyy,zzz
|
|
\end{verbatim}
|
|
|
|
3. Deve haver uma linha de cabeçalho na primeira linha do arquivo no
|
|
mesmo formato das linhas de registros normais. Este cabeçalho deve
|
|
conter nomes correspondendo aos campos no arquivo. O número de nomes
|
|
de campos na linha de cabeçalho deve ser o mesmo do número de campos
|
|
dos registros do arquivo. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
nome1,nome2,nome3\n
|
|
aaa,bbb,ccc\n
|
|
xxx,yyy,zzz\n
|
|
\end{verbatim}
|
|
|
|
4. Dentro do cabeçalho e de cada registro, podem haver um ou mais campos
|
|
separados por vírgulas. Cada linha deve conter o mesmo número de campos
|
|
por todos arquivo. Espaços são considerados parte de um campo, portanto,
|
|
não são ignorados. O último campo do registro não deve ser seguido de
|
|
vírgula. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
aaa,bbb,ccc\n
|
|
\end{verbatim}
|
|
|
|
5. Campos podem ou não estar cercados em aspas duplas. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
"aaa","bbb","ccc"\n
|
|
zzz,yyy,xxx\n
|
|
\end{verbatim}
|
|
|
|
6. Se um campo é cercado de aspas duplas, cada aspa dupla que faça
|
|
parte do campo deve ser codificado duas vezes. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
"aaa","b""bb","ccc"\n
|
|
\end{verbatim}
|
|
|
|
\para{Exemplo}
|
|
|
|
\begin{verbatim}
|
|
DE,PARA,DISTANCIA,CUSTO
|
|
Seattle,New-York,2.5,0.12
|
|
Seattle,Chicago,1.7,0.08
|
|
Seattle,Topeka,1.8,0.09
|
|
San-Diego,New-York,2.5,0.15
|
|
San-Diego,Chicago,1.8,0.10
|
|
San-Diego,Topeka,1.4,0.07
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
% The CSV (comma-separated values) format is a plain text file format
|
|
% defined as follows.
|
|
%
|
|
% 1. Each record is located on a separate line, delimited by a line
|
|
% break. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% aaa,bbb,ccc\n
|
|
% xxx,yyy,zzz\n
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent
|
|
% where \verb|\n| means the control character \verb|LF| ({\tt 0x0A}).
|
|
%
|
|
% 2. The last record in the file may or may not have an ending line
|
|
% break. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% aaa,bbb,ccc\n
|
|
% xxx,yyy,zzz
|
|
% \end{verbatim}
|
|
%
|
|
% 3. There should be a header line appearing as the first line of the
|
|
% file in the same format as normal record lines. This header should
|
|
% contain names corresponding to the fields in the file. The number of
|
|
% field names in the header line should be the same as the number of
|
|
% fields in the records of the file. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% name1,name2,name3\n
|
|
% aaa,bbb,ccc\n
|
|
% xxx,yyy,zzz\n
|
|
% \end{verbatim}
|
|
%
|
|
% 4. Within the header and each record there may be one or more fields
|
|
% separated by commas. Each line should contain the same number of fields
|
|
% throughout the file. Spaces are considered as part of a field and
|
|
% therefore not ignored. The last field in the record should not be
|
|
% followed by a comma. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% aaa,bbb,ccc\n
|
|
% \end{verbatim}
|
|
%
|
|
% 5. Fields may or may not be enclosed in double quotes. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% "aaa","bbb","ccc"\n
|
|
% zzz,yyy,xxx\n
|
|
% \end{verbatim}
|
|
%
|
|
% 6. If a field is enclosed in double quotes, each double quote which is
|
|
% part of the field should be coded twice. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% "aaa","b""bb","ccc"\n
|
|
% \end{verbatim}
|
|
%
|
|
% \para{Example}
|
|
%
|
|
% \begin{verbatim}
|
|
% FROM,TO,DISTANCE,COST
|
|
% Seattle,New-York,2.5,0.12
|
|
% Seattle,Chicago,1.7,0.08
|
|
% Seattle,Topeka,1.8,0.09
|
|
% San-Diego,New-York,2.5,0.15
|
|
% San-Diego,Chicago,1.8,0.10
|
|
% San-Diego,Topeka,1.4,0.07
|
|
% \end{verbatim}
|
|
|
|
\newpage
|
|
|
|
\section{Controlador de tabelas xBASE}
|
|
|
|
O controlador de tabelas xBASE assume que a tabela de dados é armazenada no
|
|
formato de arquivo .dbf.
|
|
|
|
Para escolher o controlador de tabela xBASE, seu nome na sentença table deve ser
|
|
especificado como \verb|"xBASE"| e o primeiro argumento deve especificar o nome
|
|
de um arquivo .dbf contendo a tabela. Para a tabela de saída deve haver um
|
|
segundo argumento definindo o formato da tabela na forma
|
|
\verb|"FF...F"|, onde \verb|F| é tanto {\tt C({\it n})},
|
|
que especifica um campo de caractere de tamanho $n$, ou
|
|
{\tt N({\it n}{\rm [},{\it p}{\rm ]})}, que especifica um campo numérico
|
|
de tamanho $n$ e precisão $p$ (por padrão $p$ é 0).
|
|
|
|
Adiante está um simples exemplo que ilustra a criação e leitura de um arquivo .dbf:
|
|
|
|
\begin{verbatim}
|
|
table tab1{i in 1..10} OUT "xBASE" "foo.dbf"
|
|
"N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A,
|
|
"?" ~ FOO, "[" & i & "]" ~ C;
|
|
set S, dimen 4;
|
|
table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A];
|
|
display S;
|
|
end;
|
|
\end{verbatim}
|
|
|
|
|
|
% The xBASE table driver assumes that the data table is stored in the
|
|
% .dbf file format.
|
|
%
|
|
% To choose the xBASE table driver its name in the table statement should
|
|
% be specified as \verb|"xBASE"|, and the first argument should specify
|
|
% the name of a .dbf file containing the table. For the output table there
|
|
% should be the second argument defining the table format in the form
|
|
% \verb|"FF...F"|, where \verb|F| is either {\tt C({\it n})},
|
|
% which specifies a character field of length $n$, or
|
|
% {\tt N({\it n}{\rm [},{\it p}{\rm ]})}, which specifies a numeric field
|
|
% of length $n$ and precision $p$ (by default $p$ is 0).
|
|
%
|
|
% The following is a simple example which illustrates creating and
|
|
% reading a .dbf file:
|
|
%
|
|
% \begin{verbatim}
|
|
% table tab1{i in 1..10} OUT "xBASE" "foo.dbf"
|
|
% "N(5)N(10,4)C(1)C(10)": 2*i+1 ~ B, Uniform(-20,+20) ~ A,
|
|
% "?" ~ FOO, "[" & i & "]" ~ C;
|
|
% set S, dimen 4;
|
|
% table tab2 IN "xBASE" "foo.dbf": S <- [B, C, RECNO, A];
|
|
% display S;
|
|
% end;
|
|
% \end{verbatim}
|
|
|
|
\section{Controlador de tabelas ODBC}
|
|
|
|
O controlador de tabelas ODBC permite conexões com bancos de dados SQL usando
|
|
uma \linebreak implementação da interface ODBC baseada na Call Level Interface
|
|
(CLI).\footnote{A norma software correspondente é definida na
|
|
ISO/IEC 9075-3:2003.}
|
|
|
|
\para{Debian GNU/Linux.}
|
|
No Debian GNU/Linux o controlador de tabelas ODBC usa o pacote iODBC,
|
|
\footnote{Ver {\tt<http://www.iodbc.org/>}.} que deve ser instalado antes
|
|
de montar o pacote GLPK. A instalação pode ser efetuada com o seguinte
|
|
comando:
|
|
|
|
\begin{verbatim}
|
|
sudo apt-get install libiodbc2-dev
|
|
\end{verbatim}
|
|
|
|
Note que, ao configurar o pacote GLPK, para habilitar o uso da biblioteca do iODBC
|
|
a opção `\verb|--enable-odbc|' deve ser passada para o script de configuração.
|
|
|
|
Para seu uso em todo sistema, as bases de dados individuais devem ser inseridas em
|
|
\verb|/etc/odbc.ini| e \verb|/etc/odbcinst.ini|. As conexões das bases de dados
|
|
a serem usadas por um único usuário são especificadas por arquivos do diretório
|
|
home (\verb|.odbc.ini| e \verb|.odbcinst.ini|).
|
|
|
|
\para{Microsoft Windows.}
|
|
No Microsoft Windows o controlador de tabelas ODBC usa a biblioteca Microsoft ODBC.
|
|
Para habilitar esta funcionalidade, o símbolo:
|
|
|
|
\begin{verbatim}
|
|
#define ODBC_DLNAME "odbc32.dll"
|
|
\end{verbatim}
|
|
|
|
\noindent
|
|
deve ser definido no arquivo de configuração do GLPK `\verb|config.h|'.
|
|
|
|
Fontes de dados podem ser criados via Ferramentas Administrativas do
|
|
Painel de Controle.
|
|
|
|
Para escolher do controlador de tabelas ODBC, seu nome na sentença table deve
|
|
ser especificado como \verb|'ODBC'| ou \verb|'iODBC'|.
|
|
|
|
% \newpage
|
|
|
|
A lista de argumentos é especificada como segue.
|
|
|
|
O primeiro argumento é a cadeia de conexão passada para a biblioteca ODBC,
|
|
por exemplo:
|
|
|
|
\verb|'DSN=glpk;UID=user;PWD=password'|, ou
|
|
|
|
\verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|.
|
|
|
|
Diferentes partes da cadeia são separadas por ponto e vírgula. Cada parte
|
|
consiste de um par {\it nome-do-campo} e {\it valor} separados pelo sinar
|
|
de igualdade. Os nomes de campo permitidos dependem da biblioteca ODBC.
|
|
Tipicamente os seguintes nomes-de-campo são permitidos:
|
|
|
|
\verb|DATABASE | base de dados;
|
|
|
|
\verb|DRIVER | controlador ODBC;
|
|
|
|
\verb|DSN | nome de uma fonte de dados;
|
|
|
|
\verb|FILEDSN | nome de um arquivo de fonte de dados;
|
|
|
|
\verb|PWD | senha de usuário;
|
|
|
|
\verb|SERVER | base de dados;
|
|
|
|
\verb|UID | nome de usuário.
|
|
|
|
O segundo argumento e todos os seguintes são considerados como
|
|
sentenças SQL.
|
|
|
|
As sentenças SQL podem ser estendidas sobre múltiplos argumentos. Se o
|
|
último caractere de um argumento é um ponto e vírgula, este indica
|
|
o fim de uma sentença SQL.
|
|
|
|
Os argumentos de uma sentença SQL são concatenados separados por espaço.
|
|
O eventual ponto e vírgula final será removido.
|
|
|
|
Todas as sentenças SQL, exceto a última, serão executadas diretamente.
|
|
|
|
Para tabela-IN, a última sentença SQL pode ser um comando SELECT que se inicia
|
|
com \verb|'SELECT '| em letras maiúsculas. Se a cadeia não se inicia com
|
|
\verb|'SELECT '|, se considera que é um nome de uma tabela e uma sentença
|
|
SELECT é automaticamente gerada.
|
|
|
|
|
|
Para tabela-OUT, a última sentença SQL pode conter um ou múltiplos pontos de
|
|
interrogação. Se contém um ponto de interrogação, é considerado um gabarito
|
|
para a rotina de escrita. Caso contrário, a cadeia é considerada um
|
|
nome de tabela e um gabarito INSERT é automaticamente gerado.
|
|
|
|
A rotina de escrita usa um gabarito com o pontos de interrogação e
|
|
o substitui o primeiro ponto de interrogação pelo primeiro parâmetro
|
|
de saída, o segundo ponto de interrogação, pelo segundo parâmetro e
|
|
assim por diante. Em seguida, o comando SQL é emitido.
|
|
|
|
O que segue é um exemplo da sentença table de saída:
|
|
|
|
\begin{verbatim}
|
|
table ta { l in LOCAIS } OUT
|
|
'ODBC'
|
|
'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
'DROP TABLE IF EXISTS resultado;'
|
|
'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
|
|
'INSERT INTO resultado 'VALUES ( 4, ?, ? )' :
|
|
l ~ LOC, quantidade[l] ~ QUAN;
|
|
\end{verbatim}
|
|
|
|
% \newpage
|
|
|
|
\noindent
|
|
Alternativamente pode se escrever como segue:
|
|
|
|
\begin{verbatim}
|
|
table ta { l in LOCAIS } OUT
|
|
'ODBC'
|
|
'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
'DROP TABLE IF EXISTS resultado;'
|
|
'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
|
|
'resultado' :
|
|
l ~ LOC, quantidade[l] ~ QUAN, 4 ~ ID;
|
|
\end{verbatim}
|
|
|
|
O uso de gabaritos com `\verb|?|' não só permite INSERT, como também o
|
|
UPDATE, DELETE, etc. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
table ta { l in LOCAIS } OUT
|
|
'ODBC'
|
|
'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
'UPDATE resultado SET DATA = ' & data & ' WHERE ID = 4;'
|
|
'UPDATE resultado SET QUAN = ? WHERE LOC = ? AND ID = 4' :
|
|
quantidade[l], l;
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
% The ODBC table driver allows connecting to SQL databases using an
|
|
% implementation of the ODBC interface based on the Call Level Interface
|
|
% (CLI).\footnote{The corresponding software standard is defined in
|
|
% ISO/IEC 9075-3:2003.}
|
|
%
|
|
% \para{Debian GNU/Linux.}
|
|
% Under Debian GNU/Linux the ODBC table driver uses the iODBC
|
|
% package,\footnote{See {\tt<http://www.iodbc.org/>}.} which should be
|
|
% installed before building the GLPK package. The installation can be
|
|
% effected with the following command:
|
|
%
|
|
% \begin{verbatim}
|
|
% sudo apt-get install libiodbc2-dev
|
|
% \end{verbatim}
|
|
%
|
|
% Note that on configuring the GLPK package to enable using the iODBC
|
|
% library the option `\verb|--enable-odbc|' should be passed to the
|
|
% configure script.
|
|
%
|
|
% The individual databases should be entered for systemwide usage in
|
|
% \verb|/etc/odbc.ini| and\linebreak \verb|/etc/odbcinst.ini|. Database
|
|
% connections to be used by a single user are specified by files in the
|
|
% home directory (\verb|.odbc.ini| and \verb|.odbcinst.ini|).
|
|
%
|
|
% \para{Microsoft Windows.}
|
|
% Under Microsoft Windows the ODBC table driver uses the Microsoft ODBC
|
|
% library. To enable this feature the symbol:
|
|
%
|
|
% \begin{verbatim}
|
|
% #define ODBC_DLNAME "odbc32.dll"
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent
|
|
% should be defined in the GLPK configuration file `\verb|config.h|'.
|
|
%
|
|
% Data sources can be created via the Administrative Tools from the
|
|
% Control Panel.
|
|
%
|
|
% To choose the ODBC table driver its name in the table statement should
|
|
% be specified as \verb|'ODBC'| or \verb|'iODBC'|.
|
|
%
|
|
% \newpage
|
|
%
|
|
% The argument list is specified as follows.
|
|
%
|
|
% The first argument is the connection string passed to the ODBC library,
|
|
% for example:
|
|
%
|
|
% \verb|'DSN=glpk;UID=user;PWD=password'|, or
|
|
%
|
|
% \verb|'DRIVER=MySQL;DATABASE=glpkdb;UID=user;PWD=password'|.
|
|
%
|
|
% Different parts of the string are separated by semicolons. Each part
|
|
% consists of a pair {\it fieldname} and {\it value} separated by the
|
|
% equal sign. Allowable fieldnames depend on the ODBC library. Typically
|
|
% the following fieldnames are allowed:
|
|
%
|
|
% \verb|DATABASE | database;
|
|
%
|
|
% \verb|DRIVER | ODBC driver;
|
|
%
|
|
% \verb|DSN | name of a data source;
|
|
%
|
|
% \verb|FILEDSN | name of a file data source;
|
|
%
|
|
% \verb|PWD | user password;
|
|
%
|
|
% \verb|SERVER | database;
|
|
%
|
|
% \verb|UID | user name.
|
|
%
|
|
% The second argument and all following are considered to be SQL
|
|
% statements
|
|
%
|
|
% SQL statements may be spread over multiple arguments. If the last
|
|
% character of an argument is a semicolon this indicates the end of
|
|
% a SQL statement.
|
|
%
|
|
% The arguments of a SQL statement are concatenated separated by space.
|
|
% The eventual trailing semicolon will be removed.
|
|
%
|
|
% All but the last SQL statement will be executed directly.
|
|
%
|
|
% For IN-table the last SQL statement can be a SELECT command starting
|
|
% with the capitalized letters \verb|'SELECT '|. If the string does not
|
|
% start with \verb|'SELECT '| it is considered to be a table name and a
|
|
% SELECT statement is automatically generated.
|
|
%
|
|
% For OUT-table the last SQL statement can contain one or multiple
|
|
% question marks. If it contains a question mark it is considered a
|
|
% template for the write routine. Otherwise the string is considered a
|
|
% table name and an INSERT template is automatically generated.
|
|
%
|
|
% The writing routine uses the template with the question marks and
|
|
% replaces the first question mark by the first output parameter, the
|
|
% second question mark by the second output parameter and so forth. Then
|
|
% the SQL command is issued.
|
|
%
|
|
% The following is an example of the output table statement:
|
|
%
|
|
% \begin{verbatim}
|
|
% table ta { l in LOCATIONS } OUT
|
|
% 'ODBC'
|
|
% 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
% 'DROP TABLE IF EXISTS result;'
|
|
% 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
|
|
% 'INSERT INTO result 'VALUES ( 4, ?, ? )' :
|
|
% l ~ LOC, quantity[l] ~ QUAN;
|
|
% \end{verbatim}
|
|
%
|
|
% \newpage
|
|
%
|
|
% \noindent
|
|
% Alternatively it could be written as follows:
|
|
%
|
|
% \begin{verbatim}
|
|
% table ta { l in LOCATIONS } OUT
|
|
% 'ODBC'
|
|
% 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
% 'DROP TABLE IF EXISTS result;'
|
|
% 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
|
|
% 'result' :
|
|
% l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID;
|
|
% \end{verbatim}
|
|
%
|
|
% Using templates with `\verb|?|' supports not only INSERT, but also
|
|
% UPDATE, DELETE, etc. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% table ta { l in LOCATIONS } OUT
|
|
% 'ODBC'
|
|
% 'DSN=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
% 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;'
|
|
% 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' :
|
|
% quantity[l], l;
|
|
% \end{verbatim}
|
|
|
|
|
|
\section{Controlador de tabelas MySQL}
|
|
|
|
O controlador de tabelas MySQL permite a conexão a base de dados MySQL.
|
|
|
|
\para{Debian GNU/Linux.}
|
|
No Debian GNU/Linux o controlador de tabelas MySQL usa o pacote MySQL,
|
|
\footnote{Para fazer o download de arquivos de desenvolvimento, ver
|
|
{\tt<http://dev.mysql.com/downloads/mysql/>}.} que deve ser instalado
|
|
antes da criação do pacote GLPK. A instalação pode ser efetuada com
|
|
o seguinte comando:
|
|
|
|
\begin{verbatim}
|
|
sudo apt-get install libmysqlclient15-dev
|
|
\end{verbatim}
|
|
|
|
Note que ao configurar o pacote GLPK para habilitar o uso da biblioteca MySQL
|
|
a opção `\verb|--enable-mysql|' deve ser passada ao script de
|
|
configuração.
|
|
|
|
\para{Microsoft Windows.}
|
|
No Microsoft Windows o controlador de tabelas MySQL também usa
|
|
a biblioteca MySQL. Para habilitar esta funcionalidade o símbolo:
|
|
|
|
\begin{verbatim}
|
|
#define MYSQL_DLNAME "libmysql.dll"
|
|
\end{verbatim}
|
|
|
|
\noindent
|
|
deve ser definido no arquivo de configuração do GLPK `\verb|config.h|'.
|
|
|
|
Para escolher o controlador de tabelas MySQL, seu nome na sentença table deve
|
|
ser especificada como \verb|'MySQL'|.
|
|
|
|
A lista de argumentos é especificada como segue.
|
|
|
|
O primeiro argumento especifica como conectar a base de dados no estilo DSN,
|
|
por exemplo:
|
|
|
|
\verb|'Database=glpk;UID=glpk;PWD=gnu'|.
|
|
|
|
Diferentes partes da cadeia são separadas por ponto e vírgula. Cada parte
|
|
consiste de um par {\it nome-do-campo} e {\it valor} separado pelo sinal
|
|
de igualdade. Os seguintes nomes de campo são permitidos:
|
|
|
|
% \newpage
|
|
|
|
\verb|Server | servidor rodando a base de dados (localhost por padrão);
|
|
|
|
\verb|Database | nome da base de dados;
|
|
|
|
\verb|UID | nome de usuário;
|
|
|
|
\verb|PWD | senha de usuário;
|
|
|
|
\verb|Port | porta usada pelo servidor (3306 por padrão).
|
|
|
|
O segundo argumento e todos os seguintes são considerados sentenças SQL.
|
|
|
|
Sentenças SQL podem se estender sobre múltiplos argumentos. Se o último
|
|
caractere de um argumento é um ponto e vírgula, isto indica o fim de uma
|
|
sentença SQL.
|
|
|
|
Os argumentos de uma sentença SQL são concatenados e separados por espaço.
|
|
O eventual ponto e vírgula final será removido.
|
|
|
|
Todas sentenças SQL, menos a última, serão executadas diretamente.
|
|
|
|
Para tabela-IN, a última sentença SQL pode ser um comando SELECT iniciado
|
|
com letras maiúsculas \verb|'SELECT '|. Se a cadeia não inicia com
|
|
\verb|'SELECT '| é considerado um nome de tabela e a sentença
|
|
SELECT é automaticamente gerada.
|
|
|
|
Para tabela-OUT, a última sentença SQL pode conter um ou múltiplos pontos de
|
|
interrogação. Se contém um ponto de interrogação, é considerado um gabarito
|
|
para a rotina de escrita. Caso contrário, a cadeia é considerada um
|
|
nome de tabela e um gabarito INSERT é automaticamente gerado.
|
|
|
|
A rotina de escrita usa um gabarito com o pontos de interrogação e
|
|
o substitui o primeiro ponto de interrogação pelo primeiro parâmetro
|
|
de saída, o segundo ponto de interrogação, pelo segundo parâmetro e
|
|
assim por diante. Em seguida, o comando SQL é emitido.
|
|
|
|
O que segue é um exemplo da sentença table de saída:
|
|
|
|
\begin{verbatim}
|
|
table ta { l in LOCAIS } OUT
|
|
'MySQL'
|
|
'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
'DROP TABLE IF EXISTS resultado;'
|
|
'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
|
|
'INSERT INTO resultado VALUES ( 4, ?, ? )' :
|
|
l ~ LOC, quantidade[l] ~ QUAN;
|
|
\end{verbatim}
|
|
|
|
\noindent
|
|
Alternativamente poderia ser escrito como segue:
|
|
|
|
\begin{verbatim}
|
|
table ta { l in LOCAIS } OUT
|
|
'MySQL'
|
|
'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
'DROP TABLE IF EXISTS resultado;'
|
|
'CREATE TABLE resultado ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
|
|
'resultado' :
|
|
l ~ LOC, quantidade[l] ~ QUAN, 4 ~ ID;
|
|
\end{verbatim}
|
|
|
|
% \newpage
|
|
|
|
O uso de gabaritos com `\verb|?|' não só permite INSERT, como também o
|
|
UPDATE, DELETE, etc. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
table ta { l in LOCAIS } OUT
|
|
'MySQL'
|
|
'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
'UPDATE resultado SET DATE = ' & date & ' WHERE ID = 4;'
|
|
'UPDATE resultado SET QUAN = ? WHERE LOC = ? AND ID = 4' :
|
|
quantidade[l], l;
|
|
\end{verbatim}
|
|
|
|
|
|
% The MySQL table driver allows connecting to MySQL databases.
|
|
%
|
|
% \para{Debian GNU/Linux.}
|
|
% Under Debian GNU/Linux the MySQL table driver uses the MySQL
|
|
% package,\footnote{For download development files see
|
|
% {\tt<http://dev.mysql.com/downloads/mysql/>}.} which should be
|
|
% installed before building the GLPK package. The installation can be
|
|
% effected with the following command:
|
|
%
|
|
% \begin{verbatim}
|
|
% sudo apt-get install libmysqlclient15-dev
|
|
% \end{verbatim}
|
|
%
|
|
% Note that on configuring the GLPK package to enable using the MySQL
|
|
% library the option `\verb|--enable-mysql|' should be passed to the
|
|
% configure script.
|
|
%
|
|
% \para{Microsoft Windows.}
|
|
% Under Microsoft Windows the MySQL table driver also uses the MySQL
|
|
% library. To enable this feature the symbol:
|
|
%
|
|
% \begin{verbatim}
|
|
% #define MYSQL_DLNAME "libmysql.dll"
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent
|
|
% should be defined in the GLPK configuration file `\verb|config.h|'.
|
|
%
|
|
% To choose the MySQL table driver its name in the table statement should
|
|
% be specified as \verb|'MySQL'|.
|
|
%
|
|
% The argument list is specified as follows.
|
|
%
|
|
% The first argument specifies how to connect the data base in the DSN
|
|
% style, for example:
|
|
%
|
|
% \verb|'Database=glpk;UID=glpk;PWD=gnu'|.
|
|
%
|
|
% Different parts of the string are separated by semicolons. Each part
|
|
% consists of a pair {\it fieldname} and {\it value} separated by the
|
|
% equal sign. The following fieldnames are allowed:
|
|
%
|
|
% \newpage
|
|
%
|
|
% \verb|Server | server running the database (defaulting to localhost);
|
|
%
|
|
% \verb|Database | name of the database;
|
|
%
|
|
% \verb|UID | user name;
|
|
%
|
|
% \verb|PWD | user password;
|
|
%
|
|
% \verb|Port | port used by the server (defaulting to 3306).
|
|
%
|
|
% The second argument and all following are considered to be SQL
|
|
% statements.
|
|
%
|
|
% SQL statements may be spread over multiple arguments. If the last
|
|
% character of an argument is a semicolon this indicates the end of
|
|
% a SQL statement.
|
|
%
|
|
% The arguments of a SQL statement are concatenated separated by space.
|
|
% The eventual trailing semicolon will be removed.
|
|
%
|
|
% All but the last SQL statement will be executed directly.
|
|
%
|
|
% For IN-table the last SQL statement can be a SELECT command starting
|
|
% with the capitalized letters \verb|'SELECT '|. If the string does not
|
|
% start with \verb|'SELECT '| it is considered to be a table name and a
|
|
% SELECT statement is automatically generated.
|
|
%
|
|
% For OUT-table the last SQL statement can contain one or multiple
|
|
% question marks. If it contains a question mark it is considered a
|
|
% template for the write routine. Otherwise the string is considered a
|
|
% table name and an INSERT template is automatically generated.
|
|
%
|
|
% The writing routine uses the template with the question marks and
|
|
% replaces the first question mark by the first output parameter, the
|
|
% second question mark by the second output parameter and so forth. Then
|
|
% the SQL command is issued.
|
|
%
|
|
% The following is an example of the output table statement:
|
|
%
|
|
% \begin{verbatim}
|
|
% table ta { l in LOCATIONS } OUT
|
|
% 'MySQL'
|
|
% 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
% 'DROP TABLE IF EXISTS result;'
|
|
% 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
|
|
% 'INSERT INTO result VALUES ( 4, ?, ? )' :
|
|
% l ~ LOC, quantity[l] ~ QUAN;
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent
|
|
% Alternatively it could be written as follows:
|
|
%
|
|
% \begin{verbatim}
|
|
% table ta { l in LOCATIONS } OUT
|
|
% 'MySQL'
|
|
% 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
% 'DROP TABLE IF EXISTS result;'
|
|
% 'CREATE TABLE result ( ID INT, LOC VARCHAR(255), QUAN DOUBLE );'
|
|
% 'result' :
|
|
% l ~ LOC, quantity[l] ~ QUAN, 4 ~ ID;
|
|
% \end{verbatim}
|
|
%
|
|
% \newpage
|
|
%
|
|
% Using templates with `\verb|?|' supports not only INSERT, but also
|
|
% UPDATE, DELETE, etc. For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% table ta { l in LOCATIONS } OUT
|
|
% 'MySQL'
|
|
% 'Database=glpkdb;UID=glpkuser;PWD=glpkpassword'
|
|
% 'UPDATE result SET DATE = ' & date & ' WHERE ID = 4;'
|
|
% 'UPDATE result SET QUAN = ? WHERE LOC = ? AND ID = 4' :
|
|
% quantity[l], l;
|
|
% \end{verbatim}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% ##################### PAREI AQUI % #####################
|
|
|
|
\chapter{Resolvendo modelos com glpsol}
|
|
|
|
O pacote GLPK \footnote{{\tt http://www.gnu.org/software/glpk/}}
|
|
inclui o programa {\tt glpsol}, um solver de PL/PIM autônomo. Este
|
|
programa pode ser chamado por uma linha de comando ou pelo shell para
|
|
resolver modelos escritos na \linebreak linguagem de modelagem GNU MathProg.
|
|
|
|
Para comunicar ao solver que o arquivo de entrada contém uma descrição
|
|
do modelo, é necessário especificar a opção \verb|--model| na linha de
|
|
comando. Por exemplo:
|
|
|
|
\begin{verbatim}
|
|
glpsol --model foo.mod
|
|
\end{verbatim}
|
|
|
|
Às vezes é necessário usar a seção de dados posicionado em um arquivo
|
|
separado. Neste caso, deve-se usar o seguinte comando:
|
|
|
|
\begin{verbatim}
|
|
glpsol --model foo.mod --data foo.dat
|
|
\end{verbatim}
|
|
|
|
\noindent Note que ser o arquivo de modelo também contém a seção de dados,
|
|
aquela seção é ignorada.
|
|
|
|
Também é permitido especificar mais de um arquivo contendo a seção de dados,
|
|
por exemplo:
|
|
|
|
\begin{verbatim}
|
|
glpsol --model foo.mod --data foo1.dat --data foo2.dat
|
|
\end{verbatim}
|
|
|
|
Se a descrição do modelo contém alguma sentença display e/ou printf,
|
|
o resultado é enviado para o terminal por padrão. Se há a necessidade
|
|
de redirecionar a saída para um arquivo, deve-se usar o seguinte comando:
|
|
|
|
\begin{verbatim}
|
|
glpsol --model foo.mod --display foo.out
|
|
\end{verbatim}
|
|
|
|
Se há a necessidade de ver o problema que está sendo gerado pelo tradutor
|
|
de modelo, deve-ser usar a opção \verb|--wlp| como segue:
|
|
|
|
\begin{verbatim}
|
|
glpsol --model foo.mod --wlp foo.lp
|
|
\end{verbatim}
|
|
|
|
\noindent Neste caso, os dados do problema são escritos no arquivo
|
|
\verb|foo.lp| no formato CPLEX LP viável para análise visual.
|
|
|
|
Ás vezes, é necessário checar a descrição do modelo sem ter que resolver
|
|
a instância do problema gerado. Neste caso, deve-se especificar a opção
|
|
\verb|--check|, por exemplo:
|
|
|
|
\begin{verbatim}
|
|
glpsol --check --model foo.mod --wlp foo.lp
|
|
\end{verbatim}
|
|
|
|
\newpage
|
|
|
|
Se há a necessidade de escrever uma solução numérica obtida pelo solver
|
|
para um arquivo, deve-se usar o seguinte comando:
|
|
|
|
\begin{verbatim}
|
|
glpsol --model foo.mod --output foo.sol
|
|
\end{verbatim}
|
|
|
|
\noindent neste caso, a solução é escrita no arquivo \verb|foo.sol|
|
|
em formato de texto plano, viável para análise visual.
|
|
|
|
A lista completa de opções do \verb|glpsol| pode ser encontrada no manual
|
|
de referência do GLPK incluída na distribuição do GLPK.
|
|
|
|
|
|
|
|
% The GLPK package\footnote{{\tt http://www.gnu.org/software/glpk/}}
|
|
% includes the program {\tt glpsol}, a stand-alone LP/MIP solver. This
|
|
% program can be launched from the command line or from the shell to
|
|
% solve models written in the GNU MathProg modeling language.
|
|
%
|
|
% To tell the solver that the input file contains a model description you
|
|
% need to specify the option \verb|--model| in the command line.
|
|
% For example:
|
|
%
|
|
% \begin{verbatim}
|
|
% glpsol --model foo.mod
|
|
% \end{verbatim}
|
|
%
|
|
% Sometimes it is necessary to use the data section placed in a separate
|
|
% file, in which case you may use the following command:
|
|
%
|
|
% \begin{verbatim}
|
|
% glpsol --model foo.mod --data foo.dat
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent Note that if the model file also contains the data section,
|
|
% that section is ignored.
|
|
%
|
|
% It is also allowed to specify more than one file containing the data
|
|
% section, for example:
|
|
%
|
|
% \begin{verbatim}
|
|
% glpsol --model foo.mod --data foo1.dat --data foo2.dat
|
|
% \end{verbatim}
|
|
%
|
|
% If the model description contains some display and/or printf
|
|
% statements, by default the output is sent to the terminal. If you need
|
|
% to redirect the output to a file, you may use the following command:
|
|
%
|
|
% \begin{verbatim}
|
|
% glpsol --model foo.mod --display foo.out
|
|
% \end{verbatim}
|
|
%
|
|
% If you need to look at the problem, which has been generated by the
|
|
% model translator, you may use the option \verb|--wlp| as follows:
|
|
%
|
|
% \begin{verbatim}
|
|
% glpsol --model foo.mod --wlp foo.lp
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent In this case the problem data is written to file
|
|
% \verb|foo.lp| in CPLEX LP format suitable for visual analysis.
|
|
%
|
|
% Sometimes it is needed merely to check the model description not
|
|
% solving the generated problem instance. In this case you may specify
|
|
% the option \verb|--check|, for example:
|
|
%
|
|
% \begin{verbatim}
|
|
% glpsol --check --model foo.mod --wlp foo.lp
|
|
% \end{verbatim}
|
|
%
|
|
% \newpage
|
|
%
|
|
% If you need to write a numeric solution obtained by the solver to
|
|
% a file, you may use the following command:
|
|
%
|
|
% \begin{verbatim}
|
|
% glpsol --model foo.mod --output foo.sol
|
|
% \end{verbatim}
|
|
%
|
|
% \noindent in which case the solution is written to file \verb|foo.sol|
|
|
% in a plain text format suitable for visual analysis.
|
|
%
|
|
% The complete list of the \verb|glpsol| options can be found in the
|
|
% GLPK reference manual included in the GLPK distribution.
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\chapter{Exemplo de descrição de modelo}
|
|
|
|
\section{Descrição de modelo escrito em MathProg}
|
|
|
|
Este é um exemplo completo de descrição de modelo escrito na linguagem
|
|
de modelagem GNU MathProg.
|
|
|
|
\bigskip
|
|
|
|
\begin{verbatim}
|
|
# UM PROBLEMA DE TRANSPORTE
|
|
#
|
|
# Este problema encontra a logística de custo mínimo que atende das demandas
|
|
# de mercado e as ofertas das fábricas.
|
|
#
|
|
# Referência:
|
|
# Dantzig G B, "Linear Programming and Extensions."
|
|
# Princeton University Press, Princeton, New Jersey, 1963,
|
|
# Chapter 3-3.
|
|
|
|
set I;
|
|
/* fábricas de enlatados*/
|
|
|
|
set J;
|
|
/* mercados */
|
|
|
|
param a{i in I};
|
|
/* capacidade da fábrica i, em caixas */
|
|
|
|
param b{j in J};
|
|
/* demanda no mercado j, em caixas */
|
|
|
|
param d{i in I, j in J};
|
|
/* distância, em milhares de milhas */
|
|
|
|
param f;
|
|
/* frete, em dólares por caixa a cada mil milhas */
|
|
|
|
param c{i in I, j in J} := f * d[i,j] / 1000;
|
|
/* custo de transporte, em milhares de dólares por caixa */
|
|
|
|
var x{i in I, j in J} >= 0;
|
|
/* quantidade enviada, em caixas */
|
|
|
|
minimize custo: sum{i in I, j in J} c[i,j] * x[i,j];
|
|
/* custo total de transporte, em milhares de dólares */
|
|
|
|
s.t. suprimento{i in I}: sum{j in J} x[i,j] <= a[i];
|
|
/* observa o limite de suprimento na fábrica i */
|
|
|
|
s.t. demanda{j in J}: sum{i in I} x[i,j] >= b[j];
|
|
/* satisfaz a demanda do mercado j */
|
|
|
|
data;
|
|
|
|
set I := Seattle San-Diego;
|
|
|
|
set J := New-York Chicago Topeka;
|
|
|
|
param a := Seattle 350
|
|
San-Diego 600;
|
|
|
|
param b := New-York 325
|
|
Chicago 300
|
|
Topeka 275;
|
|
|
|
param d : New-York Chicago Topeka :=
|
|
Seattle 2.5 1.7 1.8
|
|
San-Diego 2.5 1.8 1.4 ;
|
|
|
|
param f := 90;
|
|
|
|
end;
|
|
\end{verbatim}
|
|
|
|
|
|
% Below here is a complete example of the model description written in
|
|
% the GNU MathProg modeling language.
|
|
%
|
|
% \bigskip
|
|
%
|
|
% \begin{verbatim}
|
|
% # A TRANSPORTATION PROBLEM
|
|
% #
|
|
% # This problem finds a least cost shipping schedule that meets
|
|
% # requirements at markets and supplies at factories.
|
|
% #
|
|
% # References:
|
|
% # Dantzig G B, "Linear Programming and Extensions."
|
|
% # Princeton University Press, Princeton, New Jersey, 1963,
|
|
% # Chapter 3-3.
|
|
%
|
|
% set I;
|
|
% /* canning plants */
|
|
%
|
|
% set J;
|
|
% /* markets */
|
|
%
|
|
% param a{i in I};
|
|
% /* capacity of plant i in cases */
|
|
%
|
|
% param b{j in J};
|
|
% /* demand at market j in cases */
|
|
%
|
|
% param d{i in I, j in J};
|
|
% /* distance in thousands of miles */
|
|
%
|
|
% param f;
|
|
% /* freight in dollars per case per thousand miles */
|
|
%
|
|
% param c{i in I, j in J} := f * d[i,j] / 1000;
|
|
% /* transport cost in thousands of dollars per case */
|
|
%
|
|
% var x{i in I, j in J} >= 0;
|
|
% /* shipment quantities in cases */
|
|
%
|
|
% minimize cost: sum{i in I, j in J} c[i,j] * x[i,j];
|
|
% /* total transportation costs in thousands of dollars */
|
|
%
|
|
% s.t. supply{i in I}: sum{j in J} x[i,j] <= a[i];
|
|
% /* observe supply limit at plant i */
|
|
%
|
|
% s.t. demand{j in J}: sum{i in I} x[i,j] >= b[j];
|
|
% /* satisfy demand at market j */
|
|
%
|
|
% data;
|
|
%
|
|
% set I := Seattle San-Diego;
|
|
%
|
|
% set J := New-York Chicago Topeka;
|
|
%
|
|
% param a := Seattle 350
|
|
% San-Diego 600;
|
|
%
|
|
% param b := New-York 325
|
|
% Chicago 300
|
|
% Topeka 275;
|
|
%
|
|
% param d : New-York Chicago Topeka :=
|
|
% Seattle 2.5 1.7 1.8
|
|
% San-Diego 2.5 1.8 1.4 ;
|
|
%
|
|
% param f := 90;
|
|
%
|
|
% end;
|
|
% \end{verbatim}
|
|
|
|
\newpage
|
|
|
|
\section{Instância gerada do problema de PL}
|
|
|
|
Este é o resultado da tradução do modelo de exemplo produzido
|
|
pelo solver \verb|glpsol| e escrito no formato CPLEX LP
|
|
com a opção \verb|--wlp|.
|
|
|
|
\medskip
|
|
|
|
\begin{verbatim}
|
|
\* Problem: transporte *\
|
|
|
|
Minimize
|
|
custo: + 0.225 x(Seattle,New~York) + 0.153 x(Seattle,Chicago)
|
|
+ 0.162 x(Seattle,Topeka) + 0.225 x(San~Diego,New~York)
|
|
+ 0.162 x(San~Diego,Chicago) + 0.126 x(San~Diego,Topeka)
|
|
|
|
Subject To
|
|
suprimento(Seattle): + x(Seattle,New~York) + x(Seattle,Chicago)
|
|
+ x(Seattle,Topeka) <= 350
|
|
suprimento(San~Diego): + x(San~Diego,New~York) + x(San~Diego,Chicago)
|
|
+ x(San~Diego,Topeka) <= 600
|
|
demanda(New~York): + x(Seattle,New~York) + x(San~Diego,New~York) >= 325
|
|
demanda(Chicago): + x(Seattle,Chicago) + x(San~Diego,Chicago) >= 300
|
|
demanda(Topeka): + x(Seattle,Topeka) + x(San~Diego,Topeka) >= 275
|
|
|
|
End
|
|
\end{verbatim}
|
|
|
|
\section{solução ótima do problema de PL}
|
|
|
|
Esta é a solução ótima da instância gerada do problema de PL
|
|
encontrada pelo solver \verb|glpsol| e escrita em formato de texto plano
|
|
com a opção\verb|--output|.
|
|
|
|
\medskip
|
|
|
|
\begin{footnotesize}
|
|
\begin{verbatim}
|
|
Problem: transporte
|
|
Rows: 6
|
|
Columns: 6
|
|
Non-zeros: 18
|
|
Status: OPTIMAL
|
|
Objective: custo = 153.675 (MINimum)
|
|
|
|
No. Row name St Activity Lower bound Upper bound Marginal
|
|
------ ------------ -- ------------- ------------- ------------- -------------
|
|
1 cust B 153.675
|
|
2 suprimento[Seattle]
|
|
NU 350 350 < eps
|
|
3 suprimento[San-Diego]
|
|
B 550 600
|
|
4 demanda[New-York]
|
|
NL 325 325 0.225
|
|
5 demanda[Chicago]
|
|
NL 300 300 0.153
|
|
6 demanda[Topeka]
|
|
NL 275 275 0.126
|
|
|
|
No. Column name St Activity Lower bound Upper bound Marginal
|
|
------ ------------ -- ------------- ------------- ------------- -------------
|
|
1 x[Seattle,New-York]
|
|
B 50 0
|
|
2 x[Seattle,Chicago]
|
|
B 300 0
|
|
3 x[Seattle,Topeka]
|
|
NL 0 0 0.036
|
|
4 x[San-Diego,New-York]
|
|
B 275 0
|
|
5 x[San-Diego,Chicago]
|
|
NL 0 0 0.009
|
|
6 x[San-Diego,Topeka]
|
|
B 275 0
|
|
|
|
End of output
|
|
\end{verbatim}
|
|
\end{footnotesize}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\newpage
|
|
|
|
\section*{Agradecimentos}
|
|
\addcontentsline{toc}{chapter}{Agradecimentos}
|
|
|
|
Os autores gostariam de agradecer as seguintes pessoas que gentilmente leram,
|
|
comentaram e corrigiram o rascunho deste documento:
|
|
|
|
\noindent Juan Carlos Borras \verb|<borras@cs.helsinki.fi>|
|
|
|
|
\noindent Harley Mackenzie \verb|<hjm@bigpond.com>|
|
|
|
|
\noindent Robbie Morrison \verb|<robbie@actrix.co.nz>|
|
|
|
|
\end{document}
|