Você está na página 1de 90

ndice

Introduo

1. O Problema das Calas e das Camisas

1.1 INTRODUO 1.2 DESCRIO DO PROBLEMA 1.3 FORMULAO MATEMTICA 1.4 CRIANDO UM NOVO PROJETO NO AIMMS 1.5 CONSTRUINDO UM MODELO NO AIMMS 1.6 INSERINDO OS DADOS DE UM MODELO NO AIMMS 1.7 GRAVANDO OS DADOS DE UM MODELO NO AIMMS 1.8 RESOLVENDO O MODELO 1.9 CONSTRUINDO UMA PGINA NO AIMMS 1.10. ANALISANDO MUDANAS NOS PARMETROS DO MODELO
2. O Problema do Corte de Bobinas

2 2 2 4 5 14 16 18 20 30
32

2.1 INTRODUO 2.2 DESCRIO DO PROBLEMA 2.3 FORMULAO MATEMTICA 2.4 CONSTRUINDO O MODELO NO AIMMS 2.5 GRAVANDO OS DADOS DO MODELO 2.6 CONSTRUINDO AS PGINAS DE ABERTURA E DE DADOS 2.7 DECLARANDO PGINA E CASOS INICIAIS
3. O Problema da produo de sucos

32 32 33 37 44 45 51
53

3.1 INTRODUO 3.2 DESCRIO DO PROBLEMA 3.3 FORMULAO MATEMTICA 3.4 CRIANDO PGINAS COM O USO DE TEMPLATES. 3.5 AS PGINAS DO MODELO 3.6 LISTING FILE

53 53 55 74 78 85

Introduo
Este tutorial tem como objetivo abordar as caractersticas bsicas do AIMMS. Ele dirigido a estudantes e profissionais da rea de modelagem matemtica e foi desenvolvido com o intuito de familiarizar o usurio com o software em seus conceitos bsicos. Dividido em trs captulos distintos, o usurio encontrar primeiramente a descrio de um problema e a sua modelagem matemtica, seguida de instrues de como construir este modelo no ambiente do AIMMS, assim como a construo de pginas onde sero exibidos os dados relevantes ao problema. A primeira parte trata de um simples problema sobre produo de lotes de calas e camisas, e ser mostrado passo a passo como se fazem as declaraes necessrias para que o modelo possa ser resolvido pelo AIMMS. O segundo problema trata sobre perda de material em cortes de bobinas de papel. Neste captulo sero abordados itens mais especficos relacionados ao problema, tal como a construo de um grfico de Gantt. J no terceiro problema, que diz respeito sobre a produo de sucos, sero desenvolvidos os conceitos pertinentes aos arquivos de sada do AIMMS. Cada um dos captulos posteriores considera que o usurio j leu e aprendeu os conceitos anteriores, seguindo assim uma ordem de dificuldade crescente para os trs modelos apresentados. Bom divertimento !!!

1. O Problema das Calas e das Camisas


1.1 Introduo Este captulo trata de um problema onde deseja-se determinar o nmero de lotes de calas e de camisas que devem ser produzidos, de forma a maximizar o lucro com as vendas, sem violar as restries de disponibilidade das mquinas, matrias-primas e mo-de-obra. No AIMMS, sero apresentados os conceitos bsicos de declarao de variveis e parmetros, construo do programa matemtico que ir resolver o problema e a criao de uma pgina de visualizao dos dados, onde o usurio poder modificar e manipular os parmetros e os resultados obtidos.

1.2 Descrio do Problema Uma determinada confeco opera com dois produtos: calas e camisas. Como tratam - se de produtos semelhantes, possuem uma produtividade comparvel e compartilham os mesmos recursos. A programao realizada por lotes de produtos. O departamento de produo informa que so necessrios 10 homens x hora para um lote de calas e 20 homens x hora para um lote de camisas. Sabe-se que no necessria mo-de-obra especializada para a produo de calas, mas so necessrios 10 homens x hora desse tipo de mo-de-obra para produzir um lote de camisas. O departamento de pessoal informa que a fora mxima de trabalho disponvel de 30 homens x hora de operrios especializados e de 50 homens x hora de operrios no - especializados. Da planta de produo, sabemos que existem apenas 2 mquinas com capacidade de produzir os dois tipos de produtos, sendo que a mquina 1 pode produzir um lote de calas a cada 20 horas e um lote de camisas a cada 10 horas, no podendo ser utilizada por mais de 80 horas no perodo considerado. A mquina 2 pode produzir um lote de calas a cada 30 horas e um lote de camisas a cada 35 horas, no podendo ser utilizada por mais de 130 horas no perodo considerado. So necessrios dois tipos de matrias-primas para produzir as calas e camisas. Na produo de um lote de calas so utilizados 12 quilos da matria-prima A e 10 da B. Na produo de um lote de camisas so utilizados 8 quilos da matria-prima A e 15 da B. O almoxarifado informa que, por imposio de espao, s pode fornecer 120 quilos da matria-prima A e 100 quilos de B, no perodo considerado. Sabendo-se que o lucro pela venda de $800,00 nos lotes de camisas e $500,00 nos lotes de calas, formule o problema de maximizar o lucro da operao produtiva em pauta.

1.3 Formulao Matemtica O objetivo do problema descrito acima determinar o nmero de lotes de calas e camisas que devem ser produzidos de maneira a maximizar o lucro pela venda dos mesmos, sem violar as restries impostas pela disponibilidade dos recursos utilizados.

A tabela abaixo resume a utilizao necessria dos recursos (neste caso, a qualidade da mo-de-obra, mquinas e matrias-primas) para a produo de um lote de cada produto, assim como a disponibilidade de cada um desses recursos:
Mo-de-obra No-especializada ( homens x hora ) Calas Camisas Disponibilidade Mo-de-obra especializada ( homens x hora ) Mquina 1 ( horas ) Mquina 2 ( horas ) Matriaprima A ( Kg ) Matria- prima B ( kg )

10 10 50

10 30

10 20 80

30 35 130

12 8 120

10 15 100

Tabela 1.1: Utilizao necessria dos recursos e suas disponibilidades.

Definimos as variveis do problema como:


x j = Quantidade de lotes do produto j produzidos ,

j = 1 (calas) j = 2 (camisas)

z = Lucro total das vendas do lotes


z =

j=1

xj

onde cj o preo de venda do lote do produto j. As nicas restries do problema dizem respeito disponibilidade dos recursos utilizados da produo dos lotes de calas e camisas. Se denotarmos por rij, i = 1,..., 6 a quantidade necessria do recurso i utilizada para a produo de um lote do produto j, e di como sua disponibilidade, as restries podem ser escritas da forma:

r
j =1

ij

x j di

, i = 1,..., 6

A formulao completa do problema :


Max z = 500 x 1 + 800 x 2 sa 10 x 1 + 10 x 2 50 10x 2 30 20 x 1 + 10 x 2 80 30 x 1 + 35 x 2 130 12x 1 + 8 x 2 120 10 x 1 + 15 x 2 100 x1 , x 2 0 Restries de no - negatividade Disponibilidade das mquinas Disponibilidade das mquinas Disponibilidade de mo - de - obra

1.4 Criando um novo projeto no AIMMS Em algum diretrio de seu acesso, crie um sub-diretrio "Arquivos do AIMMS" para os novos projetos que sero construdos. Para iniciar o AIMMS, selecione o programa atravs do cone .

Cada vez que o AIMMS aberto, uma caixa de dilogo com "A dica do dia" mostrada. Como o prprio nome j diz, so dicas, vale a pena prestar ateno nelas. Pressione "Close" para fech-la. Para criar um novo projeto, pressione o boto "New Project" no canto superior esquerdo da tela principal do programa. , que se encontra

A caixa de dilogo mostrada na Figura 1.1 aparecer. Determine "Lotes" como o nome do novo projeto. Selecione o diretrio de trabalho , ou especifique-o manualmente no campo "Create in folder". atravs do boto Pressione o boto "OK".

Figura 1.1 : Caixa de dilogo para um novo projeto.

O AIMMS exibir a janela da Figura 1.2, indicando que o programa est pronto para a insero do modelo e dos dados.

Figura 1.2 : Janela da estrutura do projeto.

1.5 Construindo um modelo no AIMMS na janela principal do projeto Tecle F8 ou clique o boto "Model Explorer" para abrir a estrutura inicial do modelo, mostrada na Figura 1.3.

Figura 1.3 : Estrutura inicial do modelo.

Esta estrutura inicial em rvore contm uma seo de declaraes "Declaration", onde sero inseridos os elementos bsicos do modelo matemtico, e trs procedimentos prdefinidos, "MainInitialization" , "MainExecution" e "MainTermination". A princpio, apenas as sees "Declaration" e "MainExecution" sero utilizadas para a construo e execuo do Problema das calas e camisas. As funes dos demais procedimentos sero explicadas mais adiante neste tutorial. Declarando conjuntos e ndices Clique duas vezes no cone "Declaration" . Uma nova linha ser criada, com o campo preenchido com a palavra "empty", e o conjunto de botes ficar ativo na barra de ferramentas. Pressione o boto "New Set" .

Defina o nome "S_Produtos" para o conjunto e pressione "ENTER" para registrlo. Pressione "ENTER" novamente ou clique duas vezes sobre o nome do conjunto criado. O AIMMS abrir o formulrio de atributos, mostrado na Figura 1.4. Segundo o nosso modelo matemtico, vamos atribuir o ndice j para os produtos. Para isso, preencha o campo "Index" com o ndice j. Voc tambm pode preencher documentao de seu projeto. o campo "Comment", para uma boa

Complete o formulrio de atributos pressionando o boto "Check, Commit and , localizado no canto superior direito do formulrio de atributos. Este Close" comando verifica se os dados inseridos no sofrem algum tipo de incompatibilidade com o resto do modelo.

Figura 1.4 : Formulrio de atributos do conjunto de produtos.

O conjunto dos recursos que so utilizados na produo dos lotes pode ser criado da mesma forma, atribuindo-se o nome "S_Recursos" e ndice i . A Figura 1.5 mostra a estrutura do modelo aps a criao dos dois conjuntos.

Figura 1.5 : Estrutura de modelo com os conjuntos criados.

O asterisco direita do nome da estrutura do modelo indica que os dados inseridos ainda no foram gravados no projeto. Para grav-los, pressione o cone "Save Project" localizado no canto superior esquerdo da barra de ferramentas.

Declarando parmetros A insero dos parmetros do modelo no AIMMS pode ser feita de maneira anloga aos conjuntos. Quando declaramos um parmetro relacionado a algum conjunto j existente no modelo, podemos fazer essa associao de duas maneiras: utilizando o ndice do conjunto entre parnteses logo aps o nome do parmetro, ou definindo-o no formulrio de atributos no campo "Index domain". Caso o parmetro seja um nmero escalar, o campo referente ao ndice deve permanecer em branco.

Pressione o boto "New Parameter"

localizado na barra de ferramentas.

Especifique "P_Disponibilidade(i)" como o nome do novo parmetro e pressione "ENTER" para registr-lo.

Se voc pressionar "ENTER" novamente, o formulrio de atributos do parmetro "P_Disponibilidade(i)" ser aberto, e voc poder verificar que o campo "Index domain" foi preenchido automaticamente. A Figura 1.6 mostra o formulrio:

Figura 1.6 : Formulrio de atributos do parmetro de disponibilidade dos recursos.

Feche o formulrio de atributos pressionando o boto "Check, Commit and Close" .

Outro parmetro do nosso modelo so as quantidades de recursos necessrias para a produo de um lote de cada um dos produtos considerados. Pressione o boto "New Parameter" localizado na barra de ferramentas.

Especifique "P_Utilizacao(i,j)" como o nome do novo parmetro e pressione "ENTER" para registr-lo. Neste caso, o parmetro uma matriz que representa a quantidade do recurso i necessria na produo de um lote do produto j. Feche o formulrio de atributos pressionando o boto "Check, Commit and . Close"

O ltimo parmetro do nosso modelo o lucro de venda de cada lote dos produtos. Crie um novo parmetro, com nome "P_LucroUnitario(j)", que se refere ao lucro obtido com a venda de um lote do produto j. Obs.: Os nomes de quaisquer identificadores do modelo, sejam eles conjuntos, parmetros, variveis ou restries, no podem conter caracteres de acentuao grfica ou espaos em branco. Para declarar nomes de identificadores com espaos, utilize o caracter underline " _ ".

O nome de um identificador pode ser modificado, mesmo que j tenha sido registrado. Para isso, clique com o boto direito do mouse sobre o nome do identificador a ser alterado, e em seguida, selecione "Rename" com o boto esquerdo. Outra maneira de entrar no modo de edio do nome do identificador clicar uma vez com o boto direito do mouse.

Aps a criao dos trs parmetros, a estrutura do modelo igual mostrada pela Figura 1.7.

Figura 1.7 : Estrutura do modelo aps a criao dos parmetros.

Grave a estrutura declarada, pressionando o cone "Save Project"

Declarando variveis A declarao de variveis no AIMMS similar declarao de parmetros. Mas alm de definirmos qual conjunto a varivel refere-se, devemos tambm determinar a qual conjunto de nmeros ela pertence. Dependendo do problema que estvamos construindo, as variveis podem ser reais, reais positivas, inteiras, binrias, etc.

Pressione o boto "New Variable"

localizado na barra de ferramentas.

Especifique "V_LotesProduzidos(j)" como o nome da nova varivel e pressione "ENTER" para registr-la. Essa varivel nos dir quantos lotes de calas e camisas devem ser produzidos de tal forma que o lucro total com suas vendas seja o maior possvel.

Pressione "ENTER" novamente para abrir o formulrio de atributos da varivel "V_LotesProduzidos(j)". Pressione o boto referente ao campo "Range". O AIMMS exibir uma caixa de dilogo onde podemos definir o domnio de nossa varivel. O AIMMS possui alguns domnios pr-definidos, mas podemos tambm determinar outros domnios mais adequados ao problema que estamos construindo. No nosso caso, como a produo das calas e camisas s pode ser feita em lotes, sabemos que nossa varivel s pode assumir valores inteiros e maiores ou iguais a zero. A Figura 1.8 mostra a caixa de dilogo: Selecione a opo "User Defined" na caixa de dilogo. Selecione a opo "Integer" logo abaixo. Defina "0" como o valor mnimo que a varivel pode assumir, no campo "Lower Bound". O campo "Upper Bound" j est preenchido corretamente com " inf ". Pressione o boto "OK" para fechar a caixa de dilogo.

Figura 1.8 : Caixa de dilogo do domnio da varivel.

Feche o formulrio de atributos pressionando o boto "Check, Commit and Close" .

Devemos declarar tambm outra varivel, que nos dir de quanto foi a receita total com a venda dos lotes produzidos. O objetivo do problema maximizar o lucro total com as vendas dos lotes de calas e camisas produzidos, logo, maximizando este nmero de lotes, estaremos maximizando tambm o lucro obtido. Crie uma nova varivel chamada "V_LucroTotal".

Abra o formulrio de atributos da nova varivel. No campo "Definition", insira a seguinte expresso: sum [ j , P_LucroUnitario(j)* V_LotesProduzidos(j) ]

Voc pode digitar a expresso inteira acima, ou pode utilizar o recurso de preenchimento automtico que o AIMMS oferece. Para isso, digite a letra "P" ou "p", e em seguida, mantenha pressionada a tecla "Ctrl" enquanto pressiona 2 vezes a tecla "Spacebar". Na primeira vez que voc pressionar "Spacebar", o caracter "_" aparecer aps o caracter "P", e na segunda vez, uma janela mostrar todos os identificadores j registrados do problema que comeam com a letra "P". Selecione o parmetro "P_LucroUnitario" e insira-o na expresso. Lembre-se de adicionar tambm o ndice ( j ). Repita o procedimento descrito acima, percebendo que desta vez, necessrio pressionar "Spacebar" apenas uma vez para a janela com os identificadores ser aberta. Este procedimento vlido para o preenchimento automtico de qualquer identificador j registrado no modelo. O formulrio de atributos deve ter o mesmo contedo do formulrio mostrado na Figura 1.9. Feche o formulrio de atributos pressionando o boto "Check, Commit and Close" . Dessa maneira, o AIMMS verifica se sua definio para a varivel est compatvel com os outros identificadores do modelo.

Figura 1.9 : Formulrio de atributos da varivel "V_LucroTotal".

Declarando restries Temos somente um tipo de restrio neste problema, o que diz respeito disponibilidade dos recursos.

Pressione o boto "New Constraint"

localizado na barra de ferramentas.

Defina o nome "C_RestricaoDisponibilidade(i), e no campo "Definition" declare: sum [ j , P_Utilizacao(i, j)* V_LotesProduzidos(j) ] <= P_Disponibilidade(i)

10

A Figura 1.10 mostra o formulrio de atributos da restrio criada.

Figura 1.10 : Formulrio de atributos da restrio "C_RestricaoDisponibilidade(i)".

Declarando o Programa Matemtico no Programa Matemtico que definimos a funo objetivo do problema. Devemos definir se trata-se de um problema de maximizar ou minimizar uma funo, qual varivel o objetivo do modelo, se o problema linear, no-linear, inteiro, misto, etc.

Pressione o boto

localizado na barra de ferramentas. e pressione "OK".

Selecione o cone "Mathematical Program"

Especifique o nome do Programa Matemtico como "MaximoLucroTotal" Preencha o formulrio de atributos como mostrado na Figura 1.11, usando para isso o boto .

Os campos "Constraints" e "Variables" devem ficar em branco. Quando isso acontece, o AIMMS assume que todas as variveis e restries declaradas fazem parte do Programa Matemtico. Como trata-se de um modelo onde as variveis devem assumir somente valores inteiros, temos que definir como "mip" (mixed integer problem) o campo "Type", que especifica o tipo do modelo. Se as variveis pudessem assumir valores contnuos, poderamos definir o problema como "lp" (linear problem). O campo "Objective" requer sempre uma varivel escalar.

Figura 1.11 : Formulrio de atributos completo para o Programa Matemtico.

11

Finalmente, todos os identificadores do modelo foram declarados. A estrutura do modelo final mostrada pela Figura 1.12.

Figura 1.12 : Estrutura do modelo final.

Voc pode verificar a validade do modelo construdo pressionando F5, ou selecionando o menu "Run" na barra de ferramentas da janela principal do AIMMS, e logo em seguida, selecionando "Compile All". Voc receber uma mensagem de erro somente se houver alguma incompatibilidade entre os identificadores do modelo. Isso dificilmente ocorrer se na criao dos voc tiver utilizado a opo "Check, Commit and Close" identificadores. Uma vez verificada a validade do modelo, grave seu projeto pressionando Visualizando os identificadores Uma vez que o modelo est construdo, ser til em algumas ocasies que voc possa ver todos os identificadores e algumas de suas propriedades simultaneamente. O AIMMS permite a criao de janelas de visualizao. Voc pode escolher visualizar somente as variveis, os conjuntos, e suas especificaes. Como exemplo, vamos mostrar como criar a janela que exibe todos os identificadores e suas definies. Pressione o cone "Identifier Selector" projeto, ou pressione "Crtl F8" . , localizado na janela principal do .

Selecione a opo "Identifiers with Definition" . Com o boto direito do mouse, selecione o comando "Open With..." no menu que ser exibido em seguida, como mostra a Figura 1.13.

12

Figura 1.13: Janela do Seletor de identificadores.

Selecione a opo "Domain mostra a Figura 1.14.

Definition"

na janela "View Manager", como

Figura 1.14 : Janela do gerenciador de visualizao.

Pressione "Open" para exibir a janela de visualizao dos identificadores mostrada na Figura 1.15.

Figura 1.15 : Janela de visualizao dos identificadores e suas definies.

13

1.6 Inserindo os dados de um modelo no AIMMS Como no problema proposto, o nmero de dados do modelo pequeno, eles podem ser inseridos manualmente. O AIMMS possibilita tambm que os dados sejam inseridos partir de um banco de dados j existente, mas isso ser exposto mais adiante. Abra o formulrio de atributos do conjunto "S_Produtos". Pressione o boto "Data" .

No campo vazio que aparece no topo da pgina de dados, insira os nomes dos produtos que devem ser produzidos. Para isso, digite "Calas" e pressione "ENTER" para inser-lo. Repita o mesmo procedimento para "Camisas". A Figura 1.16 mostra a pgina de dados completa para o conjunto "S_Produtos. Pressione "Close" para fechar a janela.

Figura 1.16 : Pgina de dados para o conjunto "S_Produtos".

Voc pode modificar e apagar elementos j inseridos na pgina de dados. Para modificlos, selecione o elemento desejado. Ele aparecer no campo de edio no topo da pgina, e voc pode ento modific-lo e inser-lo novamente. Para apagar um elemento j existente, . selecione-o e pressione o boto "Delete Data"

Abra a pgina de dados do conjunto "S_Recursos". Para isso, voc pode abrir o , ou acess-la a partir da formulrio de atributos e pressionar o boto "Data" pgina de dados do conjunto "S_Produtos" pressionando o boto "Next Page Data" . O boto permite selecionar a pgina de dados de qualquer um dos identificadores do modelo. Insira os nomes dos recursos utilizados, dados por "Mo-de-obra Especializada", "Mo-de-obra no-especializada" , "Mquina 1" , "Mquina 2" , "Matria-prima 1" e "Matria-prima 2".A Figura 1.17 mostra a pgina de dados do conjunto "S_Recursos" preenchida.

14

Figura 1.17 : Pgina de dados do conjunto "S_Recursos".

Crie a pgina de dados para o parmetro "P_Disponibilidade(i)" dos recursos. Selecione o primeiro campo de dados, determine o primeiro valor e pressione "ENTER" para inser-lo. Os demais valores so inseridos da mesma forma. A Figura 1.18 mostra a pgina de dados do parmetro "P_Disponibilidade(i)" completa.

Figura 1.18 : Pgina de dados do parmetro "P_Disponibilidade(i)".

Crie a pgina de dados do parmetro "P_Utilizacao(i,j)" , como exibida pela Figura 1.19.

Figura 1.19 : Pgina de dados do parmetro "P_Utilizacao(i,j)".

Crie a pgina de dados do parmetro "P_LucroUnitario(j)", como mostrada pela Figura 1.20.

15

Figura 1.20 : Pgina de dados do parmetro "P_LucroUnitario(j)".

1.7 Gravando os dados de um modelo no AIMMS O AIMMS permite que os dados de todos os identificadores sejam gravados no que chamamos de 'case'. Ou seja, para a mesma estrutura de um modelo matemtico, podemos ter problemas com valores de parmetros diferentes, que podem ser gravados em casos diferentes. Vamos gravar os dados que acabaram de ser inseridos em um caso chamado "Produo de lotes de calas e camisas". Selecione o menu "Data" , na barra de ferramentas da janela principal do AIMMS e execute o comando "Save Case". Na caixa de dilogo "Save Case", preencha o campo "Name" com "Produo de lotes de calas e camisas", sem as aspas, conforme mostra a Figura 1.21. Pressione o boto "SAVE" para gravar os dados neste caso.

Figura 1.21 : Caixa de dilogo para gravao dos dados em um novo caso.

Quando um projeto do AIMMS fechado e reaberto novamente, no adotado como procedimento padro do programa o carregamento dos dados gravados anteriormente. Isso se deve ao fato de que um modelo pode ter vrios casos gravados. Entretanto, voc pode determinar que o AIMMS carregue um caso especfico cada vez que o projeto iniciado, usando a caixa de dilogo "AIMMS Options" mostrada pela Figura 1.22.

16

Selecione o menu"Settings" e execute o comando "Project Options". Selecione a pasta "Project Startup & Authorization" na estrutura de opes e clique na opo "Startup Case" na janela direita. para selecionar o caso "Produo de lotes de calas e camisas" Pressione o boto e pressione "OK" para fechar a caixa de dilogo "Select Case". Pressione o boto "Apply" na caixa de dilogo "AIMMS Options" e finalize o procedimento pressionando "OK".

Figura 1.22 : Caixa de dilogo "AIMMS Options".

Lembre-se sempre de gravar seu projeto, pressionando o boto . A opo de configurao especificada acima gravada juntamente quando voc grava o seu projeto todo. Entretanto, note que gravar um projeto no implica que os dados inseridos foram gravados. Os dados sempre devem ser gravados como um 'caso'. Mesmo que o AIMMS esteja programado para carregar um determinado caso como o caso inicial, voc pode carregar os demais casos gravados no projeto manualmente da seguinte maneira: No menu "Data", selecione a opo "Load Case" e execute o comando "as Active..." Selecione o caso desejado na caixa de dilogo "Load Case", mostrada pela Figura 1.23. Pressione o boto "Load".

17

Figura 1.23 : Caixa de dilogo "Load Case".

1.8 Resolvendo o modelo Temos o modelo matemtico construdo, todos os identificadores, seus atributos e seus dados foram declarados. Agora, precisamos construir pelo menos um procedimento que oriente o AIMMS sobre o que deve ser feito com o modelo. Nesta parte do tutorial, vamos inserir duas declaraes no procedimento j existente "MainExecution" : uma para fazer o AIMMS resolver o Programa Matemtico e outro para determinar que as variveis assumam valor zero, caso a soluo do Programa Matemtico no seja tima. O procedimento "MainExecution" pode ser declarado da seguinte forma: Selecione o procedimento "MainExecution" na estrutura do modelo e abra-o, clicando duas vezes com o boto esquerdo do mouse. Insira as duas declaraes mostradas pela Figura 1.24. Feche o formulrio de atributos do procedimento "MainExecution" pressionando o . boto "Check, Commit and Close"

Figura 1.24 : Formulrio de atributos do procedimento "MainExecution".

18

Se o AIMMS apresentar uma caixa de dilogo detalhando erros na compilao do modelo, reveja suas declaraes e faa as correes necessrias. Execute o procedimento "MainExecution" pressionando F6 ou selecionando a opo "Main Execution" no menu "Run".

Pressionando simultaneamente "Ctrl" e "p", o AIMMS exibir uma janela de progresso que contm informaes selecionadas respeito do progresso que foi feito (ou est fazendo) durante a fase de execuo. A Figura 1.25 mostra a janela de progresso esperada.

Figura 1.25 : Janela de progresso do AIMMS.

Da janela de progresso, podemos extrair algumas informaes fundamentais da resoluo do modelo, tais como: projeto em andamento, procedimento do modelo que foi executado, programa Matemtico sobre o qual foi executado o procedimento, nmero de variveis e restries do modelo, tipo do modelo, direo da funo objetivo, nmero de iteraes, se a soluo encontrada foi tima, o valor da soluo tima, etc. Uma vez que o AIMMS resolveu o problema, os valores das variveis "V_LotesProduzidos" e "V_LucroTotal" tornam-se disponveis em suas pginas de dados correspondentes. Abra o formulrio de atributos da varivel "V_LotesProduzidos" e clique no boto para ver a quantidade de lotes produzidos de cada produto, como mostra "Data" a Figura 1.26.

19

Figura 1.26 : Quantidade de lotes produzidos.

Abra o formulrio de atributos da varivel "V_LucroTotal" e clique no boto "Data" para ver o lucro total obtido com a venda dos lotes produzidos, como mostra a Figura 1.27.

Figura 1.27 : Lucro total das vendas dos lotes produzidos.

1.9 Construindo uma pgina no AIMMS Uma vez o problema resolvido, os valores timos das variveis podem ser acessados atravs de suas pginas de dados correspondentes. Entretanto, esta visualizao pouco adequada, pois no nos mostra os identificadores, seus parmetros e os resultados do problema simultaneamente. O AIMMS permite a construo de pginas onde podemos apresentar os dados relevantes ao problema, alm de possibilitar a mudana nos valores dos parmetros e uma resoluo de um novo problema, sem que tenhamos que acessar a estrutura principal do programa. Prvia da pgina de dados A Figura 1.28 mostra a pgina final que ser construda para o problema de produo dos lotes das calas e das camisas.

20

Figura 1.28 : Pgina final do modelo.

Criando uma nova pgina Para criar uma nova pgina vazia no projeto, voc deve seguir os seguintes passos: Pressione o boto "Page Manager" pressione F9. na janela da estrutura do projeto ou

Pressione o boto "New Page", localizado na barra de ferramentas da janela principal do AIMMS. Especifique " Dados de entrada e sada da produo de lotes de calas e camisas" como o nome da nova pgina, como mostra a Figura 1.29.

Figura 1.29 : Gerenciador de pginas com uma nica pgina.

Pressione "ENTER" para registrar a nova pgina.

Inserindo os dados de entrada do modelo Uma pgina do AIMMS apresenta-se de dois modos: o modo de edio e o modo do usurio.O modo de edio utilizado para criar e modificar objetos em uma pgina. O modo do usurio utilizado para visualizao e modificao dos dados exibidos na pgina.

21

Para abrir uma nova pgina no modo de edio: Selecionar a nova pgina na caixa de dilogo "Page Manager". Pressionar o boto "Edit Mode" selecionada no modo de edio. na barra de ferramentas para abrir a pgina

Para criar uma nova tabela, voc deve: Pressionar o boto "New Table" na barra de ferramentas.

Clicar com o boto esquerdo do mouse em algum ponto da tela, e mantendo-o pressionado, arrast-lo at obter uma borda de janela do tamanho desejado. Soltar o boto do mouse. Uma caixa de dilogo chamada "Identifier" com a estrutura do projeto e todos os identificadores declarados aparecer, como mostra a Figura 1.30. Nesta caixa de dilogo possvel selecionar qual dos identificadores far parte da nova tabela.

Figura 1.30 : Caixa de dilogo para seleo dos identificadores.

Selecione o parmetro "P_Utilizacao(i,j)". Uma segunda caixa de dilogo "Identifier" aparecer, mas neste caso, apenas pressione "Finish". Ajuste o tamanho da janela, se for necessrio. Para isso, posicione a ponta do cursor do mouse sobre a extremidade da borda a ser ajustada. Pressione o boto esquerdo do mouse e, mantendo-o pressionado, arraste o cursor at o ponto desejado.

Como o parmetro "P_Utilizacao(i,j)" bidimensional, podemos aproveitar para inserir os parmetros "P_Disponibilidade(i)" e "P_LucroUnitario(j)" juntamente na mesma tabela.

22

Selecione a tabela onde deseja inserir o novo identificador, clicando sobre ela. Pressione o boto "Properties" localizado na barra de ferramentas, ou clique com o boto direito do mouse sobre a tabela e selecione a opo "Properties", para acessar a caixa de dilogo das propriedades da tabela. Selecione a opo "Contents", como mostra a Figura 1.31.

Figura 1.31 : Caixa de dilogo das propriedades da tabela.

Pressione o boto "Add" e selecione o parmetro "P_Disponibilidade(i). Pressione os botes "Next" e "Finish", sucessivamente. Repita o procedimento para o parmetro "P_LucroUnitario(j)". Aps adicionar os dois novos identificadores na tabela, pressione "Apply" e "OK" para fechar a caixa de dilogo das propriedades da tabela.

A Figura 1.32 mostra a tabela resultante com os trs parmetros (dados de entrada) do problema:

Figura 1.32 : Tabela com os dados de entrada do problema.

A princpio, os ttulos dos identificadores na tabela so os mesmos utilizados em suas definies no modelo matemtico. Podemos modificar os ttulos, alterar os nmeros

23

decimais dos dados, centralizar os valores direita, esquerda, ao centro, podemos adicionar cores ao plano de fundo da pgina, enfim... Nossa preocupao na construo de uma pgina do AIMMS apresentar os dados e resultados do modelo de uma forma mais clara e organizada. Voc pode obter uma tabela como a mostrada pela Figura 1.33, modificando itens na caixa de dilogo das propriedades da tabela.

Figura 1.33 : Nova tabela com os dados de entrada do problema.

Bordas Voc pode adicionar bordas sua tabela na opo "Border", na caixa de dilogo das propriedades da tabela. Ttulos Altere os ttulos dos identificadores de sua tabela, renomeando-os na opo "Text". Selecione o identificador "P_Utilizacao(i,j)" . Desmarque a opo "Default Text (from Model)" e especifique "Utilizao de recursos por lote de produto" como o ttulo do identificador na tabela, como mostra a Figura 1.34. Pressione "Apply" para registrar a modificao. Repita o procedimento para os demais identificadores.

Figura 1.34 : Modificao do ttulo dos identificadores.

24

Alinhamento, nmeros decimais e largura de colunas Para cada um dos identificadores do modelo, altere suas propriedades atravs da opo "Format". A Figura 1.35 nos mostra um exemplo, no caso, para o parmetro "P_Utilizacao(i,j)".

Figura 1.35 : Formatao de elementos do parmetro "P_Utilizacao(i,j)".

Podemos criar grficos de barras para representar a disponibilidade dos recursos e o lucro unitrio por unidade de produto. Pressione o boto "New Bar Chart" na barra de ferramentas.

Crie uma janela e selecione o identificador "P_LucroUnitario(j)" Pressione "Next" e "Finish" , sucessivamente. Repita o procedimento para o parmetro "P_Disponibilidade(i)".

Neste momento, voc deve estar com uma pgina semelhante mostrada pela Figura 1.36.

25

Figura 1.36 : Pgina intermediria contendo os dados de entrada do problema.

Inserindo os resultados do modelo Para inserir os resultados obtidos, podemos usar uma tabela composta ou mesmo um grfico de barras. Para criar uma tabela que contenha somente os valores das variveis na soluo tima: Pressione o boto "New Composite Table" Determine o tamanho desejado para a tabela. Selecione o identificador "V_LotesProduzidos(j)" para indicar para quais ndices devem ser exibidos. Pressione o boto "Next" e logo aps, o boto "Finish". .

Uma vez que o domnio dos ndices foi determinado, podemos inserir os valores das variveis que estamos interessados. Pressione o boto "Properties" localizado na barra de ferramentas.

Selecione a opo "Contents" na caixa de dilogo de propriedades. Pressione o boto "Add" e selecione o identificador "V_LotesProduzidos(j)" para completar a tabela composta.

Para criar o grfico de barras contendo o nmero de lotes de calas e camisas produzidos, voc deve proceder da mesma maneira quando criou os grficos de barras para os identificadores "P_LucroUnitario(j)" e "P_Disponibilidade(i)".

26

Como ltimo resultado do modelo, vamos inserir o valor escalar da soluo tima: Pressione o boto "Scalar Object" localizado na barra de ferramentas.

Crie uma caixa de texto para o identificador "V_LucroTotal". Pressione "Finish" para fechar a caixa de dilogo das propriedades.

Criando o boto de execuo Um dos ltimos itens para a construo desta pgina a criao de um boto que possibilita uma nova execuo do Programa Matemtico, sem que tenhamos que sair da pgina de dados do AIMMS. Este recurso muito utilizado quando queremos analisar a variao dos valores de uma soluo tima para o problema, quando os valores de seus parmetros so alterados. Para a criao de tal boto, execute os seguintes passos: Pressione o boto "New Button" e desenhe o boto usando o mouse.

Insira "Resolver o Problema dos Lotes" como o ttulo do boto. Selecione a opo "Actions" na caixa de dilogo das propriedades do boto.

Queremos que, ao pressionarmos o boto "Resolver o Problema dos Lotes", o AIMMS execute novamente o procedimento de resoluo do problema, o "MainExecution". Selecione a opo "Run" como a ao a ser adicionada ao boto. Pressione o boto "Add". Escolha a opo "Procedure" e selecione "MainExecution", conforme mostra a Figura 1.37. Pressione "Apply", seguido de "OK" para fechar a caixa de dilogo.

27

Figura 1.37 : Criao do boto de nova execuo.

Note que o boto de nova execuo somente poder ser usado para resolver o modelo quando a pgina do AIMMS estiver no modo de usurio. Voc pode colocar a pgina nesse localizado na barra de ferramentas da janela modo pressionando o boto "User Mode" principal do AIMMS. Finalizando a pgina A pgina final mostrada pela Figura 1.28 possui trs objetos de texto e bordas que separam os dados de entrada e os resultados do problema. Os ttulos podem ser criados da seguinte maneira: No menu "Object", selecione a opo "Text" e determine a rea onde o texto ser exibido. Especifique "Problema das Calas e Camisas" como um texto esttico, como mostra a Figura 1.38.

28

Figura 1.38 : Caixa de dilogo das propriedades do texto.

Selecione a opo "Font" na caixa de dilogo das propriedades de texto e pressione o boto "Add". Selecione o tamanho e estilo da fonte desejados. Por exemplo, vamos utilizar o estilo "Bold" e tamanho da fonte 20. Pressione o boto "OK". Especifique "Ttulo" como o nome para este padro de fonte. Repita o mesmo procedimento para um padro de fonte denominado "Subttulo". Crie os subttulos "Dados de entrada do problema" e "Resultados", definindo-os como subttulos.

A Figura 1.39 mostra a caixa de dilogo das propriedades de texto com os dois novos padres de fontes criados.

Figura 1.39 : Caixa de dilogo com novos padres de fontes.

29

Finalmente, podemos completar a pgina adicionando retngulos que vo separar em dois grupos os objetos que representam os dados de entrada do problema e os resultados obtidos. Rearranje todas as tabelas, de modo que fiquem alinhadas e centralizadas. Selecione a opo "Rectangle" no menu "Object". Determine o tamanho do retngulo necessrio para agrupar as tabelas desejadas. Voc pode modificar as propriedades de seu retngulo, acessando sua caixa de dilogo atravs do boto direito do mouse.

A Figura 1.40 mostra a pgina finalizada.

Figura 1.40 : Pgina finalizada do modelo.

1.10. Analisando mudanas nos parmetros do modelo Agora que temos o modelo e a pgina construdos, estamos em condies de usar a pgina para analisarmos quais so os efeitos sobre os valores da soluo tima, caso os valores dos parmetros sejam alterados. Primeiramente, pressione o boto "User Mode" usurio. para colocar a pgina no modo de

Por exemplo, suponha que a disponibilidade da mo-de-obra especializada seja reduzida de 30 para 10 homens x hora. Para efetuar essa reduo, voc precisa simplesmente mudar o valor do parmetro referente disponibilidade da mo-de-obra especializada na pgina de dados.

30

No grfico de barras dos recursos, selecione a barra que representa a disponibilidade "Mo-de-obra especializada". Posicione o ponteiro do mouse sobre o topo da barra. Pressione o boto do mouse, e mantendo-o pressionado, desloque o topo da barra at atingir o valor 10.

Procedendo desta maneira, pode ser que nem sempre voc consiga o valor exato desejado. Outra maneira de modificar o valor de um parmetro clicar sobre a barra correspondente e inserir o novo valor no campo de edio que aparece na parte inferior do grfico de barras. Pressione o boto "Resolver o Problema dos Lotes".

Voc vai reparar que com a diminuio de mo-de-obra especializada, um lote de camisas foi deixado de produzir. Em compensao, um lote de calas foi produzido a mais. No caso inicial, tnhamos 2 lotes de calas e 2 lotes de camisas produzidos, com um lucro total de 2.600. No segundo caso, temos um lucro total de 2600 - 800 + 500 = 2300. A Figura 1. 41 mostra a pgina de dados do novo problema.

Figura 1.41 : Pgina de dados do novo problema.

31

2. O Problema do Corte de Bobinas


2.1 Introduo Este segundo modelo trata do problema de perda de material no corte unidimensional de bobinas de papel. O objetivo do problema atender a um certo pedido de bobinas de papel de larguras menores que a da bobina mestre, de forma que a perda em cada padro de corte seja a mnima possvel. Na construo do modelo no AIMMS, voc aprender como utilizar dois ou mais programas matemticos e como salvar casos diferentes em um mesmo modelo. Tambm ser mostrado como construir um Grfico de Gantt, construir duas ou mais pginas com acesso entre elas e como determinar dados e a pgina que sero carregados automaticamente toda vez que o modelo for iniciado.

2.2 Descrio do Problema Uma mquina produz bobinas mestres de papel com largura L = 4200 mm. Uma companhia de papel precisa atender ao pedido de qi bobinas de papel de larguras especficas Li , i = 1, ... , 9 durante um perodo de planejamento, como mostra a Tabela 2.1: i
Largura Li (mm) Quantidade qi (ton)

1 1115 105

Pedidos de larguras a serem satisfeitos (ton) 2 3 4 5 6 7 1500 1000 1275 1430 1150 1055 11 9 18 5 5 12

8 575 15

9 950 16

Tabela 2.1 : Pedidos das bobinas de larguras Li a serem satisfeitos.

Os padres de corte so diferentes maneiras de combinar uma ou mais larguras Li das bobinas pedidas dentro de uma bobina mestre. Um padro de corte especifica o nmero ni i de larguras Li que podem ser cortadas em uma bobina mestre simultaneamente, para = 1,...,9. Por exemplo, um padro de corte representado pelo vetor (n1, ... , n9)T = (2, 0, 1, 0, 0, 0, 0, 0, 1)T especifica que em uma bobina mestre, podem ser cortadas simultaneamente 2 bobinas de 1115 mm, 1 de 1000 mm e 1 de 950 mm. Desde que a largura da bobina mestre de 4200 mm, a perda de material quando utilizamos este padro de corte de 4200 2 x 1115 1 x 1000 1 x 950 = 20 mm e podemos calcular a perda percentual dada por 20/4200 = 0.0047 = 0.47%.

32

A companhia considera somente os 15 padres de cortes mostrados na Tabela 2.2. Largura Li (mm) Padro 1 Padro 2 Padro 3 Padro 4 Padro 5 Padro 6 Padro 7 Padro 8 Padro 9 Padro 10 Padro 11 Padro 12 Padro 13 Padro 14 Padro 15

1115 2 1 2 0 0 0 0 0 0 1 1 3 3 2 0

1500 0 2 0 0 0 2 0 0 0 0 0 0 0 0 0

1000 1 0 0 0 0 0 0 0 0 0 2 0 0 0 4

1275 0 0 1 0 3 0 0 1 0 0 0 0 0 0 0

1430 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0

1150 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0

1055 0 0 0 1 0 1 0 0 0 2 1 0 0 0 0

575 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0

950 1 0 0 0 0 0 4 0 0 1 0 0 0 2 0

Tabela 2.2 : Nmero de bobinas de largura Li obtidas em cada padro de corte.

Definimos as variveis de deciso como: xp = Peso da bobina mestre (ton) cortado de acordo com o padro de corte p, p = 1, ... , 15. Formular o problema como um Problema de Programao Linear para determinar quantas toneladas da bobina mestre devem ser cortadas de acordo com um dado padro de corte, de forma a satisfazer a demanda dos pedidos com perda percentual total mnima. Como a formulao muda se a tonelagem a ser entregue dos pedidos pode sofrer uma variao de 10%? ( Caso formulado por D.H.Lombardo Ferreira, Unisoma, Brasil ) 2.3 Formulao Matemtica

Sejam L = 4200 mm = Largura da bobina mestre. Li = Larguras das bobinas do pedido a ser satisfeito , i = 1, ... , 9. di = Demanda (ton) da bobina de largura Li , i = 1, ... , 9. nip = Nmero de bobinas de largura Li obtidas no padro de corte p , p = 1, ... , 15.

33

Podemos definir outros parmetros do modelo, dados por: Porcentagem do peso da bobina mestre: Porcentagem do peso da bobina mestre utilizado para obter o peso das bobinas de largura Li. pbmi = Li /L Perda no padro de corte (mm):

Pp = L

n
i =1

ip

Li

Perda Percentual no padro de corte:

PP p = P p / L

As restries do problema quando as demandas das bobinas so fixas so do tipo:

pbm i n ip x p di
p =1

15

Quando as demandas das bobinas podem sofrer uma variao de 10%, as restries do problema so dadas por:

0.9di pbmi n ip x p 1.1di


p =1

15

Como o objetivo do problema minimizar a perda percentual do peso da bobina mestre utilizado, podemos escrever a funo objetivo como:

Min z =

PP x
p =1 p

15

A Tabela 2.3 mostra as perdas (mm) em cada um dos 15 padres de corte. Padro p Perda (mm)
1 20 2 85 3 120 4 285 5 375 6 145 7 400 8 65 9 175 10 25 11 30 12 280 13 855 14 70 15 200

Tabela 2.3 : Perda de papel nos padres de cortes.

34

Formulao do Problema com demanda fixa: A formulao completa para o problema com demandas fixas dada por:
1 ( 20x 1 + 85x 2 + 120x 3 + 285x 4 + 375x 5 + 145x 6 + 400x 7 + 4200 65x 8 + 175x 9 + 25x 10 + 30x 11 + 280x 12 + 855x 13 + 70x 14 + 200x 15 )

Min z

sa
1115 ( 2x1 + x2 + 2x3 + x10 + x11 + 312 + 3x13 + 2x14 ) 105 4200 1500 ( 2x2 + 2x6 ) 11 4200 1000 ( x1 + 2x11 + 4x15 ) 9 4200 1275 ( x3 + 3x5 + x8 ) 18 4200 1430 ( 2x4 + 2x8 ) 5 4200 1150 ( 3x9 ) 5 4200 1055 ( x4 + x6 + 2x10 + x11 ) 12 4200 575 ( x3 + x9 + x12 ) 15 4200 950 ( x1 + 4x7 + x10 + 2x14 ) 16 4200 x1, x2 ,..., x15 0

35

Formulao do Problema com demanda varivel A formulao para o problema, quando as demandas das bobinas podem sofrer uma variao de 10% dada por:

Min z

1 ( 20x 1 + 85x 2 + 120x 3 + 285x 4 + 375x 5 + 145x 6 + 400x 7 + 4200 65x 8 + 175x 9 + 25x 10 + 30x 11 + 280x 12 + 855x 13 + 70x 14 + 200x 15 )

sa
94, 5 9, 9 8 ,1 16, 2 4, 5 4, 5 10, 8 13, 5 14, 4 1115 ( 2x1 + x2 + 2x3 + x10 + x11 + 312 + 3x13 + 2x14 ) 115, 5 4200 1500 ( 2x2 + 2x6 ) 12,1 4200 1000 ( x1 + 2x11 + 4x15 ) 9, 9 4200 1275 ( x3 + 3x5 + x8 ) 19, 8 4200 1430 ( 2x4 + 2x8 ) 5 , 5 4200 1150 ( 3x9 ) 5 , 5 4200 1055 ( x4 + x6 + 2x10 + x11 ) 13, 2 4200 575 ( x3 + x9 + x12 ) 16, 5 4200 950 ( x1 + 4x7 + x10 + 2x14 ) 17, 6 4200

x1, x2 ,..., x15 0

36

2.4 Construindo o modelo no AIMMS

Crie um novo projeto, chamado "Problema das Bobinas". Crie as declaraes chamadas "Dados de Entrada", "Modelo de Corte" e "Declaraes Grafico de Gantt". Para isso, voc pode renomear o primeiro cone para a primeira declarao. Para as demais, selecione a ltima declarao feita e pressione novamente o cone , localizado na barra de ferramentas da janela principal do AIMMS. Crie os procedimentos chamados "VisualizacaoPadroes", "MainExecution01" e "MainExecution02". Para criar o primeiro procedimento, selecione a ltima , localizado na barra de declarao feita e pressione o boto "New Procedure" tarefas. Para criar o procedimento "MainExecution01", basta renomear o procedimento "MainExection" j existente.

A Figura 2.1 mostra a estrutura do modelo com as declaraes e procedimentos criados.

Figura 2.1: Estrutura inicial do modelo.

Declarao dos dados de entrada do modelo Na declarao "Dados de Entrada", voc dever criar um conjuntos e trs parmetros: SET: identifier index order by : Larguras : i : - LargurasFinais(i)

Obs: Note que o parmetro "LargurasFinais(i) ainda no foi declarado. Portanto, declare este parmetro antes de preencher o campo de informao "Order by". Este campo est indicando que os elementos do conjunto "Larguras" sero ordenados em ordem decrescente dos elementos do parmetro "LargurasFinais(i)". Insira na pgina de dados do conjunto "Larguras" os valores das larguras das bobinas pedidas, seguidos da unidade (mm), como mostra a Figura 2.2.

37

Figura 2.2: Pgina de dados do conjunto "Larguras".

Declare tambm os parmetros: PARAMETER: identifier : Demanda index domain : i Insira os valores das demandas das bobinas, como proposto no modelo matemtico. PARAMETER: identifier definition : LarguraBobinaMestre : 4200

PARAMETER: identifier : LargurasFinais index domain : i Especifique na pgina de dados do parmetro "LargurasFinais" os prprios valores das larguras das bobinas, como mostra a Figura 2.3.

Figura 2.3: Pgina de dados do parmetro "LargurasFinais(i)".

38

Declaraes do Modelo de Corte Na declarao "Modelo de Corte", voc dever declarar os identificadores mostrados na Figura 2.4:

Figura 2.4: Identificadores contidos na declarao "Modelo de Corte".

SET: identifier subset of index definition

: PadraoDeCorte : Integers : p : { 1..15 }

Quando inserirmos a definio { 1..15 } para este identificador, o AIMMS cria um conjunto de dados contendo 15 nmeros inteiro, variando de 1 a 15, para representar os 15 padres de cortes utilizados neste modelo. PARAMETER: identifier : LargurasNoPadrao index domain : (p,i) Inserir a tabela de padres de cortes proposto pelo modelo. Os parmetros abaixo no necessitam ter seus dados inseridos manualmente, eles so calculados pelo AIMMS a partir da sua definio. PARAMETER: identifier : PerdaNoPadrao index domain : p : LarguraBobinaMestre sum ( i ,LargurasFinais(i)*LargurasNoPadrao(p,i) ) definition PARAMETER: identifier : PerdaPercentual index domain : p definition : ( 100*PerdaNoPadrao(p) ) / LarguraBobinaMestre

39

PARAMETER: identifier : PorcentagemPesoBobinaMestre index domain : i definition : LargurasFinais(i)/LarguraBobinaMestre PARAMETER: identifier definition : VariacaoDemanda : 10

VARIABLE: identifier : PesoCortadoComPadrao index domain : p range : nonnegative VARIABLE: identifier definition : PerdaPercentualTotal : sum(p, (PerdaPercentual(p)/100)*PesoCortadoComPadrao(p))

Os identificadores declarados abaixo, apesar de serem funes da varivel "PesoCortadoComPadro(p)", so interpretados pelo AIMMS como parmetros do problema. PARAMETER: identifier definition : PesoTotalBobinaMestre : sum(p , PesoCortadoComPadrao(p))

PARAMETER: identifier : TonelagemProduzida index domain : i definition : PorcentagemPesoBobinaMestre(i)* sum( p, LargurasNoPadrao(p,i)* PesoCortadoComPadrao(p) ) PARAMETER: identifier : ExcedenteDeProducao index domain : i : TonelagemProduzida(i) - Demanda(i) definition No problema proposto, temos dois problemas a serem resolvidos: minimizar a perda percentual de papel com o corte das bobinas mestres, quando a demanda fixa e quando ela pode sofrer uma variao na tonelagem pedida. Para isso, temos que declarar os dois tipos de restries, uma para cada tipo de demanda. CONSTRAINT: identifier : RestricaoDemandaFixa index domain : i : PorcentagemPesoBobinaMestre(i)* sum(p, LargurasNoPadrao(p,i)* definition PesoCortadoComPadrao(p)) >= Demanda(i) CONSTRAINT: identifier : RestricaoDemandaVariavel index domain : i definition : (1 - (VariacaoDemanda/100))*Demanda(i) <=PorcentagemPesoBobinaMestre(i)* sum(p, LargurasNoPadrao(p,i)*PesoCortadoComPadrao(p)) <= (1 + (VariacaoDemanda/100))*Demanda(i)

40

Como temos dois problemas a serem resolvidos, fica claro que tambm teremos dois Programas Matemticos nesse modelo. Nestes casos, conveniente a criao de conjuntos que separam as variveis e restries dos problemas. No presente modelo, as variveis para os dois problemas so as mesmas, portanto temos apenas que determinar quais so as restries de cada um dos problemas. Podemos criar ento os conjuntos: SET: identifier subset of definition Obs: : DemandaFixa : AllConstraints : data{RestricaoDemandaFixa}

Para preencher o campo "Subset of", clique no cone no formulrio de atributos do conjunto "DemandaFixa", digite "AllConstraints" no campo em branco no "Subset of Wizard" e pressione "OK" para registrar o dado. A palavra-chave "data" no campo de definio faz com que o novo conjunto seja composto dos dados referentes ao identificador "RestrioDemandaFixa", ou seja, este um conjunto com as restries que sero utilizadas para a resoluo do problema quando as demandas das bobinas forem fixas. : DemandaVariavel : AllConstraints : data{RestricaoDemandaVariavel}

SET: identifier subset of definition

Vamos declarar agora os dois Programas Matemticos utilizados neste modelo. MATHEMATICAL PROGRAM: identifier : MinimaPerdaPercentualTotalFixa objective : PerdaPercentualTotal direction : minimize constraints : DemandaFixa type : lp MATHEMATICAL PROGRAM: identifier : MinimaPerdaPercentualTotalVariavel objective : PerdaPercentualTotal direction : minimize constraints : DemandaVariavel type : lp Declarao do Grfico de Gantt Vamos passar agora s declaraes que nos permitiro construir um Grfico de Gantt. Este grfico usado neste modelo para mostrar os padres de cortes e a perda de material em cada padro, como mostra a Figura 2.5.

41

Figura 2.5 : Grfico de Gantt com os padres de corte do Problema das Bobinas.

SET: identifier subset of index parameter definition

: Cortes : Integers : c : Corte : { 1..100 }

"Cortes" o conjunto da quantidade de cortes em cada padro. Sabemos que, neste modelo, o nmero de corte em cada padro 4, mas sem perda de generalidade, podemos definir o nmero mximo de cortes possveis como sendo 100. Neste modelo, o parmetro "Corte" utilizado em um procedimento que calcula a posio de cada corte no Grfico de Gantt. Este procedimento apresentado logo mais. SET: identifier index order by definition : TiposDeCortes : tc : user : union(i,ElementCast(TiposDeCortes, i, create:1)) + data {'Perda'}

O comando ElementCast associa a cada elemento do conjunto "TiposDeCortes" o elemento equivalente i das larguras. Isto , o primeiro elemento TiposDeCortes o valor da largura i = 1, e assim por diante. O argumento binrio create, assumindo valor igual a 1 indica que um novo elemento no existente adicionado ao conjunto durante a chamada da funo. ELEMENT PARAMETER: identifier : LargurasParaTipo index domain : i range : TiposDeCortes definition : ElementCast(TiposDeCortes,i) PARAMETER: identifier : DominioCorte index domain : (p,c,tc) PARAMETER: identifier : InicioCorte index domain : (p,c)

42

PARAMETER: identifier : ComprimentoCorte index domain : (p,c)

Declarao do Procedimento de Visualizao dos padres de corte Clique duas vezes sobre o cone "New Procedure" e crie um procedimento chamado "VisualizacaoPadroes" na janela da estrutura do modelo. e dentro dela, declare um novo parmetro chamado Crie uma nova declarao "ContaCortes", conforme mostra a Figura 2.6.

Figura 2.6 : Estrutura do modelo com as declaraes para a construo do Grfico de Gantt.

Clique duas vezes sobre o nome do procedimento "VisualizacaoPadroes" e preencha o campo "Body" com o seguinte algoritmo, que calcula o incio e comprimento de cada corte dentro de um padro:

Empty DominioCorte, InicioCorte, ComprimentoCorte; for ( p ) do Corte := 1; for ( i | LargurasNoPadrao(p,i) ) do ContaCortes := 1; while ( ContaCortes <= LargurasNoPadrao(p,i)) do DominioCorte(p,Corte,LargurasParaTipo(i)) := 1; InicioCorte(p,Corte) := InicioCorte(p,Corte-1) + ComprimentoCorte(p,Corte-1); ComprimentoCorte(p,Corte) := LargurasFinais(i); Corte += 1; ContaCortes += 1; endwhile; endfor;

43

if ( LarguraBobinaMestre > InicioCorte(p,Corte-1) + ComprimentoCorte(p,Corte-1) ) then DominioCorte(p,Corte,'Perda') := 1; InicioCorte(p,Corte) := InicioCorte(p,Corte-1) + ComprimentoCorte(p,Corte-1); ComprimentoCorte(p,Corte) := LarguraBobinaMestre - InicioCorte(p,Corte); endif; endfor; Declarao dos procedimentos "MainExecution" Para cada um dos procedimentos "MainExecution01" e "MainExecution02", basta declararmos qual dos Programas Matemticos devem ser resolvidos. PROCEDURE: procedure : MainExecution01 body : Solve MinimaPerdaPercentualTotalFixa; PROCEDURE: procedure : MainExecution02 body : Solve MinimaPerdaPercentualTotalVariavel; Voc pode tambm acrescentar no corpo dos procedimentos a condio de verificao de otimalidade da soluo obtida para o problema, conforme visto no problema descrito anteriormente ( pag.19). Declarao do procedimento "MainTermination" Clicando duas vezes sobre o nome do procedimento "MainTermination", voc poder perceber um pequeno procedimento gerado pelo AIMMS, devido aos dois conjuntos de dados que foram obtidos com a resoluo dos dois Programas Matemticos. O procedimento dado por: if ( CaseSaveAll( confirm:2 ) = 1 ) then return 1; else return 0; endif ; Com a funo CaseSaveAll voc pode gravar o caso corrente e todos os conjuntos de dados ativos em seu projeto que necessitam ser gravados. Se o valor do argumento confirm for igual a 0, ento os dados e conjuntos de dados so gravados sem confirmao. Se o valor igual a 2, o AIMMS exibir uma caixa de dilogo para confirmao da gravao dos dados. Caso o valor seja 1, ento o AIMMS utiliza-se das propriedades e categorias dos casos para determinar quando uma caixa de dilogo para confirmao da gravao dos dados deve ser exibida. A funo retorna o valor 1 se os dados foram gravados com sucesso e retorna 0 se o usurio cancelou a operao de gravao. Se qualquer outro tipo de erro acontecer, a funo retorna o valor 1, juntamente com uma mensagem de erro. 2.5 Gravando os dados do modelo At o momento, nada foi dito sobre a gravao dos dados do modelo. Lembramos, mais uma vez, que conveniente a gravao peridica de seu projeto. Podemos gravar os dados

44

do modelo em apenas um caso, ou divid-los nos casos de demanda fixa e demanda varivel. Para ilustrar isso, primeiramente grave seus dados em um caso chamado "Demandas Fixa e Varivel". Para isso, selecione a opo "Save case as" no menu "Data". O AIMMS possui um recurso que permite a gravao peridica de seu projeto e de seus dados, enquanto o programa est em funcionamento. No menu "Settings", selecione a opo "AutoSave & Backups" "Project" , e determine o intervalo desejado para as gravaes de seu projeto, assim como o de criao dos backups. A Figura 2.7 mostra a caixa de dilogo para esta opo:

Figura 2.7 : Caixa de dilogo da opo "AutoSave & Backups".

Voc pode repetir o procedimento para a opo "AutoSave & Backups" "Data". Como o modelo possui dois procedimentos "MainExecution", voc pode determinar qual deles ser executado, selecionando-o atravs do menu "Run" "Procedure". Pode ser tambm que voc queira gravar os dados dos casos de demanda fixa e demanda varivel separados. Para isso, selecione um dos procedimentos "MainExecution01" ou "MainExecution02" e grave os resultados de cada um deles utilizando a opo "Save case as" no menu "Data". 2.6 Construindo as pginas de abertura e de dados na janela de estrutura do projeto e crie duas novas Pressione o boto "Page Manager" pginas, chamadas "Descrio do Problema" e "Dados", como mostra a Figura 2.8.

45

Figura 2.8 : Gerenciador de pginas para o modelo de Corte de Bobinas.

Pgina "Descrio do Problema" Quando voc cria um projeto no AIMMS, pode ser interessante ter uma pgina de abertura, que ser exibida toda vez que o projeto for aberto. Ela pode, por exemplo, conter uma simples descrio do problema, logotipos e opes para gerenciamento do projeto e outras pginas. A Figura 2.9 exemplifica uma pgina de abertura.

Figura 2.9 : Exemplo de uma pgina de abertura de um projeto no AIMMS.

Propriedades da pgina Clique duas vezes sobre o nome da primeira pgina, "Descrio do Problema". Coloque-a no modo de edio, pressionando o cone .

46

Com o boto direito do mouse, abra o formulrio de atributos da pgina. Na opo "General", determine " Descrio do Problema de Corte de Bobinas" como o ttulo que ser visvel na borda superior da pgina. Na opo "Action" , especifique "MainInitialization" no campo "Page Entry Procedure". Na opo "Colors", escolha uma cor para a tela de fundo de sua pgina.

Retngulos Para criar os retngulos coloridos que aparecem sob o texto, utilize a opo "Rectangle" no menu "Object". Na opo "Rectangle", selecione o tipo desejado do retngulo. Na Figura 2.9 o tipo utilizado foi "Out-Shadow Rectangle" , com linha slida de largura 1. Na opo "Colors", selecione as cores desejadas para o fundo do retngulo (Background) e para os elementos que venham a estar sobre o retngulo (Foreground).

Textos Para a insero dos textos, utilize a opo "Text" no menu "Object". Selecione a rea do texto sobre a rea do retngulo, e insira o texto esttico, na caixa de dilogo do texto. Selecione a cor e fonte de seu texto.

Bitmaps Voc tambm pode inserir figuras que estejam no formato bitmap (.bmp). No exemplo acima, inserimos o logotipo do AIMMS, que pode ser extrado de exemplos de projetos contidos do subdiretrio Examples do AIMMS. Para inserir bitmaps, utilize a opo "Bitmap" no menu "Object". Selecione a rea sobre a pgina onde o bitmap ser inserido. Especifique o diretrio ou nome de arquivo ou de projeto onde o bitmap desejado encontra-se.

Botes de comandos Vamos criar trs botes nesta pgina inicial: um para abrir o Model Explorer, outro para acessarmos a pgina que contm os dados do problema e outro que permitir fechar o projeto. Para criar o boto Model Explorer:

47

Pressione "New Button"

para criar um novo boto.

Na opo "Button", especifique "Model Explorer" como ttulo do boto invisvel. Na opo "Actions", selecione a ao "Menu Command" e pressione o boto "Add". Uma lista de comandos pertencentes ao menu aparecero direita da janela de propriedades do boto. Selecione o comando "Tools Model Explorer" e pressione "Apply".

Crie o boto "Dados do Problema" de forma semelhante, especificando "Goto Page" "Next page" como a ao que o boto deve executar. Crie o boto "Fechar Projeto", especificando sua ao como "Menu Command" "File Close Project" , voc Se neste momento voc colocar a pgina no modo de usurio, clicando no boto perceber que os botes no sero mostrados. Portanto, voc deve criar trs objetos de textos referentes a cada um dos botes. Ajuste cada um dos textos exatamente encima de cada um dos botes, para que estes possam ser "visualizados" quando a pgina for colocada no modo de usurio. Agora sim, voc pode colocar a pgina de abertura no modo de usurio e testar as aes dos novos botes criados. Pgina "Dados" Vamos construir agora a pgina onde so mostrados os dados relevantes para o Problema de Corte de Bobinas proposto. Nesta pgina so mostrados os dados sobre a bobina mestre, as larguras e demandas das bobinas pedidas, informaes sobre os padres de cortes, tais como as perdas de papel e as perdas percentuais em cada um deles. Temos tambm o Grfico de Gantt, que nos d uma viso dos padres de corte e a perda de papel em uma bobina mestre, assim como os valores das variveis definidas na estrutura do modelo. A Figura 2.10 mostra como poderia ser uma pgina de dados para este modelo. A pgina composta de um objeto de texto, trs tabelas compostas, uma tabela de valores escalares, um Grfico de Gantt e cinco botes de comando. A seguir, sero fornecidos os passos e as informaes necessrias para a construes destes 10 elementos.

48

Figura 2.10 : Pgina de Dados do modelo "Problema de Corte de Bobinas".

Propriedades da pgina Nas propriedades da pgina, defina "Dados e Resultados do Problema de Corte de Bobinas".

Tabelas Compostas Pressione o boto "New Composite Table" composta. para criar uma nova tabela

COMPOSITE TABLE: CONTENTS : domain : i columns : Demanda(i) TonelagemProduzida(i) ExcedenteDeProducao(i) Voc pode formatar os ttulos dos identificadores que aparecem na tabela e as larguras das colunas na opo "Columns". Para modificar a largura das colunas, selecione a opo "Width" "As Percentage of Total Width" e escolha um valor que se ajuste com o tamanho do ttulo determinado.

49

COMPOSITE TABLE: CONTENTS : domain : p columns : PerdaNoPadrao(p) PerdaPercentual(p) COMPOSITE TABLE: CONTENTS : domain : PesoCortadoComPadrao(p) columns : PesoCortadoComPadrao(p) Escalares Pressione o boto "New Scalar" identificadores com valores escalares. para criar a tabela que contm os

CONTENTS : LarguraBobinaMestre VariacaoDemanda PerdaPercentualTotal PesoTotalBobinaMestre SCALAR : layout : Text Value(s) separator sign : = Voc pode renomear os nomes dos identificadores na opo "Text". Para isso, desmarque a opo "Default Text (from Model)" e determine o novo ttulo. Grfico de Gantt Antes de construir o Grfico de Gantt, voc dever executar o procedimento para visualizao dos padres de corte. Para isso, v ao Model Explorer e clique com o boto direito do mouse sobre o procedimento "VisualizacaoPadroes" e selecione a opo "Run Procedure". Para criar um Grfico de Gantt, pressione o boto "New Gantt Chart" na barra de ferramentas da janela principal do AIMMS. Na caixa de dilogo, determine: row domain : p legend domain : tc start : InicioCorte(p,c) duration : ComprimentoCorte(p,c) domain : DominioCorte(p,c,tc) INPUT : object read-only : yes TEXT : row labels : Padro p type of X-axis : Continuous Range grid points : 15 upper : 4500 lower : 0 localizado

50

Botes de comando Pressione o boto "New Button" para criar os cinco botes de texto.

TEXT BUTTON: title : "Descrio do Problema" action : Goto Page Previous Page TEXT BUTTON: title : "Resolver o Problema com Demanda Fixa" action : Run Procedure MainExecution01 Selecionar o procedimento "MainExecution01" atravs do boto TEXT BUTTON: title : "Resolver o Problema com Demanda Varivel" action : Run Procedure MainExecution02 TEXT BUTTON: title : "Fechar Projeto" action : Menu Command File Close Project TEXT BUTTON: title : "Fechar AIMMS" action : Menu Command File - Exit 2.7 Declarando pgina e casos iniciais O AIMMS possibilita que voc especifique quais so a pgina e caso que devero ser inicializados cada vez que um projeto aberto. Selecione a opo "Project Options" no menu "Settings". Clique duas vezes sobre o cone da opo "Project", e selecione a opo "Startup & authorization". Especifique "Demanda Fixa" como "Startup case" (ou qualquer outro caso de sua escolha) e "Descrio do Problema" como "Startup page", como mostra a Figura 2.11. Pressione "Apply" e "OK" para fechar a janela de opes. Grave novamente seu projeto. .

51

Figura 2.11 : Janela de declarao do caso e pgina iniciais.

52

3. O Problema da produo de sucos


3.1 Introduo Neste problema de Programao Inteira, ser modelado o planejamento da produo de produtos obtidos da mistura de sucos de diversos tipos de laranjas, levando em considerao caractersticas da produo em si, como gerenciamento de estoque, compra de matrias-primas e produo dos produtos. No contexto da programao do modelo, mostraremos alguns exemplos de como restringir a criao de variveis e restries que no devem ser geradas para alguns elementos dentro de um conjunto. Outra novidade bastante prtica a criao de conjuntos com cardinalidade varivel, ou seja, o nmero de elementos no conjunto deixa de ser um nmero fixo e passa a ser um parmetro. Abordaremos tambm o Listing File, que um arquivo de suma importncia para a verificao do seu modelo. Nele, esto contidas informaes sobre cada varivel e restries geradas na execuo do modelo, tais como os valores assumidos e limites mximo e mnimo, nvel onde as restries esto sendo satisfeitas, ou mesmo quais restries no esto sendo satisfeitas, caso seu modelo esteja infactvel. Veremos tambm como criar procedimentos para inserir, remover e renomear elementos em um conjunto. O AIMMS possui tal recurso, mas possvel criar procedimentos personalizados onde, alm de inserir ou remover os elementos, executam outras aes como atualizar dados e confirmar alteraes. No contexto da criao de pginas, mostraremos como fazer uso de templates, uma forma de padronizar suas telas, no que diz respeito ao seu aspecto visual. Mostraremo tambm como, em uma pgina, criar tabelas nas quais as informaes referem-se a um elemento selecionado. Esse recurso muito til quando deseja-se representar atravs de uma tabela as informaes contidas em um identificador com mais de dois elementos em seu domnio do ndice. As tabelas que representam tais identificadores podem no ser muito claras e fceis de serem lidas. Quando selecionamos um elemento especfico em um dos conjuntos do domnio do identificador, podemos representar a tabela com um ndice a menos, o que facilita em muito a sua visualizao.

3.2 Descrio do Problema A UniCitrus uma grande produtora de sucos de laranjas congelados e concentrados, localizada no sul do Brasil. Tais sucos so obtidas atravs da mistura dos sucos de trs variedades de laranjas: Hamlin, Pera e Valncia. A companhia compra a produo de plantaes selecionadas, processa estas laranjas transformando-as em suco e, finalmente, estes sucos so misturados para a obteno de dois tipos de produtos: Standard e Dairy. O produto Standard utilizado na maioria das indstrias de bebidas no mundo todo. Um pouco mais caro, o produto Dairy tem que satisfazer certas condies, como por exemplo, sabor, acidez e cor. O horizonte de planejamento de 3 meses e a previso da demanda sobre o horizonte de planejamento exibida na Tabela 3.1, no existindo custos de penalizao caso a demanda no seja completamente atendida.

53

Produto Standard Dairy

1 500 200

Demanda (ton) no ms 2 3 1500 700 100 100

Tabela 3.1 : Demanda de cada produto para cada ms.

Diferentes variedades de laranjas tm diferentes perodos de maturao e a disponibilidade (em nmero de caixas) esperada nas regies de plantaes resumida na Tabela 3.2. Variedade esperada no ms (em 1000 caixas) 1 2 3 300 350 100 250 350 500 0 50 100

Variedade Hamlin Pera Valncia

Tabela 3.2 : Disponibilidade em milhares de caixas de cada variedade de laranjas.

Existem limites superiores e inferiores da porcentagem de suco de cada variedade em cada produto. Estes limites esto resumidos na Tabela 3.3. Porcentagem Mxima Hamlin Standard Dairy 25 30 Pera 100 100 Valncia 40 50 0 0 Porcentagem Mnima Hamlin Pera 60 50 Valncia 0 15

Tabela 3.3 : Porcentagens de suco de cada variedade de laranjas nos produtos.

A matria-prima produzida em um ms pode ser utilizada para produzir os produtos no mesmo ms ou estocada para uso futuro, a um custo de $10/ton/ms para todas as variedades. O custo de compra, coleta e transporte das frutas para a fbrica estimado em $1/caixa para todas as variedades. O custo de funcionamento da fbrica fixo em milho $/ms e a fbrica no tem restries de capacidade de processamento e mo-deobra. A Tabela 3.4 mostra a quantidade de suco (Kg) por caixa de laranja. Variedade Suco (Kg/caixa) Hamlin 3.5 Pera 3.7 Valencia 3.4

Tabela 3.4 : Quantidade de suco em cada caixa das laranjas.

E finalmente, na Tabela 3.5 temos os preos de venda dos produtos. Preo de Venda ( $/ton) 1000 1100

Standard Dairy

Tabela 3.5 : Preo de venda dos produtos.

54

Sabendo-se que os estoques iniciais e finais so zero, formular como um PL e resolver para todo o horizonte de planejamento. 3.3 Formulao Matemtica Declarao dos identificadores Inicialmente, declare duas novas sees chamadas Dados Gerais e Procedimentos na estrutura do modelo, como mostra a Figura 3.1.

Figura 3.1 : Declarao inicial da estrutura do modelo.

Em seguida, voc pode inserir as declaraes e subsees, de forma a organizar a estrutura do modelo, conforme mostra a Figura 3.2.

Figura 3.2 : Declaraes e subsees da estrutura do modelo.

A seguir, iniciaremos as declaraes dos identificadores do modelo, separando-os por seo e declarao. Seo: Dados Gerais Declarao: Dados de Entrada Conjunto dos meses do horizonte de planejamento: No nosso modelo, o horizonte de planejamento constitudo por trs meses. Podemos definir o conjunto de meses do horizonte da forma como j conhecemos, ou seja, inserindo elementos do conjunto como Ms 1, Ms 2 e Ms 3, por exemplo. Mas suponha agora que em um dado momento, voc queria resolver o

55

mesmo problema, mas com um horizonte diferente. Podemos apresentar algumas opes para que a insero (ou remoo) desses elementos seja feita. A primeira delas seria inserir os meses faltantes diretamente na pgina de dados, no formulrio de atributos do conjunto dos meses. Esta opo no muito vantajosa, pois uma das finalidades das pginas que podem ser criadas no AIMMS permitir que o modelo seja manipulado sem acessar a estrutura do Main Explorer. Alm disso, os elementos do conjunto teriam que ser inseridos um a um. A segunda opo seria utilizar um recurso existente no AIMMS, chamado Selection Object. Ele um recurso utilizado nas pginas, com o qual voc pode inserir novos elementos em um conjunto sem ter que acessar o Main Explorer. indicado para elementos com nomes bem distintos, como por exemplo no nosso modelo, as variedades de laranjas e produtos. Uma outra maneira atravs de procedimentos que podem ser programados para executar a mesma tarefa. Ambos os recursos sero explicados mais adiante, nas seo Construindo as pginas no AIMMS. Por fim, vamos declarao que definir nosso conjunto de meses. Como no nosso modelo estamos interessados no nmero de meses que constituem o horizonte de planejamento, e no nos interessa saber exatamente quais so estes meses (pro exemplo, Janeiro ou Fevereiro), apenas nos basta que sejam meses consecutivos. Podemos criar um conjunto de meses no-fixo, declarando os seguintes identificadores: PARAMETER: identifier initial data SET: identifier index parameter definition

: P_Numero_de_Meses_No_Horizonte : 3; : : : : S_Meses MES Pe_Mes ElementRange(1,P_Numero_de_Meses_No_Horizonte, prefix:"Ms ")

A funo ElementRange cria um conjunto contendo um nmero de elementos igual ao valor assumido pelo parmetro P_Numero_de_Meses_no_Horizonte, ou seja, trs elementos. Se este parmetro tiver seu valor alterado, o conjunto tambm ser alterado. O Element Parameter Pe_Mes ser explicado mais adiante, quando ser usado nas pginas para a criao de tabelas que contenham parmetros e variveis com trs ndices. Conjunto das variedades de laranjas: SET: identifier : S_Laranjas index : LARAN parameter : Pe_Laran, Pe_Laran_Aux Conjunto dos produtos: SET: identifier : S_Produtos index : PROD parameter : Pe_Prod, Pe_Prod_Aux No se esquea de inserir os dados referentes a estes dois conjuntos, ok?

56

Demanda mxima (ton) de produto para cada ms: PARAMETER: identifier : P_Demanda index domain : (PROD,MES) ;

Disponibilidade (unidades) de caixas de cada variedade para cada ms: PARAMETER: identifier : P_Disponibilidade index domain : (LARAN,MES) ;

Porcentagens mnima e mxima de suco de cada tipo de laranja no produto, observando e respeitando caractersticas como acidez, cor e sabor: PARAMETER: identifier : P_Porcentagem_Minima index domain : (LARAN,PROD) ; PARAMETER: identifier : P_Porcentagem_Maxima index domain : (LARAN,PROD) ;

Quantidade de suco (Kg) obtida por caixa: PARAMETER: identifier : P_Rendimento index domain : (LARAN) ;

Preo de venda de cada produto: PARAMETER: identifier : P_Preco_de_Venda index domain : (PROD) ;

Custo associado ao estoque de suco: PARAMETER: identifier : P_Preco_de_Estoque definition : 10 ;

Custo associado ao processamento e transporte por caixa de laranja: PARAMETER: identifier : P_Custo_de_Processamento definition : 1 ;

Custo associado operao da fbrica: PARAMETER: identifier : P_Custo_Operacao_Fabrica definition : 500000 ;

57

A Figura 3.3 mostra a estrutura da Declarao Dados de Entrada aps todos os identificadores terem sido inseridos.

Figura 3.3 : Declarao Dados de Entrada.

Seo: Dados Gerais Declarao: Variaveis Varivel relacionada ao funcionamento da fbrica: Esta varivel binria assume valor 1 caso a fbrica esteja ativa no ms e 0, caso contrrio. VARIABLE: identifier : V_Funciona_Fabrica index domain : (MES) range : binary ; Quantidade (ton) do suco de cada tipo de laranja utilizada para produzir um tipo de produto em um dado ms: VARIABLE: identifier : V_Ton_Suco_Utilizado_no_Produto index domain b: (LARAN,PROD,MES) range : nonnegative ; Quantidade (ton) de produto produzido em um dado ms: VARIABLE: identifier : V_Ton_Produzida index domain : (PROD,MES) definition : sum[LARAN,V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES)] ; No precisamos declarar o campo range, uma vez que ela funo da varivel P_Ton_ Suco_Utilizado_no_Produto, que s pode assumir valores no-negativos.

58

Neste modelo, supe-se que todo produto vendido no mesmo ms em que ele produzido. Ou seja, no temos produtos em estoque, apenas os sucos processados, que so matrias-primas. Quantidade de caixas (unidades) de cada tipo de laranja compradas no ms: VARIABLE: identifier : V_Caixas_Compradas index domain : (LARAN,MES) range : {0..inf} } ATENO: Ao definir o campo range de V_Caixas_Compradas, lembre-se que se trata de uma varivel inteira, pois como ela definida em unidades, no podemos ter uma soluo dada por meia caixa, ou um tero da caixa. J provado que a complexidade de problemas lineares inteiros bem maior que a de problemas no-inteiros, o que significa que o tempo de execuo para se resolver o problema maior, e aumenta de forma nolinear conforme aumenta o nmero de variveis. Como nosso modelo pequeno, esse problema no facilmente notado.Entretanto, para problemas maiores, aconselhvel procurar uma forma para transformar problemas inteiros em problemas no-inteiros. A sugesto que poderia ser adotada neste modelo seria definir a varivel representando o nmero de caixas compradas em milhares. Assim, se como soluo temos o valor , compramos 500.000 caixas, por exemplo. Caso o valor fracionrio da varivel no nos fornea um valor exato em termos da unidade da caixa, um arredondamento nesse nmero pode ser uma boa sada. Podemos perceber este fato pois teramos um arredondamento de no mximo 0,9 caixa, na pior das hipteses. Quantidade (ton) de suco processado da cada tipo de laranja em estoque no ms: VARIABLE: identifier : index domain : range : definition :

V_Estoque (LARAN,MES) | ord(MES) < card(S_Meses) nonnegative If ord(MES) = 1 THEN

(P_Rendimento(LARAN)/1000)* V_Caixas_Compradas(LARAN,MES) - sum[PROD,V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES)] ELSE V_Estoque(LARAN,MES - 1) + (P_Rendimento(LARAN)/1000)* V_Caixas_Compradas(LARAN,MES) - sum[PROD,V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES)] ENDIF ; Esta varivel refere-se ao estoque de suco processado ao final de cada ms. Pelo enunciado do problema, o estoque do ltimo ms do planejamento deve ser zero. Com a declarao feita no campo index domain, garantimos que a varivel de estoque ser criada apenas para os meses anteriores ao ltimo ms. Podemos traduzir a condio da criao da varivel da seguinte forma: poder haver estoque do suco da laranja no ms, somente se este ms no for o ltimo do planejamento. A funo card verifica a cardinalidade de um conjunto, ou seja, o nmero de elementos do conjunto. A funo ord nada mais do que a posio do elemento no conjunto. Dessa maneira, fica fcil restringir a varivel de acordo com o nosso interesse. Por exemplo, suponha que em um perodo de planejamento,

59

queremos que os ltimos trs meses tenham estoque zero. A condio de restrio seria ord(MES) < (card(S_Meses) 2). A varivel de estoque pode ser definida de acordo com o ms em questo. Levando em conta que o estoque inicial de sucos zero, o estoque no primeiro ms apenas o total de suco obtido com a compra das caixas de laranjas, menos a quantidade que utilizada para a produo no ms. Caso estejamos em um ms que no seja o primeiro nem o ltimo, o estoque a quantidade estocada no ms anterior, mais a quantidade obtida com a compra de novas caixas menos a quantidade utilizada para a produo no ms. Lucro total obtido, considerando a venda processamento, estoque e operao da fbrica: dos produtos, custos de

VARIABLE: identifier : V_Lucro_Total definition : sum[(PROD,MES), P_Preco_de_Venda(PROD)*V_Ton_Produzida(PROD,MES)] - P_Custo_Operacao_Fabrica*sum[MES, V_Funciona_Fabrica(MES)] - P_Custo_de_Processamento*sum[(LARAN,MES), V_Caixas_Compradas(LARAN,MES)] - P_Preco_de_Estoque*sum[(LARAN,MES), V_Estoque(LARAN,MES)] ; A Figura 3.4 mostra a estrutura do modelo aps as declarao ter sido completada.

Figura 3.4 : Declarao Variaveis.

Seo: Dados Gerais Declarao: Restricoes e Modelo Matematico Restrio de produo: CONSTRAINT: identifier : C_Restricao_de_Producao index domain : (MES) definition : (sum[PROD,V_Ton_Produzida(PROD,MES)]/10^6) < = V_Funciona_Fabrica(MES);

60

Esta restrio nos diz que podemos ter produo apenas nos meses em que a fbrica est em funcionamento. Como j visto anteriormente, a varivel V_Funciona_Fabrica(MES) s assume valores 0 ou 1. Se a fbrica no est ativa no ms, ou seja, a varivel que indica a atividade de fbrica tem valor zero, ento toda a produo daquele ms deve ser menor ou igual a zero. Mas como a varivel V_Ton_Produzida(PROD,MES) no-negativa, neste caso ela ser forada a assumir valor zero tambm. Caso a fbrica esteja ativa, estimamos uma constante bem grande (106), de forma que a soma de toda a produo dividida por esta constante seja menor que 1. Restrio de compra: CONSTRAINT: identifier : C_Restricao_de_Compra index domain : (MES) definition : (sum[LARAN,V_Caixas_Compradas(LARAN,MES)]/10^10) < = V_Funciona_Fabrica(MES) ; Da mesma forma da restrio anterior, apenas podemos comprar caixas de laranjas se a fbrica estiver em operao no ms. Restries de porcentagens mnima e mxima de cada tipo de suco nos produtos: CONSTRAINT: identifier : C_Mistura_Minima index domain : (LARAN,PROD,MES) definition : V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES) > = P_Porcentagem_Minima(LARAN,PROD)/100)*V_Ton_Produzida(PROD,MES) ; CONSTRAINT: identifier : C_Mistura_Maxima index domain : (LARAN,PROD,MES) definition : V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES) < = (P_Porcentagem_Maxima(LARAN,PROD)/100)*V_Ton_Produzida(PROD,MES) ; Para cada ms, a porcentagem de cada tipo de suco utilizado para compor um produto deve ser maior que a porcentagem mnima da quantidade total do produto, e menor que a porcentagem mxima. Restrio de atendimento da demanda: CONSTRAINT: identifier : C_Demanda index domain : (PROD,MES) definition : V_Ton_Produzida(PROD,MES) <= P_Demanda(PROD,MES) ; Como no h custos de penalizao caso a demanda no seja completamente atendida, podemos escrever que a tonelagem produzida de cada produto no ms deve ser menor ou igual demanda.

61

Restrio de disponibilidade no nmero de caixas de laranjas: CONSTRAINT: identifier : C_Disponibilidade index domain : (LARAN,MES) definition : V_Caixas_Compradas(LARAN,MES) < = P_Disponibilidade(LARAN,MES) ;

Restrio do Fluxo do suco durante o ms: CONSTRAINT: identifier : C_Restricao_do_Fluxo_do_Suco index domain : (LARAN,MES) definition : IF ord(MES) = 1 THEN (P_Rendimento(LARAN)/1000)*V_Caixas_Compradas(LARAN,MES) = sum[PROD, V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES)] + V_Estoque(LARAN,MES) ELSE IF ord(MES) <> card(S_Meses) THEN (P_Rendimento(LARAN)/1000)*V_Caixas_Compradas(LARAN,MES) = sum[PROD, V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES)] + V_Estoque(LARAN,MES) - V_Estoque(LARAN,MES-1) ELSE (P_Rendimento(LARAN)/1000)*V_Caixas_Compradas(LARAN,MES) = sum[PROD, V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES)] - V_Estoque(LARAN,MES-1) Endif Endif ;

Esta restrio nos garante o equilbrio do fluxo de sucos durante os meses, ou seja, garantimos que a quantidade total de suco que entra no sistema utilizada para alguma finalidade, seja ela produo ou estoque. Restrio de funcionamento da fbrica: CONSTRAINT: identifier : C_Forca_Fabrica_Funcionar definition : sum[MES, V_Funciona_Fabrica(MES)] > = 1 ; Garante que em pelo menos um ms a fbrica estar em funcionamento. Como o custo de operao da fbrica muito alto, e no h penalizao caso a demanda no seja completamente atendida, se no dizemos ao modelo que queremos que a fbrica seja ativada pelo menos uma vez, pode ser que em alguns casos a soluo trivial (zero para todas as variveis) seja a melhor soluo. Obviamente, este caso no nos interessa muito

62

Modelo Matemtico: MATHEMATICAL PROGRAM: identifier : MP_Unicitrus objective : V_Lucro_Total direction : maximize type : mip ;

importante lembrar de declarar o tipo de modelo matemtico como mip, ou seja, Mixed Integer Program, pois temos variveis inteiras e contnuas. Os identificadores declarados so mostrados na Figura 3.5.

Figura 3.5 : Declarao Restricoes e Modelo Matematico.

Seo: Dados Gerais Declarao: Parametros Pos Rodada Podemos declarar tambm parmetros que so definidos a partir das variveis do nosso modelo. Eles sero usados nas pginas para nos dar algumas informaes calculadas aps a obteno da soluo do problema. Porcentagem de cada suco utilizada no produto: PARAMETER: identifier : P_Ton_Produzida index domain : (PROD,MES) definition : V_Ton_Produzida(PROD,MES) ; PARAMETER: identifier : P_Porcentagem_do_Suco_no_Produto index domain : (LARAN,PROD,MES) | P_Ton_Produzida(PROD,MES) definition : (V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES)/ ` P_Ton_Produzida(PROD,MES))*100 ;

63

O primeiro parmetro assume os mesmos valores da varivel referente produo dos produtos. necessrio repassar os valores dessa forma, pois para calcularmos o segundo parmetro, temos que restringir sua criao apenas para produtos e meses em que a produo foi diferente de zero. Caso contrrio, teramos uma diviso por zero e ocorreria um erro no programa. Essa restrio foi feita no campo index domain, ou seja, criamos o parmetro apenas para os meses e produtos tal que P_Ton_Produzida(PROD,MES) existe. No podemos condicionar a existncia de um identificador existncia de uma varivel; por isso, o valor repassado para um parmetro. Integridade da mistura:

PARAMETER: identifier : P_Integridade_da_Mistura index domain : (PROD,MES) definition : sum[LARAN, P_Porcentagem_do_Suco_no_Produto(LARAN,PROD,MES)]/100 ; Este parmetro verifica a integridade da mistura, ou seja, se a soma das porcentagens dos sucos utilizados para a produo dos produtos em um dado ms igual a 1. Variao no atendimento da demanda PARAMETER: identifier : P_Variacao_Atendimento_Demanda index domain : (PROD,MES) definition : P_Ton_Produzida(PROD,MES) - P_Demanda(PROD,MES) ELEMENT PARAMETER: identifier : Pe_Cor_Excesso_Producao index domain : (PROD,MES) range : AllColors definition : If ( P_Variacao_Atendimento_Demanda(PROD,MES) < 0) THEN 'Red' ELSE 'Black' ENDIF; Este ltimo parmetro mede a diferena entre o total produzido de cada produto e a sua demanda em um dado ms. J o Element Parameter foi criado para colorir na tabela os dados do parmetro: se assume valores negativos, os dados so escritos em vermelho, caso contrrio so escritos em preto. A Figura 3.6 mostra a estrutura do modelo aps a insero dos parmetros que so calculados aps a execuo do programa.

64

Figura 3.6 : Declarao Parametros Pos Rodada.

Finalmente, vamos declarar o procedimento de execuo do programa. PROCEDURE identifier : MainExecution body : Empty Variaveis; Solve MP_Unicitrus; Ao declararmos o comando Empty no corpo de programao do procedimento de execuo, estamos garantindo que todas as variveis contidas na seo Variaveis sejam inicializadas com valores iguais a zero. Esta precauo evita que, ao executar o programa novamente, os valores obtidos anteriormente sejam considerados como valores iniciais. Declarao dos procedimentos Como j dito anteriormente neste captulo, vamos mostrar como realizar operaes de insero e excluso de elementos em um conjunto. No nosso modelo, vamos criar procedimentos que, antes de realizarem as operaes, permitem ao usurio decidir ou no se d prosseguimento ao. Um fato bastante importante no uso de procedimentos a possibilidade de se ter todas as janelas de mensagens, sejam elas de erro, de aviso, em portugus. Quando utilizamos o recurso pr-definido do AIMMS, todas as janelas esto escritas em ingls. E se o projeto em questo vai ser apresentado e utilizado por outras pessoas fora o programador, no interessante que partes do projeto estejam em idiomas diferentes. Faremos basicamente seis procedimentos para cada um dos conjuntos, o de variedades de laranjas e o de produtos. Para os relacionados ao conjunto de variedades, ser feita uma breve explicao sobre as funes utilizadas e as aes de cada comando.

65

Voc pode declarar a estrutura da seo Procedimentos como mostra a Figura 3.7.

Figura 3.7 : Declarao Procedimentos.

A declarao Parametros contm dois identificadores que sero utilizados na programao dos procedimentos. Ps_String_Auxiliar_1 um identificador do tipo String Parameter, que ser utilizado nas pginas para armazenar temporariamente o nome do novo elemento que ser inserido no conjunto. O parmetro P_Resposta far o papel de um indicador, ou seja, assumir valores 0 ou 1, dependendo se o usurio desejar dar continuidade ao do procedimento ou no. O valor do parmetro P_Resposta indicar qual parte do procedimento ser executada. localizado na Para declarar o primeiro identificador, pressione o boto New Identifier barra de ferramentas da janela principal do AIMMS, e selecione o tipo String Parameter . STRING PARAMETER: identifier : Ps_String_Auxiliar_1 default : "" property : NoSave ; PARAMETER: identifier : P_Resposta default : 0 property : NoSave ;

66

Procedimento de incluso de variedade de laranja PROCEDURE identifier : Proc_Bt_Incluir_Variedade body : IF [Ps_String_Auxiliar_1 <> ""] THEN P_Resposta := DialogAsk(FormatString("Incluir a variedade de laranja %s no modelo?", Ps_String_Auxiliar_1) , "Incluir","Cancelar"); IF [P_Resposta = 1] THEN Pe_Laran:= StringToElement(S_Laranjas , Ps_String_Auxiliar_1, 0); IF [Pe_Laran] THEN DialogError(FormatString("J existe uma variedade de laranja com o nome %e.", Pe_Laran)); Pe_Laran:=''; ELSE SetElementAdd(S_Laranjas, Pe_Laran, Ps_String_Auxiliar_1); ENDIF; ENDIF; ELSE DialogError("Digite um nome para a nova variedade de laranja."); ENDIF; Ps_String_Auxiliar_1 := ""; Quando criarmos a pgina onde existiro botes para a execuo do procedimento de incluso de um elemento no conjunto de variedades de laranjas, haver um campo de edio contendo o identificador Ps_String_Auxiliar_1, que armazenar o nome da nova variedade de laranja. A primeira ao do procedimento verificar se este campo foi preenchido ou no. Caso o usurio execute a insero de um elemento vazio, o procedimento exibir uma caixa de mensagem de erro, solicitando que o campo seja devidamente preenchido. O usurio fecha a caixa de mensagem e o procedimento volta ao seu incio. Caso o campo esteja preenchido, uma caixa de dilogo ser exibida, confirmando a incluso da variedade no modelo. A funo DialogAsk retorna valores numricos, dependendo da opo escolhida. No nosso caso, as opes so incluir ou no a nova variedade de laranja no modelo. Na caixa de dilogo, se o boto referente opo incluir for pressionado, a funo retornar valor 1; caso a opo seja cancelar a operao, o valor retornado ser 2. H nesta linha de programao uma atribuio, ou seja, o parmetro P_Resposta assume o valor retornado pela funo DialogAsk. A funo FormatString permite utilizar a informao contida na string juntamente com o texto que aparecer na caixa de dilogo. Esta informao ser inserida na posio ocupada pelos caracteres %s. Continuando, caso a opo Incluir seja selecionada, a funo StringToElement ir verificar se o elemento contido na string Ps_String_Auxiliar_1 j existe no conjunto de variedades de laranjas ou no. A funo retorna o elemento caso ele exista e retorna vazio, caso contrrio. Se o elemento j existir no conjunto, uma mensagem de erro exibida, alertando o usurio de que este elemento no poder ser inserido no conjunto. Caso o elemento no exista, a funo SetElementAdd adiciona o novo elemento ao conjunto.

67

Voc pode obter mais informaes sobre funes do AIMMS atravs do manual contido no arquivo AIMMS_func.pdf, que instalado juntamente com o programa. Para cada funo pr-existente do AIMMS, o manual detalha os tipos de argumentos utilizados em sua declarao, os valores de retorno da funo, caso existam, alm de citar referncias a outras funes relacionadas com o assunto da funo em questo. Uma maneira de acessar este arquivo pressionar o boto direito do mouse sobre a funo, e selecionar a opo Help on, conforme mostra a Figura 3.8.

Figura 3.8 : Obtendo informaes sobre as funes do AIMMS.

Alm do manual sobre funes, o AIMMS possui outros manuais que so de grande utilidade tanto para aprendizagem como para consulta. Os arquivos deste manuais encontram-se dentro do diretrio de nome Paragon Decision Technology, conforme mostra a Figura 3.9.

Figura 3.9 : Arquivos contendo os manuais do AIMMS.

68

Procedimento de excluso de variedade de laranja PROCEDURE identifier : Proc_Bt_Excluir_Variedade body : IF [Pe_Laran] THEN P_Resposta := DialogAsk(FormatString("Excluir a variedade de laranja %e do modelo?", Pe_Laran), "Excluir","Cancelar"); IF [P_Resposta = 1] THEN S_Laranjas -= Pe_Laran; Pe_Laran:=''; ENDIF; ELSE DialogMessage("Selecione a variedade de laranja que ser excluda."); ENDIF; Na pgina onde o procedimento ser executado, haver um campo onde poderemos selecionar primeiramente qual elemento do conjunto desejamos excluir. Se houver algum elemento selecionado, isto , se o parmetro Pe_Laran for diferente de vazio, ento o procedimento oferece duas opes: excluir ou no este elemento do conjunto de variedades de laranjas. A declarao - = indica que o novo conjunto de variedades de laranjas S_Laranjas o conjunto que se tinha anteriormente menos o elemento contido no parmetro Pe_Laran que foi selecionado para ser excludo. Procedimento de verificao dos dados para incluso de variedade de laranja Este procedimento tem como finalidade verificar se o novo elemento foi adicionado ao conjunto antes que o usurio feche a pgina onde o procedimento est sendo executado. PROCEDURE identifier : Proc_Bt_Verifica_Dados_Inclusao_Variedade body : IF [Ps_String_Auxiliar_1 <> ""] THEN DialogMessage(FormatString("A variedade de laranja %s no foi includa no conjunto de Variedades de Laranja. \nPara inclu-la clique no sinal de mais (+) em Incluir Variedade.", Ps_String_Auxiliar_1)); P_Resposta:= DialogAsk("Deseja fechar a janela sem incluir a variedade?","Fechar","Cancelar"); IF [P_Resposta = 1] THEN PageClose; Ps_String_Auxiliar_1:=""; ENDIF; ELSE PageClose; ENDIF; Voltando ao procedimento de incluso de uma variedade de laranja, voc poder perceber que depois de executado, a string Ps_String_Auxiliar_1 tem sua informao apagada. Caso a informao ainda esteja contida na string no momento em que a pgina for fechada, isto significa que o procedimento de incluso no foi executado. Este procedimento de verificao alerta o usurio de que o elemento no foi includo no conjunto, e oferece a opo de cancelar a operao de incluso. Os caracteres \n fazem o mesmo papel da tecla ENTER, ou seja, posicionam o incio do texto subsequente na linha inferior na caixa de mensagem.

69

Procedimento de verificao dos dados para excluso de variedade de laranja De maneira anloga ao procedimento anterior, a excluso de elementos em um conjunto tem seus dados verificados no momento em que a pgina for fechada. PROCEDURE identifier : Proc_Bt_Verifica_Dados_Exclusao_Variedade body : IF [Pe_Laran <> ''] THEN DialogMessage(FormatString("A variedade de laranja %e no foi excluda do conjunto de Variedades de Laranja. \nPara exclu-la clique no sinal de menos (-) em Excluir Variedade.", Pe_Laran)); P_Resposta:= DialogAsk("Deseja fechar a janela sem excluir a variedade?","Fechar","Cancelar"); IF [P_Resposta = 1] THEN PageClose; Ps_String_Auxiliar_1:=""; ENDIF; ELSE PageClose; ENDIF; Procedimento para renomeao de variedade de laranja PROCEDURE identifier : Proc_Bt_Renomeia_Variedade body : IF [Ps_String_Auxiliar_1 <> ""] AND [Pe_Laran] THEN P_Resposta := DialogAsk(FormatString("Renomear a variedade de laranja %e como %s?",Pe_Laran, Ps_String_Auxiliar_1), "Renomear","Cancelar"); IF [P_Resposta = 1] THEN Pe_Laran_Aux:= StringToElement(S_Laranjas , Ps_String_Auxiliar_1, 0); IF [Pe_Laran_Aux] THEN DialogError(FormatString("J existe uma variedade de laranja com o nome %e.", Pe_Laran_Aux)); ELSE SetElementRename(S_Laranjas, Pe_Laran, Ps_String_Auxiliar_1); ENDIF; ENDIF; ELSE IF [NOT Pe_Laran] THEN DialogError("Selecione a variedade de laranja a ser renomeada."); ELSE DialogError("Digite um novo nome para a variedade de laranja."); ENDIF; ENDIF; Ps_String_Auxiliar_1 := "";

70

Procedimento de verificao dos dados para renomeao de variedade de laranja PROCEDURE identifier : Proc_Bt_Verifica_Dados_Renomeia_Variedade body : IF [Ps_String_Auxiliar_1 <> ""] THEN DialogMessage(FormatString("O produto %e no foi renomeado.", Pe_Prod)); P_Resposta:= DialogAsk("Deseja fechar a janela sem renomear o produto?","Fechar","Cancelar"); IF [P_Resposta = 1] THEN PageClose; Ps_String_Auxiliar_1:=""; ENDIF; ELSE PageClose; ENDIF; Os procedimentos para incluso e excluso dos produtos so anlogos aos procedimentos referentes s variedades de laranjas.

Procedimento de incluso produto PROCEDURE identifier : Proc_Bt_Incluir_Produto body : IF [Ps_String_Auxiliar_1 <> ""] THEN P_Resposta := DialogAsk(FormatString("Incluir o produto %s no modelo?", Ps_String_Auxiliar_1), "Incluir","Cancelar"); IF [P_Resposta = 1] THEN Pe_Prod:= StringToElement(S_Produtos , Ps_String_Auxiliar_1, 0); IF [Pe_Prod] THEN DialogError(FormatString("J existe um produto com o nome %e.", Pe_Prod)); Pe_Prod:=''; ELSE SetElementAdd(S_Produtos, Pe_Prod, Ps_String_Auxiliar_1); ENDIF; ENDIF; ELSE DialogError("Digite um nome para o novo produto."); ENDIF; Ps_String_Auxiliar_1 := "";

71

Procedimento de excluso de produto PROCEDURE identifier : Proc_Bt_Excluir_Produto body : IF [Pe_Prod] THEN P_Resposta := DialogAsk(FormatString("Excluir o produto %e do modelo?", Pe_Prod), "Excluir","Cancelar"); IF [P_Resposta = 1] THEN S_Produtos -= Pe_Prod; Pe_Prod:=''; ENDIF; ELSE DialogMessage("Selecione o produto que ser excludo."); ENDIF; Procedimento de verificao dos dados para incluso de produto PROCEDURE identifier : Proc_Bt_Verifica_Dados_Inclusao_Produtos body : IF [Ps_String_Auxiliar_1 <> ""] THEN DialogMessage(FormatString("O produto %s no foi includo no conjunto de Produtos. \nPara inclu-lo clique no sinal de mais (+) em Incluir Produto.", Ps_String_Auxiliar_1)); P_Resposta:= DialogAsk("Deseja fechar a janela sem incluir o produto?","Fechar","Cancelar"); IF [P_Resposta = 1] THEN PageClose; Ps_String_Auxiliar_1:=""; ENDIF; ELSE PageClose; ENDIF; Procedimento de verificao dos dados para excluso de produto PROCEDURE identifier : Proc_Bt_Verifica_Dados_Exclusao_Produtos body : IF [Pe_Prod <> ''] THEN DialogMessage(FormatString("O produto %e no foi excludo do conjunto de Produtos. \nPara exclu-lo clique no sinal de menos (-) em Excluir Produto.", Pe_Prod)); P_Resposta:= DialogAsk("Deseja fechar a janela sem excluir o produto?","Fechar","Cancelar"); IF [P_Resposta = 1] THEN PageClose; Ps_String_Auxiliar_1:=""; ENDIF; ELSE PageClose; ENDIF;

72

Procedimento para renomeao de produtos PROCEDURE identifier : Proc_Bt_Renomeia_Produto body : IF [Ps_String_Auxiliar_1 <> ""] AND [Pe_Prod] THEN P_Resposta := DialogAsk(FormatString("Renomear o produto %e como %s?",Pe_Prod, Ps_String_Auxiliar_1), "Renomear","Cancelar"); IF [P_Resposta = 1] THEN Pe_Prod_Aux := StringToElement(S_Produtos , Ps_String_Auxiliar_1, 0); IF [Pe_Prod_Aux] THEN DialogError(FormatString("J existe um produto com o nome %e.", Pe_Prod_Aux)); ELSE SetElementRename(S_Produtos, Pe_Prod, Ps_String_Auxiliar_1); ENDIF; ENDIF; ELSE IF [NOT Pe_Prod] THEN DialogError("Selecione o produto a ser renomeado."); ELSE DialogError("Digite um novo nome para o produto."); ENDIF; ENDIF; Ps_String_Auxiliar_1 := "";

Procedimento de verificao dos dados para renomeao de produtos PROCEDURE identifier : Proc_Bt_Verifica_Dados_Renomeia_Produto body : IF [Ps_String_Auxiliar_1 <> ""] THEN DialogMessage(FormatString("O produto %e no foi renomeado.", Pe_Prod)); P_Resposta:= DialogAsk("Deseja fechar a janela sem renomear o produto?","Fechar","Cancelar"); IF [P_Resposta = 1] THEN PageClose; Ps_String_Auxiliar_1:=""; ENDIF; ELSE PageClose; ENDIF;

73

3.4 Criando pginas com o uso de templates. Templates Conforme os modelos vo ficando maiores e complexos, inevitvel que o nmero de pginas necessrias para uma boa apresentao da modelagem e resultados aumente. O template uma forma de manter o mesmo padro de cores, disposio e aes de objetos para diversas pginas, sem que tenham que ser feitas uma a uma. Ou seja, todas as pginas que so construdas sob a estrutura de um dado template sempre possuem as mesmas caractersticas. Neste modelo temos apenas 3 pginas, mas o suficiente para ilustrar o funcionamento do template. Na estrutura do modelo, pressionar o boto Template Manager Alt + F9. ou pressione

na barra de ferramentas da janela Pressionar o boto New Template principal do AIMMS, nomear o template, por exemplo, como Template Geral, conforme mostra a Figura 3.10.

Figura 3.10 : Criao de um novo template.

No AIMMS, alm das cores definidas pelo sistema, voc pode personalizar suas prprias cores, atravs do menu Tools User Colors. Pressionar o boto Add, e criar a tonalidade da cor desejada. Adicionar a nova cor s cores personalizadas e nome-la. A Figura 3.11 mostra a caixa de cores do usurio com duas novas cores, Fundo Padro 1 e Fundo Padro 2 .

Figura 3.11 : Criao de cores personalizadas.

74

Quando voc quiser utilizar as cores personalizadas, a opo user dever ser selecionada na opo colors, nas caixas de dilogo das propriedades das pginas e objetos, como mostra a Figura 3.12.

Figura 3.12 : Utilizao das cores personalizadas.

A Figura 3.13 mostra o template utilizado neste modelo. Ele dividido em duas reas, a da esquerda para a exibio dos dados do modelo e a da direita, que sempre ocupada com um menu. Este menu acessa trs pginas, o arquivo do Listing File e contm outros dois botes com aes: execuo e parada de execuo do programa

Figura 3.13 : Exemplo de template com menu.

75

No canto superior esquerda da janela principal temos o ttulo do projeto. Como padro, este ttulo vem definido como AIMMS, mas pode ser configurado de acordo com cada projeto. No menu Settings Project Options, selecione primeiramente a pasta Project e em seguida, Appearance. direita, selecione a opo Project Title e especifique o nome do projeto no campo de edio, conforme mostra a Figura 3. 14.

Figura 3.14 : Especificando o ttulo de um projeto no AIMMS.

Crie trs novas pginas atravs do Page Manager, localizado na estrutura do modelo, conforme mostra a Figura 3. 15.

Figura 3.15 : Criao das pginas utilizadas no modelo.

Em seguida, abra novamente a janela do Template Manager e perceba que ele possui todas as pginas que foram previamente criadas no Page Manager. O para abrir sua prximo passo clicar duas vezes sobre o cone do template estrutura e inserir as trs pginas, conforme mostra a Figura 3.16. Para inserir as pginas, pressione o boto esquerdo no mouse sobre o nome da pgina e, mantendo-o pressionado, arraste a pgina para cobrir o campo onde, no momento, est escrito Empty.

76

Figura 3.16 : Inserindo as pginas dentro da estrutura de um template.

Botes Voltando ao template, voc dever criar dois tipos de botes: Botes com bitmap Criar dois bitmap button, um para executar o programa e o outro, para cancelar a execuo. Estes botes esto localizados no canto inferior direito do template. aconselhvel o uso de bitmaps que estejam gravados dentro do projeto do AIMMS. Voc consegue importar bitmaps atravs do menu Tools Project User Files. No momento de determinar qual ser o bitmap utilizado no boto, selecione a opo Select Project File. Na caixa de dilogo das propriedades do boto de execuo do programa, voc dever definir as aes: - Menu Command Run Delete Listing File - Run Procedure MainExecution - Menu Command Window Progress Window Para o boto de parada de execuo, declare a ao Menu Command Run Stop. Botes invisveis Criar trs botes invisveis, que sero utilizados para acessar as Cadastro, Dados Gerais e Resultados. pginas

Na seo Actions da caixa de dilogo das propriedades do boto, selecione a opo Linked Page(s) e pressione Add. No lado direito da caixa, pressione o boto para selecionar a pgina desejada.

Outra ao que tambm devemos declarar Close Page, caso contrrio, ficaremos com vrias pginas abertas ao mesmo tempo. Para alterar a ordem das aes declaradas, utilize os botes e . A Figura 3.17 mostra a caixa de dilogo para o boto que a acessa a pgina Cadastro.

77

Figura 3.17 : Adicionando link entre pginas.

Para o boto que acessa o Listing File, a ao declarada deve ser Menu Command File Open Listing File.

3.5 As pginas do modelo

Pgina: Cadastro Antes de passarmos para a construo da pgina de Cadastro, vamos criar as pginas onde sero executados os procedimentos de incluso e excluso de elementos em um conjunto. Estas pginas devem ser diferenciadas, pois sero chamadas a partir da pgina principal e fechadas logo aps a execuo do procedimento ter sido concluda. A diferenas dessas pginas esto no seu tamanho (que ser bem reduzido, como uma espcie de caixa de dilogo) e no fato que elas s podero ser fechadas atravs de um boto que far a verificao do procedimento, e no da maneira convencional como fechamos as janelas com as quais trabalhamos diariamente. Primeiramente, vamos criar a caixa de dilogo para incluso de uma variedade de laranja. A Figura 3.18 mostra um exemplo de como esta caixa poderia ser.

Figura 3.18 : Caixa de dilogo para incluso de uma variedade de laranja.

78

Criar uma nova pgina chamada Box Adiciona_Variedade. Redimensionar esta pgina, para que fiquei parecendo uma caixa de dilogo. Nas propriedades da pgina, defina o ttulo da pgina como Incluir Variedade, selecione a opo Behaves as Dialog e na opo System Menu Close selecione a ao Ignore. Criar um campo de edio atravs do objeto New Scalar, onde o nome da nova variedade ser inserido. Crie o boto que executar o procedimento de incluso Proc_Bt_Incluir_Variedade e o que executar o procedimento Proc_Bt_Verifica_Dados_Incluso_Variedade para verificao dos dados.

Para criar a caixa de dilogo onde o procedimento de excluso ser executado, podemos fazer uma cpia da pgina Box Adiciona_Variedade e modificar poucas coisas. Isso poupar tempo e permitir que as caixas de dilogo fiquem com seu aspecto padronizado. Selecionar a pgina Box Adiciona_Variedade e pressionar as teclas Ctrl + C seguidas das teclas Ctrl + V. Voc tambm pode utilizar os comando Copy e Paste do menu Edit. Clicar com o boto direito do mouse sobre a cpia e selecionar a opo Rename, ou pressionar F2. Com isso, o nome da pgina entrar em modo de edio. Renomear a pgina como Box Remove_Variedade. Abrir a nova pgina em modo de edio. Modificar o ttulo da pgina para Excluir Variedade, na caixa de dilogo das propriedades da pgina. Excluir o objeto Scalar. Pressionar o boto New Selection Object localizado na barra de ferramentas da janela principal do AIMMS e selecionar as opes conforme mostra a Figura 3.19.

Figura 3.19 : Declarao de New Selection Object.

79

Associar a execuo do procedimento Proc_Bt_Excluir_Variedade no boto com sinal menos (-) e Proc_Bt_Verifica_Dados_Exclusao_Variedade para checar os dados na hora do fechamento da pgina.

A Figura 3.20 mostra a caixa de dilogo onde a excluso de elementos em um conjunto efetuada.

Figura 3.20 : Caixa de dilogo para excluso de uma variedade de laranja.

Para o conjunto de variedades de laranjas, falta criar apenas a pgina para renomear os elementos. Essa nova caixa de dilogo pode ser facilmente obtida se copiarmos a caixa de excluso de variedade. Depois de copiar a caixa de dilogo de excluso de variedade, inserir um novo objeto do tipo Scalar contendo a string Ps_String_Auxiliar_1. Modificar os procedimentos existentes para Proc_Bt_Renomeia_Variedade Proc_Bt_ Verifica_Dados_Renomeia_Variedade. e

A Figura 3.21 mostra a pgina onde o procedimento de renomeao ser executado.

Figura 3.21 : Caixa de dilogo para renomeao de uma variedade de laranja.

De maneira anloga, as caixas de dilogos para incluso, excluso e renomeao dos elementos do conjunto de produtos podem ser criadas a partir das caixas existentes para o conjunto de variedade de laranjas. As alteraes necessrias so sobre os procedimentos e sobre o element Parameter, que agora deve ser Pe_Prod. Uma boa dica manter seu projeto bem organizado, principalmente no que diz respeito s pginas. Se voc inserir as pginas de incluso, excluso e renomeao de elementos em um conjunto, como subns da rvore formada pela pgina Cadastro, conforme mostra a

80

Figura 3.22, podemos dar a entender que estas pginas apenas so acessadas a partir da pgina Cadastro. A disposio das pginas como ns de uma estrutura tipo rvore tambm so teis na hora de atribuir links entre pginas pai e filho, sem que haja a necessidade de especificar exatamente o nome da pgina em questo, como foi feito at agora.

Figura 3.22 : Organizando as pginas de um projeto.

Com as caixas de dilogo criadas, apenas nos falta criar duas tabelas contendo os elementos dos conjuntos de variedades de laranjas e produto, para a criao da pgina de cadastro do modelo, conforme a Figura 3.23.

Figura 3.23 : Exemplo de uma pgina de cadastro.

81

Criar trs botes com bitmap para acessar as pginas para incluir, excluir e renomear os elementos dos conjuntos de variedades de laranjas e produtos. Criar duas tabelas compostas (Composite Table) contendo os elementos dos conjuntos S_Laranjas e S_Produtos.

Esta a pgina de cadastro onde os procedimentos so utilizados. Caso voc deseje utilizar o recurso do AIMMS para efetuar as operaes sobre os elementos dos conjuntos, a pgina de cadastro seria mais ou menos como a exibida pela Figura 3.24.

Figura 3.24 : Pgina de cadastro com utilizao do recurso do AIMMS para efetuar operaes sobre conjuntos.

Criar um novo Selection Object, escolhendo Multiple Item Selection Listbox Set S_Laranjas. Na seo Selection da caixa de dilogo das propriedades do objeto, selecionar as opes Multiple Columns, Edit field: At Top e Add/Remove Buttons, conforme mostra a Figura 3.25.

Figura 3.25 : Propriedades do objeto Selection Object.

82

Para incluir um elemento no conjunto, digite o novo nome na linha de edio e pressione o . Para remover, selecione um elemento na lista e pressione o boto "Add New Data" boto "Delete Data" . Pgina: Dados Gerais Na pgina Dados Gerais colocaremos todas as informaes do modelo contidas em parmetros. A Figura 3.27 exibe o exemplo de uma pgina Dados Gerais.

Figura 3.27 : Pgina Dados Gerais.

Criar objetos do tipo Scalar para exibir as informaes contidas nos parmetros P_Numero_de_Meses_no_Horizonte P_Preco_de_Estoque P_Custo_de_Processamento P_Custo_Operacao_Fabrica. Criar tabelas para exibir as informaes contidas nos parmetros P_Demanda(PROD,MS) P_Disponibilidade(LARAN,MS) P_Rendimento(LARAN). Para o preo de venda dos produtos, criar uma tabela composta, contendo o parmetro P_Preco_de_Venda(PROD) no domnio e na coluna da tabela. J para as porcentagens mnima e mxima de cada suco no produto, criar um novo Selection Object com as seguintes propriedades: Drop Down List Element Paramenter Pe_Prod.

83

Criar uma tabela contendo os parmetros P_Porcentagem_Minima(LARAN,PROD) e P_Porcentagem_Maxima(LARAN,PROD). A seguir, na caixa de dilogo das propriedades da tabela, abrir a pasta Contents e selecionar o primeiro parmetro. Pressionar o boto Modify Avanar. No lado esquerdo da nova janela com ttulo Identifier, selecione o ndice PROD. No lado direito, voc deve selecionar a opo Element Parameter e escolher Pe_Prod como este elemento. Repetir o procedimento para o outro parmetro. Com isso, os dados da tabela sero referentes apenas ao parmetro que estiver selecionado no Selection Object.

Pgina: Resultados A Figura 3.28 mostra a pgina que contm as informaes das variveis e parmetros psrodada do modelo.

Figura 3.28 : Pgina Resultados.

Criar uma tabela para a varivel V_Funciona_Fabrica(MS). Na pasta Format selecionar a opo 0-1 Values. Na tabela de variao no atendimento da demanda, ao escolher a cor do parmetro P_Variacao_Atendimento_Demanda(PROD,MS), selecionar Model para especificar que a cor utilizada est declarada no modelo, e a seguir selecione o element parameter Pe_Cor_Excesso_producao(PROD,MS), conforme mostra a Figura 3.29.

84

Figura 3.29 : Utilizando cores definidas no modelo.

Para criar as tabelas referentes s variedades de laranjas, voc dever primeiramente criar o novo Selection Object contendo o element parameter Pe_Ms. Em cada uma das tabelas, modificar os identificadores para que estejam relacionados a este elemento, e no a um ndice fixo.

3.6 Listing File O AIMMS produz uma sada padro para cada execuo de procedimentos e cada soluo dos programas matemticos. O nome destas listagens o nome base do modelo com a extenso .lis. As sadas so geradas opcionalmente na primeira execuo numa sesso ou dependendo das opes podem ser tambm geradas durante uma execuo subsequente, aps cada atualizao dos parmetros e variveis. Uma sada padro pode conter um ou mais dos seguintes componentes: source listing O cdigo fonte como compilado. constraint listing uma sada aonde consta cada restrio do programa matemtico. solution listing os valores das solues para cada uma de suas variveis e restries. solver status file o processo de soluo. alguma sada que tenha sido gerada por um comando PUT ou DISPLAY dentro do modelo.

O procedimento padro do AIMMS no gerar estas sadas, para que o processo de soluo no seja sobrecarregado, tornando-se lento. No entanto, caso seja necessrio, voc pode determinar que o AIMMS gere qualquer uma dessas sadas. No nosso caso, estamos interessados em gerar o Listing File. Nele, teremos informaes sobre as variveis, parmetros, restries e factibilidade do modelo.

85

No menu "Settings", selecione a opo "Project Options". Selecione as pastas "Solvers general" como mostra a Figura 3.30. "Standard reports" "Constraints",

Figura 3.30 : Gerando o listing File.

Marque o campo "At every solve" para as trs opes, "Constraints", "Solution" e "Solver especific".

J foi especificado nas pginas, atravs dos botes, que um Listing File seja apagado antes de uma execuo do programa e um modo de abrir tal arquivo. Caso voc queira executar estes procedimentos atravs do menu, voc dever: Selecionar a opo "Delete Listing File" no menu "Run". Dessa maneira, toda informao que por ventura estaria armazenada neste arquivo, ser apagada. Executar novamente seu modelo. Um novo listing file ser gerado. Para a visualiz-lo, selecionar as opes "Open" "Listing File" no menu "File".

A seguir, mostraremos algumas informaes do Listing File do modelo Unicitrus. Na primeira parte, vemos o valor da varivel que compe a funo objetivo e seus limites inferior e superior. Tambm temos o status da varivel, dizendo se ela bsica ou no, e se ela est situada em um dos seus limites ou no.

86

Como a varivel V_Funciona_Fabrica(MES) binria, ela sempre estar em um dos seus limites.

Podemos ver pelas informaes abaixo que as variveis V_Estoque(LARAN,MES) no ms 3 no foram criadas. Este o resultado da restrio imposta sobre o domnio do ndice no momento da gerao das variveis. No nosso modelo, apenas trs variveis deixaram de ser criadas, mas em outras situaes, esse nmero pode ser efetivamente muito maior, evitando que a processo de execuo do programa e obteno de uma resposta para o problema tornem-se demorados demais.

87

Abaixo, temos um exemplo de como as informaes sobre as restries so exibidas pelo Listing File. Cada uma das restries descrita em funo dos ndices para os quais ela existe e de sua definio. O valor de lhs representa o nvel onde a restrio est sendo satisfeita. Podemos traduzir a informao abaixo da seguinte maneira: pela definio da varivel, temos que a soma das tonelagens de produtos produzido durante o ms, multiplicado pelo fator 106 deve ser menor que 1. A restrio est sendo satisfeita no nvel zero, pois as variveis que fazem parte dessa restrio, com exceo de V_Funciona_Fabrica( Ms 1) assume valor zero.

Temos tambm a definio da varivel que representa a funo objetivo, assim como os valores das variveis que fazem parte dessa definio. ---- V_Lucro_Total_definition V_Lucro_Total_definition .. [ 1 | 80 | after ] + 500000 * V_Funciona_Fabrica(Ms 1) + 500000 * V_Funciona_Fabrica(Ms 2) + 500000 * V_Funciona_Fabrica(Ms 3) - 1000 * V_Ton_Produzida(Standard,Ms 1) 1000 * V_Ton_Produzida(Standard,Ms 2 ) - 1000 * V_Ton_Produzida(Standard,Ms 3) 1100 * V_Ton_Produzida(Dairy,Ms 1) - 1100 * V_Ton_Produzida(Dairy,Ms 2) 1100 * V_Ton_Produzida(Dairy,Ms 3) + 1 * V_Caixas_Compradas(Hamlin,Ms 1) + 1 * V_Caixas_Compradas(Hamlin,Ms 2) + 1 * V_Caixas_Compradas(Hamlin,Ms 3) + 1 * V_Caixas_Compradas(Pera,Ms 1) + 1 * V_Caixas_Compradas(Pera,Ms 2) + 1 * V_Caixas_Compradas(Pera,Ms 3) + 1 * V_Caixas_Compradas(Valncia,Ms 1)

88

+ + + + +

1 10 10 10 1

* * * * *

V_Caixas_Compradas(Valncia,Ms 2) + 1 * V_Caixas_Compradas(Valncia,Ms 3) V_Estoque(Hamlin,Ms 1) + 10 * V_Estoque(Hamlin,Ms 2) V_Estoque(Pera,Ms 1) + 10 * V_Estoque(Pera,Ms 2) V_Estoque(Valncia,Ms 1) + 10 * V_Estoque(Valncia,Ms 2) V_Lucro_Total = 0 ; (lhs=0) lower 0 0 0 -inf -inf -inf -inf -inf -inf 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -inf level 0 1 1 0 1500 700 0 100 100 0 82857 1 0 349999 212161 0 4413 4412 0 0 0 0 0 0 766157 upper 1 1 1 inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf inf

Name V_Funciona_Fabrica(Ms 1) V_Funciona_Fabrica(Ms 2) V_Funciona_Fabrica(Ms 3) V_Ton_Produzida(Standard,Ms 1) V_Ton_Produzida(Standard,Ms 2) V_Ton_Produzida(Standard,Ms 3) V_Ton_Produzida(Dairy,Ms 1) V_Ton_Produzida(Dairy,Ms 2) V_Ton_Produzida(Dairy,Ms 3) V_Caixas_Compradas(Hamlin,Ms 1) V_Caixas_Compradas(Hamlin,Ms 2) V_Caixas_Compradas(Hamlin,Ms 3) V_Caixas_Compradas(Pera,Ms 1) V_Caixas_Compradas(Pera,Ms 2) V_Caixas_Compradas(Pera,Ms 3) V_Caixas_Compradas(Valncia,Ms 1) V_Caixas_Compradas(Valncia,Ms 2) V_Caixas_Compradas(Valncia,Ms 3) V_Estoque(Hamlin,Ms 1) V_Estoque(Hamlin,Ms 2) V_Estoque(Pera,Ms 1) V_Estoque(Pera,Ms 2) V_Estoque(Valncia,Ms 1) V_Estoque(Valncia,Ms 2) V_Lucro_Total

Por fim, o Listing File apresenta um resumo do nmero de restries e variveis contidas no modelo. These are the first model statistics of MP_Unicitrus. Constraints Variables Elements Symbolic Individual 11 80 (0 infeasible) 6 43 (0 frozen) 24 217

89