Você está na página 1de 86

Notas de aula de Pesquisa Operacional Aplicada ` Minerao. a ca c Universidade Federal de Ouro Preto.

PESQUISA OPERACIONAL
` APLICADA A

MINERACAO

Marcone Jamilson Freitas Souza Alexandre Xavier Martins Tatiana Alves Costa Frederico Augusto C. Guimares a Jos Maria do Carmo Bento Alves e

Departamento de Computao ca Instituto de Cincias Exatas e Biolgicas e o Universidade Federal de Ouro Preto

Pesquisa Operacional Aplicada ` Minerao a ca

Sumrio a
I OTIMIZADOR LINGO 5
5 5 6 6 7 7 7 7 8 8 8 8 9 9 9 10 10 10 11 11 11 12 12 13 15 15 17 17 18 19 19 20 20 20 22

1 Introduo ca 2 Restries Lineares co 3 Introduo ` Linguagem de Modelagem do LINGO ca a 3.1 Funao Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c 3.2 Restries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co 4 Adicionando Caracter sticas 4.1 Rotulando as Restries . co 4.2 Intitulando o Modelo . . . 4.3 Inserindo comentrios . . . a ` Linguagem de Modelagem a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 Operadores e Funes do LINGO co 5.1 Operadores Aritmticos . . . . . . e 5.2 Operadores Lgicos . . . . . . . . . o 5.3 Operadores Relacionais . . . . . . . 5.4 N de prioridade dos operadores vel 5.5 Funoes matemticas . . . . . . . . c a 5.6 Funoes de probabilidade . . . . . . c 5.7 Funoes de dom c nio . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

6 O modelo LINGO do Problema de Transporte 7 SETS (Conjuntos) 7.1 Porque SETS? . . . . . . . . . . . . . 7.2 O que so SETS? . . . . . . . . . . . a 7.3 Seo SETS . . . . . . . . . . . . . . ca 7.4 Denindo Conjuntos Primitivos . . . 7.5 Denindo conjuntos derivados . . . . 7.6 Funoes sobre conjuntos . . . . . . . c 7.7 Funoes de manipulao de conjuntos c ca 8 Seo DATA ca 8.1 Introduo ` seo DATA . . . . ca a ca 8.2 Parmetros . . . . . . . . . . . . a 8.3 Anlise E se. . . . . . . . . . . . a 8.4 Inicializando um atributo com um 8.5 Omitindo valores na seo DATA ca

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . simples valor . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

9 Utilizando Arquivos-texto 9.1 Importando dados de um arquivo texto com @FILE . . . . . . . . . . . . . . . . . 9.2 Exportando dados para um arquivo com @TEXT . . . . . . . . . . . . . . . . . .

Modelagem de PPLs 10 Utilizando planilhas do EXCEL 10.1 Funao @OLE . . . . . . . . . . . . . . . . . c 10.2 Importando dados do EXCEL com @OLE . 10.3 Denindo nomes no EXCEL . . . . . . . . . 10.4 Excluindo um nome denido no EXCEL . . 10.5 Exportando dados para EXCEL com @OLE 10.6 Algumas consideraes sobre @OLE . . . . . co 11 Embutindo planilhas do EXCEL no LINGO 12 Embutindo Modelos LINGO no EXCEL 13 Utilizando links OLE automatizados no EXCEL 13.1 Comando SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 23 23 23 25 27 27 29 30 32 34 38

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

II

Modelagem de Problemas de Programao Linear ca

39
39 39 41 41 45 47 47 51 51 54 54 57 60 60 62 64 64 65 65 67 69 72 72

Carteira de Investimentos Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mistura de Minrios com Custos e Problema 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Problema 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mistura de Minrios com Metas e Problema 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Problema das Usinas Problema 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Planejamento da Produo ca Problema 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Problema 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alocao de Pessoal ca Problema 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Problema 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formao de Ligas ca Problema 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Corte de Estoque Unidimensional (Cutting Stock Problem) Problema 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Problema 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Problema 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Corte de Estoque Bidimensional Problema 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Pesquisa Operacional Aplicada ` Minerao a ca 73 73 75 75 77 77 79 79 81 81 82 82 84 84

Mochila 0-1 Problema 15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mochila 0-1 M ltipla u Problema 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mochila Inteira Problema 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mochila Inteira M ltipla u Problema 18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Localizao ca Problema 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caixeiro Viajante Problema 20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Roteamento de Ve culos Problema 21 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Parte I

OTIMIZADOR LINGO
1 Introduo ca
O LINGO uma ferramenta computacional para modelagem e resoluo de problemas lineares e ca e no-lineares de otimizao. O processo de otimizao consiste em tentar encontrar a melhor a ca ca soluo poss para um dado problema, usando tcnicas de programao matemtica, de forma ca vel e ca a a atingir o maior benef cio/lucro ou gerar o menor custo/desperd cio. Problemas de otimizao so ca a classicados como lineares ou no-lineares, dependendo se os relacionamentos entre as variveis a a do problema so lineares ou no, respectivamente. a a

Restries Lineares co

Se todos os termos das variveis so de primeira ordem, a restrio dita linear. Isto signica a a ca e que a restrio no contm uma varivel quadrtica, cbica, ou elevada a qualquer potncia, um ca a e a a u e termo dividido por uma varivel, ou uma varivel multiplicada por outra. Alm disso, deve existir a a e proporcionalidade, ou seja, para cada unidade adicionada ou retirada de uma varivel, o valor da a restrio aumentar ou reduzir em uma quantidade xada. ca a a Frmulas lineares so relaes que podem ser gracamente representadas por uma linha reta. o a co Sua forma bsica pode ser escrita como: a y = mx + b onde m e b so constantes. a Suponha, por exemplo, que um quilo de tomate custe R$ 1,50. A expresso ou funo usada a ca para calcular o custo (c) em termos da quantidade de tomate comprada (t) : e c = 1.5 t Como esperado, o grco da funo de custo uma linha reta: a ca e

Expresses lineares podem ter mltiplos valores, como por exemplo, se forem acrescentados ` o u a funo acima o custo de batatas (b) a R$ 0,75 e mas (m) a R$ 1,25, ter ca ca amos: c = 1.5 t + 0.75 b + 1.25 m

6 Esta nova expresso de custo formada continua sendo linear. Pode-se dizer que ela e a soma a de trs expresses lineares simples. e o Como os modelos lineares podem ser resolvidos de forma mais rpida em ordens de magnitude a e com maior preciso do que os modelos no-lineares, prefer que os modelos sejam formulados a a e vel usando expresses lineares sempre que poss o vel. Para problemas representados por modelos lineares, quando completamente resolvidos pelo LINGO (sem serem interrompidos), tem-se a garantia que o valor da funo objetivo encontrado ca timo, ou seja, o melhor valor poss para o problema em questo. Tal garantia no ocorre eo e vel a a no caso de modelos no-lineares, j que os mesmos podem car presos em timos locais, como a a o mostra a gura abaixo, que ilustra o caso de uma funo objetivo no-linear. ca a

Algumas expresses no-lineares podem ser facilmente convertidas em lineares. Considere a o a restrio abaixo: ca x/y = 10; Da forma como est escrita, essa restrio no-linear porque x est sendo dividido por y. a ca e a a Simplesmente multiplicando ambos os lados por y, temos a restrio linear equivalente: ca x = 10 y;

3
3.1

Introduo ` Linguagem de Modelagem do LINGO ca a


Funo Objetivo ca

A linguagem de modelagem do LINGO permite representar a funo objetivo de forma bastante ca simples e intuitiva. Para exemplicar, considere dois conjuntos, fabricas e armazens, e uma matriz rotas de elementos (i, j), com i fabricas e j armazens. As funes objetivo a seguir: co minimizar
ifabricas jarmazens

custoij qtdEnviadaij lucroij qtdEnviadaij

maximizar
if abricas jarmazens

so assim representadas no LINGO: a MIN = @SUM(fabricas(i): @SUM(armazens(j): custo(i,j)*qtdEnviada(i,j))); MAX = @SUM(fabricas(i): @SUM(armazens(j): lucro(i,j)*qtdEnviada(i,j))); ou, equivalentemente: MIN = @SUM(rotas(i,j): custo(i,j)*qtdEnviada (i,j)); MAX = @SUM(rotas(i,j): lucro(i,j)*qtdEnviada(i,j));

3.2

Restries co

Assim como na funo objetivo, podemos usar a linguagem de modelagem do LINGO para repreca sentar as restries do problema de forma simples e direta. co Para as seguintes restries em notao matemtica: co ca a (qtdEnviadaij ) capacidadei
jarmazens

i fabricas j armazens

(qtdEnviadaij ) = demandaj
ifabricas

temos a seguinte representao no LINGO: ca @FOR(fabricas(i): @SUM(armazens(j): qtdEnviada(i,j)) <= capacidade(i)); @FOR(armazens(j): @SUM(fabricas(i): qtdEnviada(i,j)) = demanda(j)); Obs: Toda restrio do tipo escrita no LINGO comeando com a funo @FOR. ca e c ca

4
4.1

Adicionando Caracter sticas ` Linguagem de Modelagem a


Rotulando as Restries co

O LINGO permite que as restries sejam rotuladas com nomes. Este recurso util por duas co e razes: o - Os nomes so usados nos relatrios das solues geradas para torn-los mais fceis de serem a o co a a interpretados. - Muitas das mensagens de erro do LINGO referem-se aos nomes dados `s restries. Caso as a co restries no sejam rotuladas, localizar a fonte desses erros pode ser bastante dif co a cil. Rotular restries extremamente simples. Basta inserir um nome entre colchetes no in co e cio da restrio. O nome deve obedecer aos requisitos padres do LINGO, a saber: todo nome ca o deve comear com um caracter alfabtico (A-Z); caracteres subseqentes devem ser alfabticos, c e u e numricos (0-9), ou o underscore ( ); os nomes no podem ter mais que 32 caracteres. Abaixo e a so mostrados alguns exemplos: a [FO] MIN = @SUM(rotas(i,j): custo(i,j)*qtdEnviada(i,j)); @FOR(armazens(j): [Dem Armazem] @SUM(fabricas(i): qtdEnviada(i,j)) = demanda(j));

4.2

Intitulando o Modelo

Um t tulo pode ser inserido para um modelo. Se um t tulo for inclu do, ele ser exibido no topo a do relatrio da soluo gerada. o ca No exemplo a seguir, o modelo foi intitulado de Problema de Transporte. MODEL: TITLE: Problema de Transporte;

4.3

Inserindo comentrios a

Um comentrio pode ser denido utilizando um sinal de exclamao (!) e um ponto e v a ca rgula (;), os quais determinam respectivamente o seu inicio e m. Um exemplo de comentrio exibido a seguir: a e ! As capacidades das fbricas no podem ser ultrapassadas; a a @FOR(fabricas(i): @SUM(armazens(j): qtdEnviada(i,j)) <= capacidade(i));

Operadores e Funes do LINGO co

Os operadores podem ser: binrios, quando requererem dois argumentos - um imediatamente ` a a esquerda do operador e outro imediatamente ` direita; ou unrios, quando requererem apenas um a a argumento.

5.1

Operadores Aritmticos e

Operadores aritmticos so aqueles que trabalham com valores numricos. O LINGO possui cinco e a e operadores aritmticos binrios, como mostrado a seguir: e a Operador Descrio ca Exponenciao ca Multiplicao ca Diviso a Adio ca Subtrao ca

* / + -

O unico operador aritmtico unrio o de negao (-) que, neste caso, aplicado ao operando e a e ca e imediatamente ` direita do sinal de negao. a ca

5.2

Operadores Lgicos o

No LINGO, os operadores lgicos so principalmente usados em expresses condicionais, denidas o a o nas funes sobre conjuntos, para controlar quais dos seus membros sero inclu co a dos ou exclu na do funo. Eles tambm possuem um importante papel na construo dos membros de um conjunto. ca e ca Esses recursos sero mostrados mais adiante neste cap a tulo. Operadores lgicos retornam TRUE ou FALSE como resultado. O LINGO usa o valor 1 para o representar TRUE e o valor 0 para representar FALSE. A linguagem de modelagem do LINGO inclui nove operadores lgicos, sendo todos binrios, a o a exceo do operador unrio #NOT#. ca a

Operador #NOT# #EQ# #NE# #GE# #GT# #LE# #LT# #AND# #OR#

Valor de Retorno TRUE se o operando imediatamente a direita FALSE e TRUE se os operandos so iguais a TRUE se os operandos no so iguais a a TRUE se o operando da esquerda maior ou igual ao operando da direita e TRUE se o operando da esquerda estritamente maior que o operando da direita e TRUE se o operando da esquerda menor ou igual ao operando da direita e TRUE se o operando da esquerda estritamente menor que o operando da direita e TRUE se ambos os operandos possuem valor TRUE FALSE se ambos os operandos possuem valor FALSE

5.3

Operadores Relacionais

No LINGO, operadores relacionais so usados no modelo para especicar se o lado ` esquerda de a a uma expresso deve ser igual, menor igual ou maior igual ao lado direito. Eles so usados para a a formar as restries que compem o modelo. co o O LINGO faz uso de trs operadores relacionais: e Operador = <= >= Descrio ca A expresso ` esquerda deve ser igual a expresso ` direita a a a a A expresso ` esquerda deve ser menor ou igual a expresso ` direita a a a a A expresso ` esquerda deve ser maior ou igual a expresso ` direita a a a a

O LINGO considera menor (<) como sendo menor ou igual (<=) e maior (>) como sendo maior ou igual (>=). Portanto, caso seja util usar A < B, a expresso deve ser convertida em a A + e <= B, onde e uma pequena constante no qual o valor depende do quanto A menor do e e que B. Para denir A < 10, com A inteiro, faa A <= 9. Se A for real, faa A <= 10 , onde c c 0 o erro mximo admiss e a vel.

5.4

N vel de prioridade dos operadores


Alto #NOT# -(negao) ca

* / + #EQ# #NE# #GT# #AND# #OR# Baixo <= = >=

#GE#

#LT#

#LE#

5.5

Funes matemticas co a

O LINGO oferece um conjunto padro de funes matemticas. Algumas destas funes so a co a co a listadas a seguir:

10 Funo ca @ABS(X) @COS(X) @SIN(X) @TAN(X) @FLOOR(X) @SMIN(X1,X2,...,XN) @SMAX(X1,X2,...,XN) Retorna Retorna Retorna Retorna Retorna Retorna Retorna o o o a o o o Retorno valor absoluto de X cosseno de X, onde X um ngulo em radianos e a seno de X, onde X um ngulo em radianos e a tangente de X, onde X um ngulo em radianos e a menor inteiro mais prximo de X o m nimo valor de X1, X2, ..., e XN mximo valor de X1, X2, ..., e XN a

5.6

Funes de probabilidade co

O LINGO possui uma srie de funes relacionadas ` probabilidade. Apenas @RAND apresene co a e tada aqui. Funo ca @RAND(SEED) Retorno Retorna um nmero randmico entre 0 e 1, deterministicamente u o dependente da semente (SEED) denida, sendo SEED um nmero inteiro u

5.7

Funes de dom co nio

Por default, o LINGO assume que as variveis so cont a a nuas e maiores ou iguais a 0. As funes de co dom impem restries adicionais `s variveis, determinando quais valores elas podem assumir. nio o co a a Essas funes e seus efeitos so descritos a seguir: co a Funo ca @BIN(varivel) a Descrio ca

Limita a varivel a assumir apenas valores binrios a a (0 ou 1). @BND(inferior,varivel,superior) Limita a varivel a assumir valores entre os valores a a inferior e superior (inferior varivel superior). a @FREE(varivel) a Permite que a varivel assuma quaisquer valores (-,0,+). a @GIN(varivel) a Restringe que a varivel assuma apenas valores inteiros. a A funo @FOR pode ser usada para aplicar as funes de dom ca co nio sobre todos os membros de um atributo. Esse recurso pode ser aplicado ao modelo Produo das Fabricas para indicar ca que a quantidade enviada de uma determinada fbrica para um armazm qualquer, deve ser um a e valor inteiro: @FOR(rotas(i,j): @GIN(qtdEnviada(i,j)));

O modelo LINGO do Problema de Transporte

A funo objetivo e as restries apresentadas nas sees 3.1 e 3.2 formam o modelo linear referente ca co co ao Problema de Transporte. A descrio deste problema apresentada a seguir: ca e Dado um conjunto de fontes de produo (fbricas), um conjunto de mercados consumidores ca a (armazns), e uma rede de poss e veis caminhos de transporte (rotas) das fontes de produo para ca os mercados, o objetivo da problema determinar o carregamento que minimiza o custo total e de transporte, de modo que as capacidades das fontes produtivas no sejam ultrapassadas e as a demandas dos mercados sejam atendidas.

11 O modelo LINGO do Problema de Transporte apresentado abaixo, em que se considera a e quantidade ofertada pelas fbricas maior que a soma das demandas dos armazns. a e MODEL: TITLE: Problema de Transporte [FO] MIN = @SUM(rotas(i,j): custo(i,j)*qtdEnviada(i,j)); ! As capacidades das fbricas no podem ser ultrapassadas; a a @FOR(fabricas(i): @SUM(armazens(j): qtdEnviada(i,j)) <= capacidade(i)); ! As demandas dos armazns devem ser atendidas; e @FOR(armazens(j): @SUM(fabricas(i): qtdEnviada(i,j)) = demanda(j)); @FOR(rotas(i,j): @GIN(qtdEnviada(i,j)); END O modelo LINGO completo relativo a esse problema apresentado ` pgina 21. Para o modelo e a a corrente falta a denio dos conjuntos fabricas, armazens e rotas, bem como a entrada de dados, ca o que feito por meio das sees SET e DATA, respectivamente, explicadas a seguir. e co

7
7.1

SETS (Conjuntos)
Porque SETS?

SETS so a base da linguagem de modelagem do LINGO. Eles permitem escrever uma srie de a e restries similares atravs de uma simples instruo. Tambm poss representar expresses co e ca e e vel o longas e frmulas complexas de maneira concisa. o

7.2

O que so SETS? a

SETS (conjuntos) so grupos de objetos relacionados. Um conjunto pode ser uma lista de proa dutos, caminhes, ou empregados. Cada membro de um conjunto pode ter associado a si uma o ou mais caracter sticas. Os valores dos atributos podem ser previamente conhecidos ou no pelo a LINGO. Por exemplo, cada produto em um conjunto produtos pode ter um atributo listando o seu preo, assim como cada caminho em um conjunto caminhoes pode ter um atributo de capacidade c a de carga. O LINGO reconhece dois tipos de conjuntos: primitivo e derivado. Um conjunto primitivo aquele formado somente por objetos que no podem ser reduzidos e a posteriormente. No modelo Problema de Transporte mostrado na seo 6, o conjunto fabricas, ca assim como o conjunto armazens, so exemplos de conjuntos primitivos. a Um conjunto derivado formado por um ou mais diferentes conjuntos. O conceito chave e e que ele deriva seus membros de um outro conjunto pr-existente. Novamente considerando o e modelo Problema de Transporte, o conjunto rotas formado pelos pares (i, j), onde i fabricas e j armazens, um conjunto derivado, pois gerado a partir dos conjuntos primitivos fabricas e e e armazens. Um conjunto derivado pode tambm ser composto por outros conjuntos derivados. e

12

7.3

Seo SETS ca

Conjuntos so denidos em uma seo opcional do modelo LINGO, chamada de seo SETS (seo a ca ca ca de conjuntos). Antes de usar um conjunto em um modelo LINGO, necessrio list-lo nesta seo. e a a ca A seo de conjuntos iniciada com a palavra-chave SETS: (incluindo os dois pontos), e termina ca e com a palavra chave ENDSETS. Um modelo pode no ter uma seo SETS ou ento, ter uma a ca a unica ou mltiplas sees SETS. A unica limitao com relao ao uso dessas sees a necessidade u co ca ca co e de denir um conjunto e seus atributos antes deles serem referenciados nas restries do modelo. co

7.4

Denindo Conjuntos Primitivos

Para denir um conjunto primitivo em uma seo SETS, devem ser especicados: ca o nome do conjunto; opcionalmente, seus membros (objetos contidos no conjunto); e opcionalmente, qualquer atributo que os membros dos conjuntos devam ter. A denio de um conjunto primitivo tem a seguinte sintaxe: ca nome [/lista de membros/] [: lista de atributos]; O uso dos colchetes indica que os itens lista de membros e lista de atributos so ambos a opcionais. O nome escolhido designa o conjunto e deve seguir as convenes padres do LINGO. No h co o a a distino entre caracteres maisculos e minsculos nos nomes. ca u u Uma lista de membros constitui os membros pertencentes ao conjunto. Se os membros so ina clu dos na denio do conjunto, eles podem ser listados explicitamente ou implicitamente. Caso ca os membros no sejam inclu a dos na denio do conjunto, eles devem ser denidos subseqenteca u mente na seo DATA do modelo. A seo DATA ser descrita mais adiante neste cap ca ca a tulo. Quando listados explicitamente, cada membro deve ter seu nome denido, opcionalmente separado por v rgulas. Os nomes dos membros devem respeitar as convenes do LINGO para nomes. co O exemplo a seguir exibe os membros do conjunto fabricas sendo explicitamente declarados: fabricas /F1 F2 F3 F4/: capacidade; ou fabricas /F1, F2, F3, F4/: capacidade; Quando listados implicitamente, no h a necessidade de declarar o nome de cada membro. O a a LINGO automaticamente gera os nomes de todos os membros do conjunto. A seguir so listadas a as diversas maneiras de se denir elementos de forma impl cita: ! membros: 1, 2, 3, 4, 5; fabricas / 1..5 /: capacidade; ! membros: cam3, cam4, cam5, cam6, cam7; caminhoes / cam3..cam7 /: capCarga; ! membros: mon, tue, wed, thu, fri; dias / mon..fri /: ; ! membros: oct, nov, dec, jan; meses / oct..jan /: ;

13 ! membros: oct2005, nov2005, dec2005, jan2006; meses ano / oct2005..jan2006 /: ; Outra alternativa utilizar a seo DATA como exemplicado a seguir: e ca DATA: n = 6; ENDDATA SETS: fabricas / 1..n /: capacidade; ENDSETS Os membros dos conjuntos podem ter um ou mais atributos especicados atravs da lista de e atributos. Um atributo uma propriedade denida para cada membro do conjunto. Os nomes e dados aos atributos devem seguir as convenes impostas pelo LINGO. O exemplo seguinte declara co dois atributos, capacidades e localizacao, para o conjunto fabricas. fabricas / 1..6 /: capacidade, localizacao;

7.5

Denindo conjuntos derivados

Para denir um conjunto derivado necessrio especicar: e a o nome do conjunto; seus conjuntos pais; opcionalmente, seus membros; e opcionalmente, qualquer atributo que os membros dos conjuntos devam ter. A lista de pais uma lista de conjuntos previamente denida, separadas por v e rgulas. Caso a lista de membros no seja especicada, o LINGO constri todas as combinaes poss a o co veis para os membros do novo conjunto derivado, utilizando os membros dos conjuntos pai. Como exemplo, considere os conjuntos abaixo: SETS: produtos / A B /; maquinas / M N /; semana / 1..2 /; permitido(produtos,maquinas,semana); ENDSETS Os membros do conjunto permitido so constitu a dos pelo LINGO, derivados dos conjuntos produtos, maquinas e semana. Esses membros so exibidos a seguir: a

14 Indice 1 2 3 4 5 6 7 8 Membro (A,M,1) (A,M,2) (A,N,1) (A,N,2) (B,M,1) (B,M,2) (B,N,1) (B,N,2)

A lista de membros opcional e usada quando se deseja limitar os membros em um subcone e junto de todas as combinaes poss co veis, derivadas dos conjuntos pais. Essa lista pode alternativamente ser especicada na seo DATA do modelo, descrita mais adiante. ca Quando um conjunto no possui uma lista de membros e, portanto, contm todas poss a e veis combinaes de membros derivados de seus conjuntos pais, ele referido como sendo um conjunto co e denso. Caso ele inclua uma lista de membros que o limita em um subconjunto da sua forma densa, ele dito conjunto esparso. e Uma lista de membros de um conjunto derivado pode ser constru usando: da uma lista explicita de membros; ou um ltro de membros. Ao declarar uma lista de membros expl citos necessrio denir todos os membros que iro e a a pertencer ao conjunto. Cada membro listado deve ser um membro do conjunto denso formado por todas poss veis combinaes dos conjuntos pais. Voltando ao conjunto permitido, do exemplo co acima, podemos ter: permitido(produtos, maquinas, semana) / A M 1, A N 2, B N 1 / ; Em muitos conjuntos esparsos, todos os membros satisfazem a alguma condio que os diferca encia dos no membros. Usar o ltro de membros envolve especicar uma condio lgica, a qual a ca o cada membro potencial deve satisfazer, para pertencer ao conjunto nal. Uma condio lgica ca o pode ser vista como um ltro que impede os membros, que no satisfazem algum critrio, de a e pertencerem ao conjunto esparso. Como exemplo, suponha um conjunto de nome caminhoes, e que cada caminho tenha um atributo chamado capacidade. Caso haja a necessidade de denir a o um subconjunto carga pesada derivado do conjunto caminhoes, que contenha somente caminhes com capacidade acima de 50000 kg, ter amos: carga pesada(caminhoes) | capacidade(&1) #GT# 50000: ; A barra vertical (|) marca o in do ltro de membros. O ltro permite que apenas caminhes cio o de grande porte (com capacidade acima de 50000 kg) pertenam ao conjunto carga pesada. O c s mbolo &1 conhecido como um e ndice marcador de lugar (placeholder). Ao construir um conjunto derivado que usa um ltro, o LINGO gera todas as poss veis combinaes de membros co originados dos conjuntos pais. Cada membro gerado atribu a &1 para que a condiao lgica e do c o seja testada. Caso o membro passe no teste, ele adicionado ao conjunto carga pesada. e

15

7.6

Funes sobre conjuntos co

As funes @MIN e @MAX so usadas para encontrar o m co a nimo e o mximo de uma expresso a a sobre os membros de um conjunto. Considerando o modelo Problema de Transporte apresentado na seo 9.1, podemos ter os seguintes exemplos: ca demanda min = @MIN(armazens(j): demanda(j)); demanda max = @MAX(armazens(j): demanda(j)); demanda1 = @MIN(armazens(j) | j #LE# 3: demanda(j)); demanda2 = @MAX(armazens(j) | capacidade(j) #GE# 500: demanda(j)); A funo @SUM utilizada para percorrer um conjunto e retornar o somatrio dos valores de ca e o um determinado atributo, referentes aos membros especicados. Utilizando o modelo Problema de Transporte, temos: demanda total = @SUM(armazens: demanda); ou demanda total = @SUM(armazens(j): demanda(j)); demanda1 = @SUM(armazens(j) | j #NE# 1: demanda(j)); demanda2 = @SUM(armazens(j) | capacidade(j) #GT# 100: demanda(j)); A funo @FOR usada para gerar restries utilizando os membros de um conjunto. Ela ca e co permite escrever uma restrio apenas uma vez e o LINGO ento trabalha gerando uma ocorrncia ca a e da restrio para cada membro do conjunto. Como exemplo, considere um conjunto de pilhas ca de minrio que devem ser retomadas por uma p-carregadeira, para compor uma determinada e a produo diria. Para cada pilha retomada deseja-se saber o nmero de caambadas realizadas ca a u c pela p-carregadeira: a @FOR(pilhas(i): numCacambadas(i) = retomado(i) / capCacamba); ou, considerando que capCacamba no pode ser nulo: a @FOR(pilhas(i) | capCacamba #NE# 0: numCacambadas(i) = retomado(i) / capCacamba); As funes sobre conjuntos podem ser aninhadas. As funes @SUM, @MAX e @MIN podem co co ser aninhadas dentro de qualquer outra funo. Por outro lado, a funo @FOR s pode ser ca ca o aninhada dentro de outras funes @FOR. Para o modelo Problema de Transporte, tem-se: co @FOR(armazens(j): @SUM(fabricas(i): qtdEnviada(i,j)) = demanda(j));

7.7

Funes de manipulao de conjuntos co ca

O LINGO oferece vrias funes que ajudam a manipular os conjuntos. Elas sero descritas a a co a seguir. A funo @IN retorna TRUE se o membro de um conjunto primitivo, especicado atravs de ca e seu ndice, pertence a um determinado conjunto. @IN(nome do conjunto, indice primitivo 1, [indice primitivo 2 . . . ]) Como mostra o exemplo a seguir, @IN pode ser usado juntamente com os operadores lgicos, o para gerar complementos de subconjuntos.

16 SETS fabricas / SEATTLE, DENVER, CHICAGO, ATLANTA /: ; fechadas(fabricas) / DENVER /: ; abertas(fabricas) | #NOT# @IN(fechadas, &1): ; ENDSETS O prximo exemplo ilustra como determinar se um elemento pertence ou no a um conjunto o a derivado espec co. Note que para obter o ndice dos elementos primitivos foi necessrio utilizar a a funo @INDEX, descrita a seguir. ca SETS s1 / A B C /: ; s2 / X Y Z /: ; s3(s1,s2) / A,X A,Z B,Y C,X /: ; ENDSETS pertence = @IN(s3, @INDEX(s1, B), @INDEX(s2, Y)); A funo @INDEX retorna o ca ndice de um elemento pertencente a um conjunto primitivo. @INDEX([nome do conjunto], elemento do conjunto primitivo) Se o nome do conjunto omitido, o LINGO retorna o e ndice do elemento do primeiro conjunto primitivo encontrado, cujo nome seja igual ao especicado atravs do elemento do conjunto primitivo. e Esta funo exemplicada a seguir: ca e SETS mulheres /DEBBIE, SUE, ALICE/ ; homens /BOB, JOE, SUE, FRED/; ENDSETS @INDEX(homens, SUE) retornaria o valor 3. J @INDEX(SUE) devolveria o valor 2, pois o a LINGO encontra primeiro o elemento SUE do conjunto mulheres. A funo @WRAP permite ligar o ultimo elemento de um determinado conjunto ao primeiro. ca Isto , quando o ultimo (respectivamente primeiro) membro de um conjunto atingido, por exeme e plo, por uma funo @FOR, usar @WRAP permitir ligar o ca a ndice do conjunto ao seu primeiro (respectivamente ultimo) membro. Este recurso particularmente util em modelos c e clicos. @WRAP (indice, limite) Formalmente, @WRAP retorna j de modo que j = indice k limite, onde k um inteiro e tal que j pertena ao intervalo [1, limite]. Informalmente, a funo @WRAP subtrai ou soma o c ca limite ao indice at que o valor a ser retornado esteja entre 1 e o limite. e Considerando um conjunto que contenha 3 elementos, como homens do exemplo anterior, podemos ter os seguintes valores para @WRAP:

17 @WRAP(-1, 3) = -1 @WRAP(0, 3) = 0 @WRAP(1, 3) = 1 @WRAP(2, 3) = 2 @WRAP(3, 3) = 3 @WRAP(4, 3) = 4 @WRAP(5, 3) = 5 - (-1) * 3 = 2 (-1) * 3 = 3 0*3=1 0*3=2 0*3=3 1*3=1 1*3=2

A funo @SIZE retorna o nmero de elementos contidos em um determinado conjunto, ou ca u seja, a cardinalidade deste conjunto. @SIZE(nome do conjunto) O uso desta funo torna o modelo mais independente, pois mesmo que o tamanho dos conjunca tos se altere, o modelo ainda se manter conciso. Isto pode ser melhor visualizado usando como a exemplo a funo @WRAP(indice, limite). Caso o limite fosse especicado como 3, qualquer ca alterao no tamanho do conjunto ao qual ele se refere tornaria o modelo incorreto. Por outro ca co lado, se o limite fosse especicado como @SIZE(nome do conjunto), alteraes no tamanho do conjunto no afetariam o modelo desenvolvido. a

8
8.1

Seo DATA ca
Introduo ` seo DATA ca a ca

A seo DATA permite isolar os dados do resto do modelo. Isto uma prtica util, pois facilita ca e a a manuteno do modelo e a escalabilidade das suas dimenses. Essa seo se inicia com a ca o ca palavra-chave DATA: (incluindo os dois pontos) e termina com a palavra-chave ENDDATA. Na seo DATA so escritas instrues que inicializam os membros e/ou os atributos dos conjuntos, ca a co previamente instanciados na seo SETS. Essas expresses possuem a seguinte sintaxe: ca o lista de objetos = lista de valores; A lista de objetos contm os nomes dos atributos e/ou um conjunto cujos membros sero inie a cializados, opcionalmente separados por v rgulas. No pode haver mais que um nome de conjunto a na lista de objetos, enquanto que vrios nomes de atributo so permitidos. a a A lista de valores contm os dados que sero atribu e a dos aos elementos da lista de objetos, opcionalmente separados por v rgulas. A seguir so apresentadas duas maneiras de se inicializar uma lista de atributos: a

18 SETS: set1 /A,B,C/: X, Y; ENDSETS DATA: X = 1, 2, 3; Y = 4, 5, 6; ENDDATA ou SETS: set1 /A,B,C/: X, Y; ENDSETS DATA: X, Y = 1, 4, 2, 5, 3, 6; ENDDATA Como mencionado anteriormente, membros de um conjunto podem ser inicializados na seo ca DATA. Utilizando esta tcnica para modicar o exemplo acima, temos: e SETS: set1: X, Y; ENDSETS DATA: set1, X, Y = A 1 4 B25 C 3 6; ENDDATA

8.2

Parmetros a

O LINGO no restringe o uso de apenas atributos e conjuntos no lado esquerdo das instrues a co declaradas na seo DATA. Variveis escalares (simples) tambm podem ser inicializadas na seo ca a e ca DATA. Quando isto ocorre, essas variveis so referidas como parmetros. a a a Como exemplo, suponha que um modelo utilize uma taxa de juros de 8.5% como um parmetro. a Isto poderia ser expresso da seguinte forma: DATA: taxa de juros = .085; ENDDATA

19 Assim como os atributos, vrios parmetros podem ser inicializados em uma unica instruo. a a ca Imagine agora que um novo parmetro, taxa de inacao, seja adicionado ao modelo acima. Deste a modo, teremos: DATA: taxa de juros, taxa de inacao = .085, .03; ENDDATA

8.3

Anlise E se. . . a

Suponha que um modelo utilize a taxa de inao como um parmetro. No sendo poss ca a a vel determinar um valor para esse parmetro no futuro, mas sabendo que ele pode cair dentro de uma a faixa entre 2% a 6%, este modelo poderia ser resolvido para vrios valores de taxa de inao, a ca variando dentro da faixa descrita, para analisar a sensibilidade deste modelo com relao ao ca parmetro. Esta anlise referida como e se. . . . Para denir um parmetro deste tipo, utilize o a a e a sinal de interrogao como mostra o exemplo a seguir: ca DATA: taxa de inacao = ?; ENDDATA O LINGO exibir uma caixa de entrada cada vez que o modelo for resolvido. a

O valor digitado na caixa de entrada ser atribu ao parmetro taxa de inacao. a do a

8.4

Inicializando um atributo com um simples valor

O LINGO permite inicializar todos os elementos de um atributo usando um unico valor. O exemplo a seguir, mostra como isto pode ser feito: SETS: dias / MO, TU, WE, TH, FR, SA, SU /: necessidade; ENDSETS DATA: necessidade = 20; ENDDATA

20 Se existem mltiplos atributos no lado esquerdo da instruo, ser necessrio um valor no lado u ca a a direito para cada atributo utilizado. Acrescentando ao exemplo um novo atributo custo, temos: SETS: dias / MO, TU, WE, TH, FR, SA, SU/: necessidade, custo; ENDSETS DATA: necessidade, custo = 20, 100; ENDDATA

8.5

Omitindo valores na seo DATA ca

Valores em uma instruo da seo DATA podem ser omitidos, caso no seja poss determin-los ca ca a vel a para alguns membros. Como exemplo, suponha uma fbrica que deseja planejar a sua capacidade a para os prximos 5 anos. Alm disso, suponha que a expanso da capacidade leve tempo para o e a ser encorajada e implementada. Sendo assim, seria imposs aumentar a capacidade nos dois vel primeiros anos. Neste caso, ter amos: SETS: anos /1..5/: capacidade; ENDSETS DATA: capacidade = 34, 34, , , ; ENDDATA O LINGO estar, portanto, livre para decidir os valores da capacidade para os trs ultimos a e anos.

9
9.1

Utilizando Arquivos-texto
Importando dados de um arquivo texto com @FILE

A funo de interface @FILE permite importar dados de um arquivo texto para um modelo ca qualquer. Isto particularmente util para incorporar dados, gravados em arquivos, `s sees e a co SETS e DATA. A sintaxe da funo @FILE apresentada a seguir: ca e @FILE(nome do aquivo); Quando esta funo utilizada no modelo, o LINGO ir ler os dados do arquivo especicado ca e a at que o m do arquivo seja atingido, ou uma marca de m de registro () seja encontrada. e Para subseqentes @FILE referidos em um mesmo modelo, que fazem uso de um mesmo arquivo, u o LINGO retoma a leitura do arquivo do ponto onde parou. Funes @FILE no podem ser co a aninhadas (embutir um @FILE em um arquivo que chamado por um @FILE). e Como exemplo, considere o modelo Problema de Transporte apresentado na seo 6, para 6 ca fbricas e 8 armazns. Sendo assim, tem-se: a e

21 SETS: fabricas / F1 F2 F3 F4 F5 F6 /: capacidade; armazens / A1 A2 A3 A4 A5 A6 A7 A8 / : demanda; rotas(fabricas,armazens): custo, qtdEnviada; ENDSETS DATA: capacidade = 60 55 51 43 41 52; demanda = 35 37 22 32 41 32 43 38; custo = 6 2 6 7 4 2 5 9 49538582 52197433 76739271 23957265 5 5 2 2 8 1 4 3; ENDDATA Com o objetivo de isolar completamente os dados do modelo, estes podem ser movidos para um arquivo texto. A modicao realizada apresentada a seguir. ca e SETS: fabricas / @FILE( Transporte.ldt) /: capacidade; armazens / @FILE( Transporte.ldt) / : demanda; rotas(fabricas,armazens): custo, qtdEnviada; ENDSETS DATA: capacidade = @FILE( Transporte.ldt); demanda = @FILE( Transporte.ldt); custo = @FILE( Transporte.ldt); ENDDATA Neste modelo, o arquivo Transporte.ldt (a extenso .ldt usada por conveno) dispe os a e ca o dados da seguinte maneira: ! Lista das fbricas; a F1 F2 F3 F4 F5 F6 ! Lista dos armazns; e A1 A2 A3 A4 A5 A6 A7 A8

22 ! Capacidade das fbricas; a 60 55 51 43 41 52 ! Demanda dos armazns; e 35 37 22 32 41 32 43 38 ! Custo de envio; 62674259 49538582 52197433 76739271 23957265 55228143 As sees do arquivo de dados entre so chamadas de registros. Se um arquivo no contm co a a e nenhum , o LINGO ler o arquivo inteiro como um unico registro. a O exemplo apresentado acima esclarece como as funes @FILE trabalham ao longo do modelo. co A primeira chamada a @FILE abre o arquivo Transporte.ldt e l o primeiro registro (elementos e do conjunto fabricas). A segunda chamada diz respeito ao segundo registro (elementos do conjunto armazens), e assim por diante. O ultimo registro (custos de envio) no necessita de um . Quando o LINGO encontra o m a do arquivo, l o ultimo registro e o arquivo fechado. Caso seja inclu um no nal deste e e do registro, o LINGO no fechar o arquivo at que o modelo corrente seja resolvido. Isto pode a a e causar problemas, caso mltiplos arquivos sejam abertos durante a resoluo do modelo. u ca Comentrios inclusos nos arquivos textos so ignorados pelo LINGO. O nmero mximo de a a u a arquivos que um modelo pode referenciar, simultaneamente, 16. e

9.2

Exportando dados para um arquivo com @TEXT

A funo de interface @TEXT pode ser usada com o intuito de exportar solues para um arquivo ca co texto. Podem ser exportados tanto membros de um conjunto, quanto valores de um atributo. A sintaxe para este comando apresentada a seguir. e @TEXT([nome do arquivo]) Instrues escritas na seo DATA, que utilizam funes de interface para exportar dados, so co ca co a referidas como operaes de sa co da. Operaes deste tipo so executadas somente quando o LINGO co a termina de resolver o modelo, seguindo a ordem a qual elas so listadas na seo. a ca Um exemplo de como exportar dados utilizando @TEXT apresentado abaixo. e DATA: @TEXT(Resultados.txt ) = x; @TEXT() = y; ENDDATA No caso onde o nome do arquivo omitido, os dados so enviados para a tela de resultados do e a LINGO.

23

10
10.1

Utilizando planilhas do EXCEL


Funo @OLE ca

@OLE uma funo de interface usada para mover dados entre o LINGO e o Excel, atravs e ca e de transferncias baseadas em OLE (Object Linking and Embedding). Essas transferncias so e e a realizadas diretamente pela memria e, portanto, no fazem uso de arquivos intermedirios. o a a

10.2

Importando dados do EXCEL com @OLE

A funo @OLE pode ser usada nas sees SETS e DATA para importar dados. @OLE pode tanto ca co ler membros de conjuntos quanto atributos - membros so esperados no formato texto, enquanto a que atributos no formato numrico. e A sintaxe da funo @OLE, quando usada na seo DATA para importar dados do EXCEL, ca ca : e lista de objetos = @OLE(nome do arquivo xls [, lista de nomes]); A lista de objetos formada por objetos do modelo, opcionalmente separados por v e rgulas, que so inicializados com dados importados de uma planilha. Ela pode conter qualquer combinao a ca de nomes de conjuntos, atributos e variveis escalares. a A lista de nomes composta por nomes de campos denidos na planilha do Excel, que compem e o os dados importados. Cada nome da lista deve possuir um elemento corresponde na lista de objetos. Existem trs opes poss e co veis de denir a lista de nomes, exemplicadas a seguir. custo, capacidade = @OLE(Transporte.xls); Quando a lista de nomes omitida, o LINGO utiliza os nomes contidos na lista de objetos. e Deste modo, custo e capacidade so inicializados com os valores denidos, respectivamente, nos a campos nomeados como custo e capacidade no arquivo Transporte.xls. custo, capacidade = @OLE(Transporte.xls, tabela); Neste exemplo, um unico campo, rotulado com o nome de tabela no arquivo Transporte.xls, utilizado para inicializar os atributos custo e capacidade. Assumindo que o campo tabela e possui duas colunas, o LINGO utiliza a primeira para inicializar custo e a segunda para inicializar capacidade. Para que este mtodo funcione necessrio que ambos custo e necessidade, sejam e e a denidos pelo mesmo conjunto, ou conjuntos de mesmo tamanho. Alm disso, ambos devem ser e conjuntos ou atributos - tipos diferentes no so permitidos. a a custo, capacidade = @OLE(Transporte.xls, cust,cap); Neste caso, cada atributo inicializado por um campo correspondente. O atributo custo ir e a receber os dados referentes a cust e capacidade, os dados referentes a cap. Para melhor entendimento de como importar os dados do EXCEL utilizando a funo @OLE, ca o modelo Problema de Transporte com 6 fbricas e 8 armazens ser modicado para receber os a a dados inseridos no arquivo Transporte.xls. As modicaes so apresentadas a seguir. co a

24 SETS: fabricas: capacidade; armazens: demanda; rotas(fabricas,armazens): custo, qtdEnviada; ENDSETS DATA: fabricas, armazens, capacidade, demanda, custo = @OLE(Transporte.xls, fabricas,armazens,capacidade,demanda, custo); ENDDATA

Alm de inserir os dados na planilha, necessrio denir os nomes para os campos fabricas, e e a armazens, capacidade, demanda e custo. Especicamente, sero denidos os seguintes nomes: a Nome fabricas armazens capacidade demanda custo Campo B6:B11 C5:J5 K6:K11 C12:J12 C6:J11

Como os objetos do modelo possuem os mesmo nomes que os seus correspondentes campos, a lista de nomes pode ser omitida na funo @OLE, gerando uma nova verso simplicada para o ca a modelo: DATA: fabricas, armazens, capacidade, demanda, custo = @OLE(Transporte.xls); ENDDATA De forma alternativa, @OLE ainda pode ser usada na seo sets para importar membros de ca um conjunto. Sendo assim, para o exemplo em questo, ter a amos:

25 SETS: fabricas / @OLE(Transporte.xls, fabricas) /: capacidade; armazens / @OLE(Transporte.xls, armazens) /: demanda; rotas(fabricas,armazens): custo, qtdEnviada; ENDSETS

10.3

Denindo nomes no EXCEL

Existem duas maneiras de denir um nome para um campo no EXCEL. Para denir um nome pela primeira maneira, siga os seguintes passos: 1. pressionando o boto esquerdo do mouse, arraste o cursor sobre o conjunto de clulas que a e compem o campo; o 2. solte o boto esquerdo do mouse; a 3. selecione o menu Inserir|Nome|Denir; 4. digite o nome desejado; e 5. clique no boto OK. a

26

Pela segunda maneira, mais simples, os passos so os seguintes: a 1. pressionando o boto esquerdo do mouse, arraste o cursor sobre o conjunto de clulas que a e compem o campo; o 2. solte o boto esquerdo do mouse; a 3. clique na caixa de nomes localizada no canto superior esquerdo do EXCEL; 4. digite o nome desejado; e 5. pressione ENTER.

27

10.4

Excluindo um nome denido no EXCEL

Para excluir um nome anteriormente denido no EXCEL, siga os seguintes passos: 1. selecione o menu Inserir|Nome|Denir; 2. selecione o nome desejado; 3. clique no boto Excluir; e a 4. clique no boto Fechar. a

10.5

Exportando dados para EXCEL com @OLE

A funo de interface @OLE tambm pode ser usada na seo DATA com o intuito de exportar ca e ca dados para o EXCEL. A sintaxe da funo @OLE, quando utilizada para exportar dados, : ca e @OLE(nome do arquivo xls [, lista de nomes]) = lista de objetos; A lista de objetos uma lista de nomes de conjuntos, atributos e variveis escalares, separados e a por v rgulas. A lista de nomes composta por nomes de campos denidos na planilha do Excel, que compem e o as clulas para as quais os dados sero exportados. Cada nome da lista deve possuir um elemento e a corresponde na lista de objetos. Existem trs opes dispon e co veis de denir a lista de nomes, exemplicadas a seguir. @OLE(Transporte.xls) = x, fo; Quando a lista de nomes omitida, o LINGO utiliza os nomes contidos na lista de objetos. e Deste modo, o campo x ir receber os dados da varivel x e o campo fo, o valor de fo. a a @OLE(Transporte.xls, solucao) = x, y; Neste exemplo, um unico campo, rotulado com o nome de solucao no arquivo Transporte.xls, utilizado para receber os valores das variveis x e y. Assumindo que o campo solucao possui e a duas colunas, o LINGO utiliza a primeira para receber x e a segunda para receber y. Para que este mtodo funcione necessrio que ambos x e y sejam denidos pelo mesmo conjunto, ou conjuntos e e a de mesmo tamanho. Alm disso, ambos devem ser conjuntos ou atributos - tipos diferentes no e a so permitidos. a

28 @OLE(Transporte.xls, qtdEnviada, custoTotal) = x, fo; Neste caso, cada campo denido em Transporte.xls recebe os dados de um objeto correspondente. O campo qtdEnviada ir receber os valores da varivel x enquanto que custoTotal, o a a valor de fo. Para elucidar como a funo @OLE utilizada para enviar dados ao EXCEL, o modelo Proca e blema de Transportecom 6 fbricas e 8 armazens ser modicado de modo a imprimir os resula a tados no arquivo Transporte.xls. As modicaes so apresentadas abaixo. co a SETS: fabricas / @OLE(Transporte.xls, fabricas) /: capacidade; armazens / @OLE(Transporte.xls, armazens) /: demanda; rotas(fabricas,armazens): custo, qtdEnviada; ENDSETS DATA: capacidade, demanda, custo = @OLE(Transporte.xls, capacidade, demanda,custo); ENDDATA DATA: @OLE(Transporte.xls, qtdEnviada, cTotal) = qtdEnviada, fo; ENDDATA

Os campos qtdEnviada e cTotal devem ser denidos no arquivo Transporte.xls da seguinte maneira: Nome qtdEnviada cTotal Campo C21:J26 I28

29 Quando o modelo for resolvido, o LINGO ir ler os dados do arquivo Excel Transporte.xlspara a as variveis fabricas, armazens, capacidade, demanda e custo. Uma vez que a soluo tima tenha a ca o sido encontrada, o LINGO enviar os resultados para o mesmo arquivo Excel, atravs dos campos a e qtdEnviada e cTotal, como mostra a gura a seguir.

10.6

Algumas consideraes sobre @OLE co

Ao utilizar a funo @OLE, algumas consideraes devem ser observadas: ca co 1. Para que @OLE funcione corretamente necessrio que o arquivo .xls utilizado esteja e a aberto, a no ser quando objetos embutidos so utilizados (objetos embutidos so explicados a a a na prxima seo); o ca 2. A funo @OLE no trabalha com conjuntos derivados tri-dimensonais; e ca a 3. @OLE l os campos denidos no Excel, de acordo com a seguinte ordem: da esquerda para e direita e de cima para baixo.

30

11

Embutindo planilhas do EXCEL no LINGO

Assim como poss embutir um modelo LINGO no EXCEL, o processo pode ser invertido de e vel modo que uma planilha seja embutida no LINGO. Para embutir um arquivo .xls no LINGO, siga os seguintes passos: 1. selecione o menu Edit|Insert New Object; 2. selecione a opo Criar do Arquivo na caixa de dialogo Inserir Objeto; ca 3. digite o caminho e o nome do arquivo a ser embutido; 4. marque a caixa Vincular; e 5. clique no boto OK. a

Para ilustrar este processo, o modelo Problema de Transporte apresentado na seo 6 ser ca a utilizado como exemplo. Aps inserir o novo objeto contendo o arquivo Transporte.xls, temos: o

31

A planilha de dados est agora embutida no LINGO, exibida ao topo do modelo Problema a de Transporte. Para edit-la, basta dar um duplo-clique sobre o objeto. a

32 Quando o modelo for resolvido, o LINGO enviar os resultados para o arquivo Transporte.xls a atualizando a planilha embutida, como exibido a seguir.

12

Embutindo Modelos LINGO no EXCEL

O LINGO capaz de funcionar como um servidor OLE. Isto signica que um modelo do LINGO e pode ser embutido em qualquer aplicao que funcione como cliente OLE como, por exemplo, o ca EXCEL. Embutir um modelo no EXCEL conveniente, pois o modelo estar sempre dispon e a vel sempre que o arquivo .xls for aberto, no sendo necessrio abrir o otimizador LINGO. a a Para embutir um documento do LINGO em um arquivo do EXCEL, siga os seguintes passos: 1. selecione o menu Inserir|Objeto; 2. selecione o objeto LINGO Document na lista Tipo de objeto; e 3. clique no boto OK; a

33

Aps concluir os passos citados acima, um documento em branco do LINGO surgir na planilha o a corrente. O modelo pode ser digitado no documento diretamente, ou copiado de uma outra aplicao (copiar/colar). ca Para ilustrar este recurso, ser utilizado o modelo Problema de Transporte descrito na seo a ca 6. Embutindo este modelo em um arquivo nomeado como Transporte.xls, ter amos:

Ao dar um duplo-clique sobre o objeto contendo o modelo embutido, uma barra de comandos do LINGO aparecer no canto superior da tela. Para resolver o modelo, basta clicar no boto a a Solve da barra de comandos. Depois de otimizar o modelo, o LINGO enviar os resultados para a o arquivo Transporte.xls, como exibido a seguir.

34

13

Utilizando links OLE automatizados no EXCEL

O LINGO disponibiliza um comando script, prprio para ser usado pelo EXCEL, que permite a o criao de um link OLE automatizado. Este link estabelece uma relao cliente-servidor entre o ca ca EXCEL e o LINGO. Com isto, torna-se poss resolver um modelo escrito na prpria planilha vel o do EXCEL, sem a necessidade de utilizar o aplicativo do LINGO, de forma transparente para o usurio. a Para ilustrar esse recurso ser utilizado o modelo Problema de Transporte mostrado na seo a ca 6. Esta ilustrao assume que o leitor esteja razoavelmente familiarizado com o uso de macros do ca Visual Basic. Considere a seguinte planilha do EXCEL:

35

Nesta planilha, intitulada Dados, esto denidos os seguintes campos: a Nome fabricas armazens capacidade demanda custo solucao cTotal Campo B6:B11 C5:J5 K6:K11 C12:J12 C6:J11 C21:J26 I28

Existe ainda uma segunda planilha, chamada Modelo, contendo o modelo do Problema de Transporte descrito em cdigo script. Um script deve possuir o seguinte esquema: o

36 SET ECHOIN 1 Outras funes SET co MODEL: modelo LINGO END GO SET ECHOIN 0 QUIT O comando SET ECHOIN 1 ativa o terminal do LINGO, permitindo que o script seja lido. J o comando GO usado para resolver o modelo, descrito entre as palavras-chave MODEL e a e END. A planilha Modelo exibida abaixo: e

Para que este script seja enviado ao LINGO necessrio que ele esteja denido atravs do e a e seguinte campo: Nome Campo modelo A1:A31

37 Denido os campos e o modelo LINGO, ser necessrio adicionar ao boto Solve, criado na a a a planilha Dados, o seguinte cdigo: o Private Sub Solve Click() Dim iErr As Integer Dim LINGO As Object Set LINGO = CreateObject(LINGO.Document.4) iErr = LINGO.RunScriptRange(modelo) If (iErr > 0) Then MsgBox (O modelo no pode ser Resolvido) a End If End Sub A automao OLE utilizada para chamar o mtodo RunScriptRange, passando o campo ca e e modelo como parmetro. A rotina RunScriptRange ento, solicita ao EXCEL que obtenha o a a contedo deste campo e, inicia o processo de execuo do script. Esse processo continua at que a u ca e palavra-chave QUIT seja encontrada ou no haja mais nenhum comando a ser lido. A instruo a ca RunScriptRange retornar um valor 0 caso o script esteja pronto para ser processado. a Voltando ` planilha Dados, para que o modelo seja resolvido basta apenas que o boto Solve a a seja pressionado. Aps uma breve pausa, a soluo encontrada pelo LINGO enviada a planilha, o ca e como mostra a gura abaixo.

38

13.1

Comando SET

O comando SET permite alterar conguraes padres do LINGO. Todas as opes congurveis co o co a pelo usurio esto dispon a a veis atravs do comando SET. A sintaxe para este comando : e e SET nome do parametro | ndice do parametro [valor do parametro] Caso o valor do parmetro seja omitido, o LINGO utilizar o valor padro para o parmetro a a a a especicado. Alguns dos parmetros acess a veis atravs do comando SET so apresentados a seguir. e a Indice 10 23 24 33 34 46 51 Nome TIMLIM TERSEO STAWIN ECHOIN ERRDLG DUALCO CUTOFF Padro a 0 0 1 0 1 1 1 108 Descrio ca Tempo limite de execuo em segundos ca (0: sem limite) Omite o relatrio gerado aps a resoluo do modelo o o ca (0: no, 1: sim) a Exibe a janela de status do processo de busca (1: sim, 0: no) a Envia comandos script para o terminal (0: no, 1: sim) a Exibe mensagens de erro em uma caixa de dilogo a (1: sim, 0: no) a Calcula os valores duais (0: nenhum, 1: preos, 2: preos e range) c c Descarta valores de solues menores que 1 108 co

39

Parte II

Modelagem de Problemas de Programao Linear ca


(1) Carteira de Investimentos A LCL Investimentos gerencia recursos de terceiros atravs da e escolha de carteiras de investimentos para diversos clientes, baseados em bonds de diversas empresas. Um de seus clientes exige que: No mais de 25% do total aplicado deve ser investido em um unico investimento; a Um valor superior ou igual a 50% do total aplicado deve ser investido em t tulos de maturidade maiores que 10 anos; O total aplicado em t tulos de alto risco deve ser, no mximo, de 45% do total investido. a A tabela abaixo mostra os dados dos t tulos selecionados. T tulo 1 2 3 4 5 6 Retorno anual 8,7% 9,5% 12,0% 9,0% 13,0% 20,0% Maturidade (Anos) 15 12 8 7 11 5 Risco 1- Muito baixo 3- Regular 4- Alto 2- Baixo 4- Alto 5- Muito alto

Determine a estratgia tima para o investidor de forma que a rentabilidade de sua aplicao e o ca seja mxima. a Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: titulos retornoj maturidadej riscoj : : : : Conjunto de t tulos; Retorno anual do t tulo j (%); Maturidade do t tulo j (anos); Risco associado ao t tulo j.

e a seguinte varivel de deciso: a a xj : Percentual a ser investido no t tulo j.

40 O modelo de programao matemtica para o Exerc 1 : ca a cio e max (1/100)


jtitulos

retornoj xj

s.a: xj xj
jtitulos

25 50 45 = 100

j titulos j titulos | maturidadej 10 j titulos | riscoj 4

xj
jtitulos

xj
jtitulos

Modelo Lingo

41 Title: Investimentos(R).lg4; sets: titulos/@ole(Investimentos(R).xls,titulos)/: retorno, maturidade, risco, x; endsets data:


! Importa os dados do Excel;

retorno, maturidade, risco = @ole(Investimentos(R).xls,retorno,maturidade,risco); enddata


! Maximizar o retorno com os investimentos;

[fo] max = (1/100) * @sum(titulos(j): retorno(j) * x(j));


! No mais do que 25 % do total aplicado deve ser investido em um unico t a tulo;

@for(titulos(j): x(j) <= 25);


! Investir um valor igual ou superior a 50% do total aplicado em t tulos de maturidade superior a 10 anos;

@sum(titulos(j) | maturidade(j) #ge# 10: x(j)) >= 50;


! Total aplicado em t tulos de alto risco deve ser no mximo 45% do total investido; a

@sum(titulos(j) | risco(j) #ge# 4 : x(j)) <= 45;


! Total aplicado em t tulos deve totalizar 100%;

@sum(titulos(j): x(j)) = 100; data:


! Exporta resultados para o excel;

@ole(Investimentos(R).xls,solucao,retmax) = x, fo; enddata (2) Mistura de Minrios com Custos Uma mineradora recebe uma encomenda para produzir e 6000 toneladas de minrio atendendo a especicao abaixo. e ca Elemento qu mico Fe Al2 O3 P PPC He Teor M nimo permitido (%) 44,5 0,27 0,035 2,05 38 Teor Mximo a permitido (%) 49,5 0,37 0,043 2,65 50

Sabe-se que esta encomenda pode ser atendida a partir de um conjunto de pilhas de minrios, e cuja composio, disponibilidade e custo so relacionados a seguir. ca a

42

Pilha 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

Fe (%) 52,64 39,92 47,19 49,36 43,94 48,97 47,46 46,52 56,09 46,00 49,09 49,77 53,03 52,96 42,09

Al2 O3 (%) 0,52 0,18 0,50 0,22 0,46 0,54 0,20 0,32 0,95 0,26 0,22 0,20 0,24 0,29 0,17

P (%) 0,084 0,029 0,050 0,039 0,032 0,057 0,047 0,039 0,059 0,031 0,040 0,047 0,047 0,052 0,031

PPC (%) 4,48 0,65 2,52 1,74 2,36 4,34 5,07 3,51 4,10 2,51 4,20 4,81 4,17 4,81 1,38

He (%) 45 97 52 78 41 90 9 4 80 21 12 12 1 1 47

Massa (ton) 1500 2000 1700 1450 1250 1890 1640 1124 1990 900 1540 1630 1320 1245 1859

Custo ($/ton) 10,50 12,50 12,00 10,00 11,50 11,00 10,80 11,20 10,40 12,00 10,30 11,90 12,30 11,10 12,10

Qual a estratgia da mineradora para atender ao pedido de forma que o custo seja m e nimo? Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: parametros pilhas tlj tuj Qui ci tij p : : : : : : : : Conjunto de parmetros ; a Conjunto de pilhas; Teor m nimo admiss para o parmetro j no produto nal (%); vel a Teor mximo admiss para o parmetro j no produto nal (%); a vel a Quantidade mxima dispon na pilha i (t); a vel Custo de utilizao de uma tonelada de minrio da pilha i; ca e Teor do parmetro j na pilha i(%); a Produo total requerida, em toneladas (t). ca

e a seguinte varivel de deciso: a a xi : Quantidade de minrio a ser retirada da pilha i, em toneladas (t). e

43 O modelo de programao matemtica para o Exerc 2 : ca a cio e min


ipilhas

ci xi

s.a: (tij tuj )xi


ipilhas

0 0 = p

j parametros j parametros

(tij tlj )xi


ipilhas

xi
ipilhas

xi xi Modelo Lingo

Qui Z+

i pilhas i pilhas

44 Title: Mistura(R).lg4; sets: parametros/@ole(Mistura(R).xls,parametros)/: tl, tu; pilhas/@ole(Mistura(R).xls,pilhas)/: c, Qu, x; matriz(pilhas,parametros): t; endsets data:
! Importa os dados do Excel;

tl, tu, t, Qu, p, c = @ole(Mistura(R).xls,tl,tu,teor,Qu,p,custo); enddata


! Minimizar o custo total;

[fo] min = @sum(pilhas(i): c(i)*x(i) + y(i));


! O limite superior de especicao deve ser satisfeito para cada parmetro j; ca a

@for(parametros(j): @sum(pilhas(i): (t(i,j) - tu(j))*x(i)) <= 0);


! O limite inferior de especicao deve ser satisfeito para cada parmetro j; ca a

@for(parametros(j): @sum(pilhas(i): (t(i,j) - tl(j))*x(i)) >= 0);


! A quantidade a ser retomada em cada pilha i deve ser inferior ou igual a Qu(i);

@for(pilhas(i): @BND(0, x(i), Qu(i)));


! A produo total deve ser igual a p; ca

@sum(pilhas(i): x(i)) = p;
! A varivel x(i) inteira; a e

@for(pilhas(i): @GIN(x(i))); data:


Exporta os resultados para Excel;

@ole(Mistura(R).xls,solucao,ctotal) = x, fo; enddata

45 (3) Relativamente ao problema anterior, suponha que se possa retomar apenas mltiplos de 10 u toneladas e que para cada pilha s se pode retomar um m o nimo de 500 toneladas. Qual a nova estratgia a ser adotada? e Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: parametros pilhas tlj trj Qui nunidreti retmin ci tij p : : : : : : : : : : Conjunto de parmetros ; a Conjunto de pilhas; Teor m nimo admiss para o parmetro j no produto nal (%); vel a Teor desejvel para o parmetro j no produto nal (%); a a Quantidade mxima dispon na pilha i (t); a vel Nmero de unidades de retomada na pilha i; u Retomada m nima, em toneladas (t); Custo de utilizao de uma tonelada de minrio da pilha i; ca e Teor do parmetro j na pilha i (%); a Produo total requerida, em toneladas (t). ca

e as seguintes variveis de deciso: a a xi yi : Quantidade de minrio a ser retirado da pilha i (t); e 1 se a pilha i for usada; : 0 caso contrrio. a

O modelo de programao matemtica para o Exerc 3 : ca a cio e min


ipilhas

(ci xi )

s.a: (tij tuj )xi


ipilhas

0 0 Qui = = p xi /unidret

j parametros j parametros i pilhas

(tij tlj )xi


ipilhas

xi xi
ipilhas

nunidreti yi xi nunidreti yi

i pilhas i pilhas | Qui = 0 i pilhas i pilhas i pilhas

xi /Qui retmin yi Z+ {0, 1}

46 Modelo Lingo

Title: Mistura(R).lg4; sets: parametros/@ole(Mistura(R).xls,parametros)/: tl, tu; pilhas/@ole(Mistura(R).xls,pilhas)/: c, Qu, x, y, nunidret; matriz(pilhas,parametros): t; endsets data:
! Importa os dados do Excel;

tl, tu, t, Qu, retmin, p, c, unidret = @ole(Mistura(R).xls,tl,tu,teor,Qu,retmin,p,custo,unidret); enddata


! Minimizar o custo total;

[fo] min = @sum(pilhas(i): c(i)*x(i));


! O limite superior de especicao deve ser satisfeito para cada parmetro j; ca a

@for(parametros(j): @sum(pilhas(i): (t(i,j) - tu(j))*x(i)) <= 0);


! O limite inferior de especicao deve ser satisfeito para cada parmetro j; ca a

@for(parametros(j): @sum(pilhas(i): (t(i,j) - tl(j))*x(i)) >= 0);

47
! A quantidade a ser retomada em cada pilha i deve ser inferior ou igual a Qu(i);

@for(pilhas(i): @BND(0, x(i), Qu(i)));


! A produo total deve ser igual a p; ca

@sum(pilhas(i): x(i)) = p;
! A quantidade x(i) a ser retomada na pilha i deve ser mltipla de unidret; u

@for(pilhas(i): nunidret(i) = x(i) / unidret);


! Se for retomada qualquer quantidade na pilha i ento y(i) = 1. Caso contrrio, y(i) assume valor 0; a a

@for(pilhas(i) | Qu(i) #ne# 0: y(i) >= x(i)/Qu(i));


! Se for retomar alguma pilha i a quantidade x(i) a retomar deve ser superior ou igual a retmin;

@for(pilhas(i): x(i) >= retmin*y(i));


! A varivel nunidret(i) deve ser inteira e y(i) binria; a a

@for(pilhas(i): @GIN(nunidret(i)); @BIN(y(i)); ); data:


! Exporta os resultados para o Excel;

@ole(Mistura(R).xls,solucao) = x; enddata (4) Mistura de Minrios com Metas Uma mineradora recebe uma encomenda para produzir e 6000 toneladas de minrio atendendo a especicao abaixo. e ca Elemento qu mico F e (%) Al2 O3 (%) P (%) P P C (%) He (%) Teor M nimo permitido 44,5 0,27 0,035 2,05 38 Meta 47,0 0,32 0,040 2,35 40 Teor Mximo a permitido 49,5 0,37 0,043 2,65 50

Sabe-se que esta encomenda pode ser atendida a partir de um conjunto de pilhas de minrios, e cuja composio e disponibilidade so relacionadas a seguir. ca a

48

Pilha 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

Fe (%) 52,64 39,92 47,19 49,36 43,94 48,97 47,46 46,52 56,09 46,00 49,09 49,77 53,03 52,96 42,09

Al2 O3 (%) 0,52 0,18 0,50 0,22 0,46 0,54 0,20 0,32 0,95 0,26 0,22 0,20 0,24 0,29 0,17

P (%) 0,084 0,029 0,050 0,039 0,032 0,057 0,047 0,039 0,059 0,031 0,040 0,047 0,047 0,052 0,031

PPC (%) 4,48 0,65 2,52 1,74 2,36 4,34 5,07 3,51 4,10 2,51 4,20 4,81 4,17 4,81 1,38

He (%) 45 97 52 78 41 90 9 4 80 21 12 12 1 1 47

Massa (ton) 1500 2000 1700 1450 1250 1890 1640 1124 1990 900 1540 1630 1320 1245 1859

Custo ($/ton) 10,50 12,50 12,00 10,00 11,50 11,00 10,80 11,20 10,40 12,00 10,30 11,90 12,30 11,10 12,10

A tabela a seguir classica os parmetros de controle em 5 critrios: Irrelevante (-), Impora e tante (I), Muito Importante (MI), Cr tico (C) e Muito Cr tico (MC), cujos pesos so tambm a e apresentados. Critrio e Peso do Critrio e Parmetro a Critrio e 0 Fe MI I 1 Al2 O3 MI 5 P MC C 10 PPC C MC 100 He -

Considere, ainda, os seguintes pesos para comparar os diversos parmetros de controle entre a si: Parmetro a Peso de comparao ca Fe 1 Al2 O3 100 P 1000 PPC 10 He 1

Qual a estratgia da mineradora para atender ao pedido, de forma que as especicaes de e co qualidade estejam mais prximas das metas especicadas? Observao: considere que a peo ca nalidade pelo desvio de atendimento ` meta igual ao produto do peso de comparao pelo a e ca peso do critrio. e Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: parametros pilhas tlj trj : : : : Conjunto de parmetros ; a Conjunto de pilhas; Teor m nimo admiss para o parmetro j no produto nal (%); vel a Teor desejvel para o parmetro j no produto nal (%); a a

49 wdtj dtnj dtpj Qui nunidreti tij p : : : : : : : Peso do desvio da meta para o parmetro j; a Desvio negativo da meta para o parmetro j, em toneladas; a Desvio positivo da meta para o parmetro j, em toneladas; a Quantidade mxima dispon na pilha i, em toneladas; a vel Nmero de unidades de retomada; u Teor do parmetro j na pilha i (%); a Produo total requerida, em toneladas. ca

e as seguintes variveis de deciso: a a xi yi : Quantidade de minrio a ser retirada da pilha i (t); e 1 se a pilha i for usada; : 0 caso contrrio. a

O modelo de programao matemtica para o Exerc 4 : ca a cio e min (wdtj dtnj + wdtj dtpj )
jparametros

s.a: (tij tuj )xi


ipilhas

0 0 = 0

j parametros j parametros j parametros i pilhas

(tij tlj )xi


ipilhas

((tij trj ) xi ) + dtnj dtpj


ipilhas

xi xi
ipilhas

Qui = = p xi /unidret

nunidreti yi xi nunidreti yi

i pilhas i pilhas | Qui = 0 i pilhas i pilhas i pilhas

xi /Qui retmin yi Z+ {0, 1}

50 Modelo Lingo

title: MisturaMetas(R).lg4; sets: parametros /@ole(MisturaMetas(R).xls,parametros)/: tl, tu, tr, wdt, dtn, dtp; pilhas /@ole(MisturaMetas(R).xls,pilhas)/: Qu, nunidret, x, y; matriz(pilhas,parametros): t; endsets data:
! Importa os dados do Excel;

tl, tu, tr, t, wdt, Qu, p, retmin, unidret = @ole(MisturaMetas(R).xls,tl,tu,tr,teor,wdt,Qu,p,retmin,unidret); enddata


! Minimizar o desvio do teor de cada parmetro j em relao a sua meta de qualidade; a ca

[fo] min = @sum(parametros(j): wdt(j)*dtn(j) + wdt(j)*dtp(j));


! O limite superior de especicao deve ser satisfeito para cada parmetro j; ca a

@for(parametros(j): @sum(pilhas(i): (t(i,j) - tu(j))*x(i)) <= 0);


! O limite inferior de especicao deve ser satisfeito para cada parmetro j; ca a

@for(parametros(j): @sum(pilhas(i): (t(i,j) - tl(j))*x(i)) >= 0);

51
! A meta de qualidade deve ser buscada para cada parmetro j; a

@for(parametros(j): @sum(pilhas(i): (t(i,j) - tr(j))*x(i)) + dtn(j) - dtp(j) = 0);


! A quantidade a ser retomada em cada pilha i deve ser inferior ou igual a Qu(i);

@for(pilhas(i): @BND(0, x(i), Qu(i)));


! A produo total deve ser igual a p; ca

@sum(pilhas(i): x(i)) = p;
! A quantidade x(i) a ser retomada na pilha i deve ser mltipla de unidret; u

@for(pilhas(i): nunidret(i) = x(i) / unidret);


! Se for retomada qualquer quantidade na pilha i ento y(i) = 1. a Caso contrario, y(i) assume valor 0;

@for(pilhas(i) | Qu(i) #ne# 0: y(i) >= x(i)/Qu(i));


! Se for retomar alguma pilha i a quantidade x(i) a retomar deve ser superior ou igual a retmin;

@for(pilhas(i): x(i) >= retmin*y(i));


! A varivel nunidred(i) inteira e y(i) binria; a e a

@for(pilhas(i): @GIN(nunidret(i)); @BIN(y(i)); ); data:


! Exporta os resultados para Excel;

@ole(MisturaMetas(R).xls,dtn,dtp,solucao) = dtn, dtp, x; enddata (5) Problema das usinas Uma empresa siderrgica possui 3 usinas e cada uma delas requer u uma quantidade mensal m nima de minrio para operar. A empresa adquire minrio de 4 e e minas diferentes. Cada uma das minas tem uma capacidade mxima de produo mensal a ca estabelecida. Por imposies contratuais, o custo do minrio para a empresa composto por co e e um custo xo mensal para cada mina (este valor pago em caso de haver produo na mina), e ca mais um custo de transporte ($/t) que varia de acordo com a distncia entre as minas e usinas a (cada par mina/usina tem um custo diferente). Os dados so mostrados na tabela a seguir: a Cap. mx. das a minas (t/ms) e 11500 14500 13000 12300 Custo Fixo ($) 50000 40000 30000 25500 -

MINAS Mina 1 ($/t) Mina 2 ($/t) Mina 3 ($/t) Mina 4 ($/t) Quant. req. (t/ms) e

Usina 1 10 7 6,5 8,5 10000

Usina 2 8 9 10,8 12,7 15400

Usina 3 13 14 12,4 9,8 13300

52 Construir um modelo de otimizao para determinar a quantidade de minrio a ser comprada ca e de cada mina e levada a cada usina de forma a minimizar o custo total de compra de minrio. e Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: minas usinas capi cf ixoi demandaj custoij : : : : : : Conjunto de Minas ; Conjunto de usinas; Capacidade de produo da mina i; ca Custo xo de utilizao da mina i; ca Demanda requerida pela usina j; Custo de transporte de minrio da mina i para a usina j. e

e as seguintes variveis de deciso: a a xij : Quantidade de minrio a ser transportado da mina i para a usina (j); e 1 se a mina i for usada; yi : 0 caso contrrio. a O modelo de programao matemtica para o Exerc 5 : ca a cio e min
iminas jusinas

(custoij xij )

+
iminas

(cf ixoi yi )

s.a: xij
jusinas

capi = demandaj xij )/capi

i minas j usinas i minas i minas, j usinas i minas

xij
iminas

yi xij yi

(
jusinas

0 {0, 1}

53 Modelo Lingo

Title: Usinas(R).lg4; sets: minas/@ole(Usinas(R).xls,minas)/: cap, cxo, y; usinas/@ole(Usinas(R).xls,usinas)/: demanda; matriz(minas,usinas): custo, x; endsets data:
! Importa os dados do Excel;

cap, cxo, demanda, custo = @ole(Usinas(R).xls,cap,cxo,demanda,custo); enddata


! Minimiza os custos com transporte entre as minas e o custo xo de utilizao das minas; ca

[fo] min = @sum(matriz(i,j): custo(i,j)*x(i,j)) + @sum(minas(i): cxo(i)*y(i));


! Total transportado de uma mina para as usinas deve ser menor ou igual ` a capacidade de produo da mina; ca

@for(minas(i): @sum(usinas(j): x(i,j)) <= cap(i));


! Quantidade de minrio que chega a uma usina deve ser maior ou igual a demanda da mesma; e

@for(usinas(j):@sum(minas(i): x(i,j)) = demanda(j));

54
! A varivel y(i) deve ser inteira; a

@for(minas(i): y(i) >= @sum(usinas(j): x(i,j)) / cap(i));


! As variveis y(i) so binrias; a a a

@for(minas(i): @BIN(y(i))); data:


! Exporta os dados para o Excel;

@ole(Usinas(R).xls,solucao,ctotal) = x, fo; enddata (6) Planejamento da ProduoA LCL Motores recebeu recentemente uma encomenda para ca entregar 3 modelos diferentes de motores. Cada motor necessita de um determinado nmero u de horas de trabalho no setor de montagem e de acabamento. Para atender a encomenda, a LCL pode tambm terceirizar parte de sua produo. A tabela a seguir resume as informaes e ca co sobre a demanda por cada modelo de motor, o tempo necessrio para montar uma unidade a de cada modelo, a quantidade de horas dispon veis no setor de montagem, o tempo necessrio a para dar acabamento a uma unidade de cada unidade, a quantidade de horas dispon veis no setor de acabamento, o custo de produo, bem como o custo de terceirizao de uma unidade ca ca de cada modelo: Modelo Demanda Montagem Acabamento Custo de produo ca Terceirizado 1 3000 unid. 1 h/unid. 2,5 h/unid. $50 $65 2 2500 unid. 2 h/unid. 1 h/unid. $90 $92 3 500 unid. 0,5 h/unid. 4 h/unid. $120 $140 Total 6000 unid. 6000 h 10000 h -

Qual a estratgia tima a ser adotada pela empresa de forma a atender aos pedidos? e o Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: modelos demi monti acabi cprodi cterci hM ont hAcab : : : : : : : : Conjunto de modelos de motores; Demanda por motores do modelo i (unid); Tempo gasto na montagem de um motor do modelo i (h/unid); Tempo gasto no acabamento de um motor do modelo i (h/unid); Custo de produo de um motor do modelo i; ca Custo de terceirizao de um motor do modelo i; ca Tempo total dispon para a montagem dos motores (h); vel Tempo total dispon para o acabamento dos motores (h); vel

e as seguintes variveis de deciso: a a xi yi : Quantidade de motores do modelo i produzidos; : Quantidade de motores do modelo i terceirizados.

55 O modelo de programao matemtica para o Exerc 6 : ca a cio e min s.a: xi + yi


imodelos

(cprodi xi )
imodelos

(cterci yi )
imodelos

demi

i modelos

(monti xi ) hM ont (acabi xi ) hAcab


imodelos

xi yi Modelo Lingo

Z+ Z+

i modelos i modelos

56 Title: Motores(R).lg4; sets: modelos/@ole(Motores(R).xls,modelos)/: dem, mont, acab, cprod, cterc, x, y; endsets data:
! Importa os dados do Excel;

dem, mont, acab, cprod, cterc, hMont, hAcab = @ole(Motores(R).xls,demanda,mont,acab,cprod,cterc,hMont,hAcab); enddata


! Minimiza o custo com a produo e a terceirizao dos motores; ca ca

[fo] min = @sum(modelos(i): cprod(i)*x(i)) + @sum(modelos(i): cterc(i)*y(i));


! Total de modelos produzidos e terceirizados deve ser maior ou igual ` a demanda requerida;

@for(modelos(i): x(i) +y(i) = dem(i));


! Tempo gasto na montagem dos motores deve ser menor ou igual ao tempo dispon para esta tarefa; vel

@sum(modelos(i):mont(i)*x(i)) <= hMont;


! Tempo gasto no acabamento dos motores dever ser menor ou igual ao tempo dispon para esta tarefa; vel

@sum(modelos(i): acab(i)*x(i)) <= hAcab;


! As varivel x(i) e y(i) devem ser inteiras; a

@for(modelos(i): @GIN(x(i)); @GIN(y(i)); ); data:


! Exporta dados para o Excel;

@ole(Motores(R).xls,Qprod,Qterc,ctotal) = x, y, fo; enddata

57 (7) Planejamento da Produo Uma determinada empresa est interessada em maximizar o ca a lucro mensal proveniente de quatro de seus produtos, designados por I, II, III e IV. Para fabricar esses produtos, ela utiliza dois tipos de mquinas (M1 e M2) e dois tipos de mo-dea a obra (MO1 e MO2), que tm as seguintes disponibilidades: e Mquinas a M1 M2 Disponibilidades (mquina-hora/ms) a e 80 20 Mo-de-obra a MO1 MO2 Disponibilidade (homem-hora/ms) e 60 40

O setor tcnico da empresa fornece os seguintes coecientes, que especicam o total de horas e de mquina e horas de mo-de-obra necessrias para a produo de uma unidade de cada a a a ca produto: Mquinas a M1 M2 I 5 2 Produtos II 4 6 III 8 IV 9 8 Mo-de-obra a MO1 MO2 I 2 7 Produtos II 4 3 III 2 IV 8 7

O setor comercial da empresa fornece as seguintes informaes: co Produtos I II III IV Potencial de vendas (unidades/ms) e 70 60 40 20 Lucro Unitrio a (R$/ms) e 10,00 8,00 9,00 7,00

Deseja-se planejar a produo mensal da empresa que maximize o lucro. ca Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: produtos maquinas mObras demj lucroj dispM aqi dispM Obrak hM aqij hM Obrakj : : : : : : : : : Conjunto de produtos; Conjunto de mquinas; a Conjunto dos tipos de mo-de-obra; a Demanda por produtos do tipo j (unid); Lucro obtido com a venda de produtos do tipo j; Disponibilidade da mquina i (h/mes); a Disponibilidade de mo-de-obra do tipo k (h/mes); a Tempo dispon da mquina i para produo de produtos do tipo j (h); vel a ca Tempo de mo-de-obra do tipo k para produo de produtos do tipo j (h). a ca

e as seguintes variveis de deciso: a a xj : Quantidade fabricada de produtos do tipo j (unid);

58 O modelo de programao matemtica para o Exerc 7 : ca a cio e max


jprodutos

(lucroj xj )

s.a: (hM aqij xj ) dispM aqi


jprodutos

i maquinas k mObra j produtos j produtos

(hM Obrakj xj ) dispM Obrak


jprodutos

xj xj Modelo Lingo

demj Z+

59 Title: Produtos(R).lg4; sets: produtos/@ole(Produtos(R).xls,produtos)/: demanda, lucro, x; maquinas/@ole(Produtos(R).xls,maquinas)/: dispMaq; mObras/@ole(Produtos(R).xls,mObras)/: dispMObra; matriz1(maquinas,produtos): hMaq; matriz2(mObras,produtos): hMObra; endsets data:
! Importa dados do Excel;

demanda, lucro, dispMaq, dispMObra, hMaq, hMObra = @ole(Produtos(R).xls,demanda,lucro,dispMaq,dispMObra,hMaq,hMObra); enddata


! Maximizar o lucro obtido com a fabricao dos diferentes tipos de produtos; ca

[fo] max = @sum(produtos(j): lucro(j)*x(j));


! Tempo de utilizao de cada mquina deve ser ` disponibilidade da mesma; ca a a

@for(maquinas(i): @sum(produtos(j): hMaq(i,j)*x(j)) <= dispMaq(i));


! Mo de obra total utilizada deve ser ao total de mo de obra dispon a a vel;

@for(mObras(k): @sum(produtos(j): hMObra(k,j)*x(j)) <= dispMObra(k));


! Total de produtos fabricados deve ser ao demandado;

@for(produtos(j): x(j) <= demanda(j));


! A varivel x(j) deve ser inteira; a

@for(produtos(j): @GIN(x(j))); data:


! Exportando dados para o Excel;

@ole(Produtos(R).xls,solucao,lucromax) = x, fo; enddata

60 (8) Alocao de Pessoal Sta Scheduling O administrador de um hospital deseja determinar ca o escalonamento dos enfermeiros. Para isso ele organiza um sistema de planto dividindo o a dia em 6 per odos de 4 horas. A tabela a seguir mostra o nmero m u nimo de enfermeiros que devem estar presentes em cada horrio. a Horrio a # enfermeiros 8-12 51 12-16 58 16-20 62 20-24 41 24-04 32 04-08 19

Cada enfermeiro cumpre um planto normal de 8 horas, que pode comear apenas no in a c cio de um destes per odos. No horrio de 8 `s 20 horas, o enfermeiro recebe R$100 por hora de a a trabalho e R$125 por hora no horrio noturno (20 horas `s 18 horas). Como o administrador a a deve escalar os enfermeiros de forma a minimizar o custo com a mo-de-obra? a Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: turnos reqj custosj : : : Conjunto de turnos; Nmero de enfermeiros requeridos no turno j; u Custo da jornada de trabalho no turno j;

e a seguinte varivel de deciso: a a xj : Quantidade de enfermeiros a serem escalados no in do turno j (unid); cio

O modelo de programao matemtica para o Exerc 8 : ca a cio e min


jturnos

(custosj xj )

s.a: xj1 + xj xj reqj Z+ j turnos j turnos

61 Modelo Lingo

Title: Enfermeiros(R).lg4; sets: turnos/@ole(Enfermeiros(R).xls,turnos)/: req, custos, x; endsets data:


! Importa dados do Excel;

custos, req = @ole(Enfermeiros(R).xls,custo,requerido); enddata


! Minimiza o custo com pagamento de enfermeiros em cada turno;

[fo] min = @sum(turnos(j): custos(j)*x(j));


! Total de enfermeiros trabalhando em cada turno deve ser ao requerido;

@for(turnos(j): [excesso] x(@wrap(j-1, @size(turnos))) + x(j) >= req(j));


! A varivel x(j) deve ser inteira; a

@for(turnos(j): @GIN(x(j))); data:


! Exporta dados para o Excel;

@ole(Enfermeiros(R).xls,excesso,solucao,ctotal) = excesso, x, fo; enddata

62 (9) O administrador de um hospital deseja determinar o escalonamento dos enfermeiros. Para isso ele organiza um sistema de planto dividindo o dia em 6 per a odos de 4 horas. A tabela a seguir mostra o nmero m u nimo de enfermeiros que devem estar presentes em cada horrio. a Horrio a # enfermeiros 08-12 51 12-16 58 16-20 62 20-24 41 24-04 32 04-08 19

Cada enfermeiro cumpre um planto normal de 8 horas, que pode comear apenas no in a c cio de um destes per odos. No horrio de 8 `s 20 horas, o enfermeiro recebe R$100 pela hora de a a trabalho e R$125 no horrio noturno (20 horas `s 18 horas). Alguns enfermeiros podem ser a a solicitados para estender o planto por mais 4 horas seguidas. A hora-extra custa 50% mais a caro e em cada planto, no mais que 40% dos enfermeiros podem estar cumprindo hora-extra. a a Como o administrador deve escalar os enfermeiros, minimizando o custo com a mo-de-obra? a Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: turnos reqj cSHEj cCHEj : : : : Conjunto de turnos; Nmero de enfermeiros requeridos no turno j; u Custo da jornada de trabalho sem hora extra no turnoj Custo da jornada de trabalho com hora extra no turnoj

e as seguintes variveis de deciso: a a xj yj : : Quantidade de enfermeiros que comeam sua jornada no in do turno j c cio e no fazem hora-extra a Quantidade de enfermeiros que comeam sua jornada no in do turno j c cio e fazem hora-extra

O modelo de programao matemtica para o Exerc 9 : ca a cio e min


jturnos

(cSHEj xj

cCHEj yj )

s.a: xj + yj + xj1 + yj1 + yj2 yj2 xj yj reqj j turnos 0.4 (xj + yj + xj1 + yj1 + yj2 ) j turnos Z+ Z+ j turnos j turnos

63 Modelo Lingo

Title: EnfermeirosHoraExtra(R).lg4; sets: turnos/@ole(EnfermeirosHoraExtra(R).xls,turnos)/: req, cSHE, cCHE, x, y; endsets data:


! Importa dados do Excel;

req, cSHE, cCHE = @ole(EnfermeirosHoraExtra(R).xls,requerido,cSHE,cCHE); enddata


! Minimiza o custo com o pagamento de enfermeiros com e sem hora extra trabalhando no turno j;

[fo] min = @sum(turnos(j): cSHE*x(j) + cCHE*y(j)); @for(turnos(j):


! Total de enfermeiros em um determinado turno deve ser ao requerido;

[excesso] x(j) + y(j) + x(@wrap(j-1,@size(turnos))) + y(@wrap(j-1,@size(turnos))) + y(@wrap(j-2,@size(turnos))) >= req(j);

64
! O total de enfermeiros com hora extra no deve ultrapassar 40% do total de enfermeiros em um turno; a

[folga] y(@wrap(j-2,@size(turnos))) <= 0.4*(x(j) + y(j) + x(@wrap(j-1,@size(turnos))) + y(@wrap(j-1,@size(turnos))) + y(@wrap(j-2,@size(turnos))));


As variveis x(j) e y(j) devem ser inteiras; a

@GIN(x(j)); @GIN(y(j)); ); data:


! Importa dados para o Excel;

@ole(EnfermeirosHoraExtra(R).xls,excesso,folga,semHE,comHE,ctotal) = excesso, folga, x, y, fo; enddata (10) Deseja-se formar p ligas Ls a partir de q matrias-primas Rj . Sabe-se que: e (a) uma unidade da matria prima Rj contm aij unidades do metal Mi ; e e (b) uma unidade da liga Ls contm bis unidades do metal Mi ; e (c) uma unidade da matria-prima Rj custa cj unidades monetrias; e a (d) uma unidade da liga Ls vendida a vs unidades monetrias; e a (e) de cada matria-prima Rj s existem uj unidades dispon e o veis; Faa um modelo de programao linear que permita determinar a quantidade xj de matriac ca e prima Rj a ser comprada e a quantidade ys de liga Ls a ser vendida para que o lucro seja mximo. a Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: ligas metais materias vs pj kj aij bis : : : : : : : : : Conjunto de ligas; Conjunto de metais; Conjunto de matrias-primas; e Valor de venda de uma unidade da liga s; Custo de uma unidade da matria-prima j; e Nmero de unidades dispon u veis da matria-prima j; e Nmero de unidades do metal i encontrado em uma unidade u da matria-prima j ; e Nmero de unidades do metal i presente em uma unidade da liga s; u

e as seguintes variveis de deciso: a a

65 xj ys : : Quantidade de matria-prima do tipo j a ser comprada e Quantidade de liga do tipo s a ser vendida

O modelo de programao matemtica para o Exerc 10 : ca a cio e max


sligas

vs ys

jmaterias

pj xj

s.a: aij xj
jmaterias

sligas

bis ys

i metais j materias j materias s ligas

xj xj ys

kj Z+ Z+

(11) Problema de Corte de Estoque Unidimensional (Cutting Stock Problem) Certa empresa trabalha com a produo de etiquetas autocolantes. O papel usado para sua confeco ca ca encontra-se em bobinas de mesmo comprimento. A largura das bobinas de 50 cm. As e encomendas para a prxima semana impem a necessidade de se cortarem 32 bobinas de 15 o o cm de largura, 17 bobinas de 17,5 cm de largura e 21 bobinas de 20 cm de largura. E pol tica da empresa manter em estoque o excedente ao pedido em quantidade mxima de 10 bobinas a cortadas de acordo com a encomenda. Esta ao evita a imobilizao de capital, uma vez que ca ca so incertos os prximos pedidos. a o

A tabela abaixo relaciona as poss veis programaes de cortes, tendo em vista as encomendas. co Programaes de corte co 1 2 3 4 5 6 Largura da Faixa Cortada 15cm 3 2 1 2 0 0 17,5cm 0 1 2 0 1 0 20cm 0 0 0 1 1 2 Desperd cio 5 2,5 0 0 12,5 10

Qual a estratgia a ser seguida pela empresa de forma a minimizar os desperd e cios face ` a necessidade de produo? ca

66 Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: padroes bobinas despi demandaj aij estmax : : : : : : Conjunto de padres de corte; o Conjunto dos tipos de bobinas; Desperd relativo aos cortes realizados de acordo com o padro i; cio a Demanda por bobinas do tipo j; Quantidade de bobinas do tipo j produzidas no padro de corte i; a Estoque mximo de bobinas permitido; a

e a seguinte varivel de deciso: a a xi : Nmero de cortes realizados segundo o padro i u a

O modelo de programao matemtica para o Exerc 11 : ca a cio e min


ipadroes

(despi xi )

s.a: aij xi
ipadroes

demandaj demandaj + estmax Z+

j bobinas j bobinas i padroes

aij xi
ipadroes

xi Modelo Lingo

67

Title: CorteBobina(R).lg4; sets: padroes/@ole(CorteBobina(R).xls,padroes)/: desp, x; bobinas/@ole(CorteBobina(R).xls,bobinas)/: demanda; matriz(padroes,bobinas): a; endsets data:
! Importa dados do Excel;

desp, demanda, a, estmax = @ole(CorteBobina(R).xls, desp,demanda,a,estmax); enddata


! Minimiza os desperd cios produzidos com a utilizao dos padres de corte; ca o

[fo] min = @sum(padroes(i): desp(i)*x(i));


! O total de bobinas de cada tipo produzido deve ser ao demandado;

@for(bobinas(j): [excesso]@sum(padroes(i): a(i,j)*x(i)) >= demanda(j));


! O total de bobinas de cada tipo produzidas deve ser ao demandado mais o permitido em estoque;

@for(bobinas(j): @sum(padroes(i): a(i,j)*x(i)) <= demanda(j) + estmax);


! A varivel x(i) deve ser inteira; a

@for(padroes(i): @GIN(x(i))); data:


! Exportando dados para o Excel;

@ole(CorteBobina(R).xls,excesso,solucao,ptotal) = excesso, x, fo; enddadta (12) Problema de Corte de Estoque Unidimensional Uma serralheria dispe de barras de 7 o metros de comprimento que devem ser cortadas para obter barras menores atendendo a uma encomenda. As seguintes quantidades e tamanhos so requeridos: 92 barras de 2 metros, 59 a barras de 3 metros e 89 barras de 4 metros. Elabore um modelo de programao linear inteira ca que minimize as perdas com os cortes.

68 Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: padroes barras perdai demandaj aij : : : : : Conjunto dos poss veis padres de corte; o Conjunto de barras; Perda com os cortes realizados de acordo com o padro i; a Demanda por barras do tipo j; Quantidade de barras do tipo j produzidas no padro de corte i; a

e a seguinte varivel de deciso: a a xi : Nmero de cortes realizados segundo o padro i u a

O modelo de programao matemtica para o Exerc 12 : ca a cio e min


ipadroes

(perdai xi )

s.a: aij xi
ipadroes

demandaj Z+

j barras i padroes

xi Modelo Lingo

69 Title: Corte(R).lg4; sets: padroes/@ole(Corte(R).xls,padroes)/: perda, x; barras/@ole(Corte(R).xls,barras)/: demanda; matriz(padroes,barras): a; endsets data:
! Importa dados do Excel;

perda, demanda, a = @ole(Corte(R).xls,perda,demanda,a); enddata


! Minimiza a perda com os cortes;

[fo] min = @sum(padroes(i): perda(i)*x(i));


! Total de barras produzidas dever ser ao demandado;

@for(barras(j): [excesso] @sum(padroes(i): a(i,j)*x(i)) >= demanda(j));


! A varivel x(i) deve ser inteira; a

@for(padroes(i): @GIN(x(i))); data:


! Exportando dados para o Excel;

@ole(Corte(R).xls,excesso,solucao,ptotal) = excesso, x, fo; enddata (13) Problema de Corte de Estoque Unidimensional Relativamente ao problema anterior, considere que a serralheria no tem espao para reaproveitar as barras menores no usadas. a c a Elabore um modelo de programao linear inteira que minimize as perdas com os cortes e com ca o excesso de barras menores no aproveitadas. a

70 Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: padroes barras perdai demandaj dimenbarraj aij : : : : : : Conjunto de padres de corte; o Conjunto de barras; Perda com os cortes realizados de acordo com o padro i, em metros; a Demanda por barras do tipo j; Dimenso da barra do tipo j, em metros; a Quantidade de barras do tipo j produzidas no padro de corte i; a

e a seguinte varivel de deciso: a a xi : Nmero de cortes realizados segundo o padro i u a

O modelo de programao matemtica para o Exerc 13 : ca a cio e min


ipadroes

(perdai xi )

+
jbarras

(dimenbarraj (
ipadroes

aij xi demandaj ))

s.a: aij xi
ipadroes

demandaj Z+

j barras i padroes

xi Modelo Lingo

71 Title: CorteExcesso(R).lg4; sets: padroes/@ole(CorteExcesso(R).xls,padroes)/: perda, x; barras/@ole(CorteExcesso(R).xls,barras)/: demanda, dimenbarra; matriz(padroes,barras): a; endsets data:
! Importando dados do Excel;

perda, demanda, a, dimenbarra = @ole(CorteExcesso(R).xls,perda,demanda,a,dimenbarra); enddata


! Minimiza as perdas com os cortes e o excesso de barras no aproveitadas; a

[fo] min = @sum(padroes(i): perda(i)*x(i)) + @sum(barras(j): dimenbarra(j)*(@sum(padroes(i): a(i,j)*x(i)) - demanda(j)));


! Total de barras produzidas dever ser ao demandado;

@for(barras(j): [excesso] @sum(padroes(i): a(i,j)*x(i)) >= demanda(j));


! A varivel x(i) deve ser inteira; a

@for(padroes(i): @GIN(x(i))); data:


! Exportando dados para o Excel;

@ole(CorteExcesso(R).xls,excesso,solucao,ptotal) = excesso, x, fo; enddata

72 (14) Problema de Corte de Estoque Bidimensional Um fabricante de tiras metlicas recebeu a um pedido para produzir 2000 tiras de tamanho 2 cm 4 cm e 1000 tiras de 4 cm 7 cm. As tiras podem ser produzidas a partir de chapas maiores dispon veis nos tamanhos de 10 cm 3000 cm e 11 cm 2000 cm. O departamento tcnico encarregado de planejar o atendie mento ao pedido decidiu que os padres de corte mostrados na gura a seguir so adequados o a para produzir as tiras encomendadas. Formule um modelo de programao linear que permita ca minimizar a quantidade de material usado (ou, equivalentemente, minimizar as perdas) para o atendimento da encomenda.

73 (15) Problema da Mochila 0-1 H um conjunto de 10 itens e uma mochila com capacidade igual a a 100 u.m. Sabendo-se que existe uma unica unidade de cada item e, que a cada item est a associado um peso e um valor, conforme tabela abaixo, formule um modelo que maximize o valor total dos itens alocados ` mochila. a Item Peso (kg) Valor 1 15 5 2 18 7 3 13 6 4 23 10 5 9 8 6 10 3 7 11 4 8 5 1 9 14 7 10 5 3

Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: itens pesoj valorj cap : : : : Conjunto de itens; Peso associado ao item j; Valor associado ao item j; Capacidade da mochila;

e a seguinte varivel de deciso: a a xj : 1 se o item j for alocado ` mochila; a 0 caso contrrio. a

O modelo de programao matemtica para o Exerc 15 : ca a cio e max


jitens

(valorj xj )

s.a: pesoj xj
jitens

cap {0, 1} j itens

xj

74 Modelo Lingo

Title: Mochila0-1(R).lg4; sets: itens/@ole(Mochila0-1(R).xls,itens)/: peso, valor, x; endsets data:


! Importa dados do Excel;

peso, valor, cap = @ole(Mochila0-1(R).xls,peso,valor,cap); enddata


! Maximiza o benef com os itens alocados ` mochila; cio a

[fo] max = @sum(itens(j): valor(j)*x(j));


! Peso total dos itens alocados ` mochila no deve ultrapassar a capacidade da mesma; a a

@sum(itens(j): peso(j)*x(j)) <= cap;


! A varivel x(j) deve ser binria; a a

@for(itens(j): @BIN(x(j))); data:


! Exporta dados para o Excel;

@ole(Mochila0-1(R).xls,solucao,valormax) = x, fo; enddata

75 (16) Problema da Mochila 0-1 M ltipla Resolva o problema anterior, supondo que existem u vrias mochilas, cujas capacidades esto representadas nas tabelas a seguir. a a

Item Peso (kg) Valor

1 15 5

2 18 7

3 13 6

4 23 10

5 9 8

6 10 3

7 11 4

8 5 1

9 14 7

10 5 3

Mochila A B C Modelo de Programao Matemtica ca a

Capacidade 47 28 42

Sejam os seguintes dados de entrada para o problema: itens mochilas pesoj valorj capi : : : : : Conjunto de itens; Conjunto de Mochilas; Peso associado ao item j; Valor associado ao item j; Capacidade da mochila i;

e a seguinte varivel de deciso: a a xij : 1 se o item j for alocado ` mochila i; a 0 caso contrrio. a

O modelo de programao matemtica para o Exerc 16 : ca a cio e max


imochilas jitens

(valorj xij )

s.a: xij
imochilas

1 capi {0, 1}

j itens i mochilas i mochilas, j itens

pesoj xij
jitens

xij

76 Modelo Lingo

Title: Mochila0-1Multipla(R).lg4; sets: mochilas/@ole(Mochila0-1Multipla(R).xls,mochilas)/: cap; itens/@ole(Mochila0-1Multipla(R).xls,itens)/: peso, valor; matriz(mochilas,itens): x; endsets data:
! Importa dados do Excel;

peso, valor, cap = @ole(Mochila0-1Multipla(R).xls,peso,valor,cap); enddata


! Maximiza o benef com o a alocao de itens `s mochilas cio ca a

[fo] max = @sum(matriz(i,j): valor(j)*x(i,j));


! Cada item s pode ser alocado a uma unica mochila; o

@for(itens(j): @sum(mochilas(i): x(i,j)) <= 1);


! A capacidade da mochila deve ser respeitada;

@for(mochilas(i): @sum(itens(j): peso(j)*x(i,j)) <= cap(i));

77
! A varivel x(i,j) deve ser binria; a a

@for(matriz(i,j):@BIN(x(i,j))); data:
! Exporta dados para o Excel;

@ole(Mochila0-1Multipla(R).xls,solucao,valormax) = x, fo; enddata (17) Problema da Mochila Inteira Considere um conjunto de 10 itens e uma mochila de capacidade igual a 100 u.m. Sabendo-se que existem vrias unidades de cada item e que a cada a um deles est associado um determinado peso e valor, conforme tabela abaixo, formule um a modelo que maximize o valor total dos itens alocados ` mochila. a Item Peso (kg) Valor Unidades 1 15 5 2 2 18 7 3 3 13 6 2 4 23 10 3 5 9 8 2 6 10 3 2 7 11 4 2 8 5 1 2 9 14 7 1 10 5 3 2

Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: itens pesoj valorj quantj cap : : : : : Conjunto de itens; Peso associado ao item j; Valor associado ao item j; Quantidade dispon do item j; vel Capacidade da mochila;

e a seguinte varivel de deciso: a a xi : Quantidade de itens do tipo j a serem alocados ` mochila a

O modelo de programao matemtica para o Exerc 17 : ca a cio e max


jitens

(valorj xj )

s.a: xj pesoj xj
jitens

quantj cap Z+

j itens

xj

j itens

78 Modelo Lingo

Title: MochilaInteira(R).lg4; sets: itens/@ole(MochilaInteira(R).xls,itens)/: peso, valor, quant, x; endsets data:


! Importa dados do Excel;

peso, valor, quant, cap = @ole(MochilaInteira(R).xls,peso,valor,quant,cap); enddata


! Maximiza o benef com a alocao de itens ` mochila; cio ca a

[fo] max = @sum(itens(j): valor(j)*x(j));


! O nmero de itens alocados no pode superar a quantidade dispon u a vel;

@for(itens(j): x(j) <= quant(j));


! A capacidade da mochila deve ser respeitada;

@sum(itens(j): peso(j)*x(j)) <= cap;

79
! A varivel x(j) deve ser inteira; a

@for(itens(j):@GIN(x(j))); data:
! Exporta dados para o Excel;

@ole(MochilaInteira(R).xls,solucao,valormax) = x, fo; enddata (18) Problema da Mochila Inteira M ltipla Resolva o problema anterior, supondo que existem u vrios itens e vrias mochilas. Os dados para o problema esto indicados nas tabelas a seguir. a a a Item Peso (kg) Valor Unidades 1 15 5 2 2 18 7 3 3 13 6 2 4 23 10 3 5 9 8 2 6 10 3 2 7 11 4 2 8 5 1 2 9 14 7 1 10 5 3 2

Mochila A B C Modelo de Programao Matemtica ca a

Capacidade 47 28 42

Sejam os seguintes dados de entrada para o problema: itens mochilas pesoj valorj quantj capi : : : : : : Conjunto de itens; Conjunto de Mochilas; Peso associado ao item j; Valor associado ao item j; Quantidade dispon do item j; vel Capacidade da mochila i;

e a seguinte varivel de deciso: a a xij : Quantidade de itens do tipo j alocados ` mochila i a O modelo de programao matemtica para o Exerc 18 : ca a cio e max
imochilas jitens

(valorj xij )

s.a: xij
imochilas

quantj capi Z+

j itens i mochilas i mochilas, j itens

pesoj xij
jitens

xij

80 Modelo Lingo

Title: MochilaInteiraMultipla(R).lg4; sets: mochilas/@ole(MochilaInteiraMultipla(R).xls,mochilas)/: cap; itens/@ole(MochilaInteiraMultipla(R).xls,itens)/: peso, valor, quant; matriz(mochilas,itens): x; endsets data:
! Importa dados do Excel;

peso, valor, quant, cap = @ole(MochilaInteiraMultipla(R).xls,peso,valor,quant,cap); enddata


! Maximiza o benef com a alocao dos itens `s mochilas; cio ca a

[fo] max = @sum(matriz(i,j): valor(j)*x(i,j));


! A quantidade de itens alocados dever ser ao total de itens dispon veis;

@for(itens(j): @sum(mochilas(i): x(i,j)) <= quant(j));


! A capacidade da mochila deve ser respeitada;

@for(mochilas(i): @sum(itens(j): peso(j)*x(i,j)) <= cap(i));

81
! A varivel x(i,j) deve ser inteira; a

@for(matriz(i,j): @GIN(x(i,j))); data:


! Exporta dados para o Excel;

@ole(MochilaInteiraMultipla(R).xls,solucao,valormax) = x, fo; enddata (19) Problema de Localizao H um conjunto de m poss ca a veis localidades para instalar uma fbrica. H tambm um conjunto de n clientes a serem atendidos pelas fbricas. Para cada a a e a poss fbrica i dado o custo xo de produo fi , sua capacidade de produo capi e o vel a e ca ca custo de transporte cij de uma unidade do produto da fbrica i para o cliente j. Para cada a cliente j dada a demanda dj . Em quais localidades deve-se instalar as fbricas de forma a e a atender a demanda requerida no menor custo? Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: clientes fabricas fi capi dj cij : : : : : : Conjunto de clientes; Conjunto de fbricas; a Custo xo de produo na fbrica i; ca a Capacidade de produo da fbrica i; ca a Demanda do cliente j; Custo de transporte de uma unidade do produto da fbrica i para o cliente j; a

e as seguintes variveis de deciso: a a xij : Quantidade de produtos a serem transportados da fbrica i para o cliente j a yi : 1 se a fbrica i for instalada e 0, caso contrrio a a O modelo de programao matemtica para o Exerc 19 : ca a cio e min
ifabricas jclientes

cij xij

+
ifabricas

fi yi

s.a: xij
ifabricas

dj capi yi Z+ {0, 1}

j clientes i fabricas i fabricas, j clientes i fabricas

xij
jclientes

xij yi

82 (20) Caixeiro Viajante Considere um conjunto de cidades espalhadas geogracamente. Conhecendo-se as distncias dij entre cada par de cidades e sabendo-se que a matriz de distncias a a entre elas simtrica, determine a rota a ser seguida por um vendedor que saia da cidade e e origem (Atlanta), passe por todas as demais cidades uma unica vez e retorne ` cidade origem a ao nal do percurso percorrendo a menor distncia poss a vel. Cidade Atlanta Chicago Cincinatti Houston Los Angeles Atlanta 702 454 842 2396 Chicago 702 324 1093 2136 Cincinatti 454 324 1137 2180 Houston 842 1093 1137 1616 Los Angeles 2396 2136 2180 1616 -

Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: cidades distij : : Conjunto de cidades; Distncia entre as cidades i e j. a

e as seguintes variveis de deciso: a a xij : fij 1 se a aresta (i,j) for usada 0 caso contrrio. a : Fluxo de i para j.

O modelo de programao matemtica para o Exerc 20 : ca a cio e min


icidades jcidades

distij xij

s.a: xij
icidades

= = =

1 1 1

j cidades i cidades j cidades | j = 1 i cidades, j cidades i cidades, j cidades

xij
jcidades

fij
icidades icidades

fji fij xij

(|cidades| 1)xij {0, 1}

83 Modelo Lingo

Title: CaixeiroViajante(R).lg4; sets: cidades/@ole(CaixeiroViajante(R).xls,cidades)/:; matriz(cidades,cidades): dist, x, f; endsets data:


! Importa dados do Excel;

dist = @ole(CaixeiroViajante(R).xls,dist); enddata


! Minimiza a distncia total percorrida; a

[fo] min = @sum(matriz(i,j) : dist(i,j)*x(i,j));


! A cada cidade j s chega uma aresta; o

@for(cidades(j): @sum(cidades(i): x(i,j)) = 1);


! De cada cidade i s sai uma aresta; o

@for(cidades(i): @sum(cidades(j): x(i,j)) = 1);


! O uxo que chega a uma cidade j, exceto a origem, menos o que sai igual a uma unidade; e

@for(cidades(j) | j #ne# 1: @sum(cidades(i): f(i,j)) - @sum(cidades(i): f(j,i)) = 1);

84

! O uxo mximo em cada aresta n-1, onde n o nmero de cidades; a e e u

@for(matriz(i,j): f(i,j) <= (@size(cidades)-1)*x(i,j));


! A varivel x(i,j) deve ser binria; a a

@for(matriz(i,j): @bin(x(i,j))); data:


! Exporta dados para o Excel;

@ole(CaixeiroViajante(R).xls,solucao,ctotal) = x, fo; enddata (21) Roteamento de Ve culos Considere um centro de distribuio (depsito) e um conjunto ca o de clientes distribu dos geogracamente. So dadas as distncias entre o depsito e cada a a o cliente, bem como entre cada par de clientes. A cada cliente est associado uma demanda a a ser atendida. Considerando que no depsito h uma frota de ve o a culos de mesma capacidade, quais as rotas a serem seguidas pelos ve culos de forma a atender a demanda dos clientes percorrendo a menor distncia poss a vel? Cidade Depsito o A B C D E Demanda Depsito o 996 2162 1067 499 2054 0 A 996 1167 1019 596 1059 6 B 2162 1167 1747 1723 214 3 C 1067 1019 1747 710 1538 7 D 499 596 1723 710 1589 7 E 2054 1059 214 1538 1589 18

Modelo de Programao Matemtica ca a Sejam os seguintes dados de entrada para o problema: cidades distij demandaj capV eic : : : : Conjunto de cidades = { Depsito Clientes }; o Distncia entre as cidades i e j; a Demanda requerida pela cidade j; Capacidade de carga dos ve culos.

e as seguintes variveis de deciso: a a xij : fij 1 se a aresta (i,j) for usada 0 caso contrrio. a : Fluxo de i para j.

85 O modelo de programao matemtica para o Exerc 21 : ca a cio e min


icidades jcidades

distij xij

s.a: xij
jcidades

= = = =

1 1 demandaj xj1
jcidades

i cidades | i = 1 j cidades | j = 1 j cidades | j = 1

xij
icidades

fij
icidades icidades

fji x1j

jcidades

fij xij Modelo Lingo

capV eic xi,j {0, 1}

i cidades, j cidades i cidades, j cidades

86 Title: Roteamento de Ve culos(R).lg4; sets: cidades/@ole(RoteamentoVeiculos(R).xls,cidades)/: demanda; matriz(cidades, cidades): dist, x, f; endsets data:
! Importa dados do Excel;

demanda, dist, capVeic = @ole(RoteamentoVeiculos(R).xls,demanda,dist,capVeic); enddata


! Minimiza a distncia total percorrida; a

[fo] min = @sum(matriz(i,j): dist(i,j) * x(i,j));


! De uma cidade i, exceto o depsito, s sai um unico ve o o culo;

@for(cidades(i) | i #ne# 1: @sum(cidades(i): x(i,j)) = 1);


! A uma cidade j, exceto o depsito, s chega um unico ve o o culo;

@for(cidades(j) | j #ne# 1: @sum(cidades(i): x(i,j)) = 1);


!O nmero de ve u culos que saem do depsito deve ser igual ao nmero o u de ve culos que chegam ao depsito; o

@sum(cidades(j): x(1, j)) = @sum(cidades(j): x(j, 1));


! Ao passar por uma cidade j, exceto o depsito, o ve o culo deve atender a demanda dessa cidade, isto , deve deixar demanda(j) unidades de produto na cidade j; e

@for(cidades(j) | j #ne# 1: @sum(cidades(i): f(i,j)) - @sum(cidades(i): f(j,i)) = demanda(j));


! A quantidade de uxo de i para j no pode superar a capacidade do ve a culo;

@for(matriz(i,j): f(i,j) <= capVeic*x(i,j));


! A varivel x(i,j) deve ser binria; a a

@for(matriz(i,j): @bin(x(i,j))); data:


! Exporta dados para o Excel;

@ole(RoteamentoVeiculos(R).xls,solucao,dtotal) = x, fo; enddata