Índice introdução 1 1. o problema das calças e das camisas 2moretti/ms428/tutorial aimms.pdf ·...

90
Índice Introdução 1 1. O Problema das Calças e das Camisas 2 1.1 INTRODUÇÃO 2 1.2 DESCRIÇÃO DO PROBLEMA 2 1.3 FORMULAÇÃO MATEMÁTICA 2 1.4 CRIANDO UM NOVO PROJETO NO AIMMS 4 1.5 CONSTRUINDO UM MODELO NO AIMMS 5 1.6 INSERINDO OS DADOS DE UM MODELO NO AIMMS 14 1.7 GRAVANDO OS DADOS DE UM MODELO NO AIMMS 16 1.8 RESOLVENDO O MODELO 18 1.9 CONSTRUINDO UMA PÁGINA NO AIMMS 20 1.10. ANALISANDO MUDANÇAS NOS PARÂMETROS DO MODELO 30 2. O Problema do Corte de Bobinas 32 2.1 INTRODUÇÃO 32 2.2 DESCRIÇÃO DO PROBLEMA 32 2.3 FORMULAÇÃO MATEMÁTICA 33 2.4 CONSTRUINDO O MODELO NO AIMMS 37 2.5 GRAVANDO OS DADOS DO MODELO 44 2.6 CONSTRUINDO AS PÁGINAS DE ABERTURA E DE DADOS 45 2.7 DECLARANDO PÁGINA E CASOS INICIAIS 51 3. O Problema da produção de sucos 53 3.1 INTRODUÇÃO 53 3.2 DESCRIÇÃO DO PROBLEMA 53 3.3 FORMULAÇÃO MATEMÁTICA 55 3.4 CRIANDO PÁGINAS COM O USO DE TEMPLATES. 74 3.5 AS PÁGINAS DO MODELO 78 3.6 LISTING FILE 85

Upload: others

Post on 16-Oct-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Índice

Introdução 1

1. O Problema das Calças e das Camisas 2

1.1 INTRODUÇÃO 2 1.2 DESCRIÇÃO DO PROBLEMA 2 1.3 FORMULAÇÃO MATEMÁTICA 2 1.4 CRIANDO UM NOVO PROJETO NO AIMMS 4 1.5 CONSTRUINDO UM MODELO NO AIMMS 5 1.6 INSERINDO OS DADOS DE UM MODELO NO AIMMS 14 1.7 GRAVANDO OS DADOS DE UM MODELO NO AIMMS 16 1.8 RESOLVENDO O MODELO 18 1.9 CONSTRUINDO UMA PÁGINA NO AIMMS 20 1.10. ANALISANDO MUDANÇAS NOS PARÂMETROS DO MODELO 30

2. O Problema do Corte de Bobinas 32

2.1 INTRODUÇÃO 32 2.2 DESCRIÇÃO DO PROBLEMA 32 2.3 FORMULAÇÃO MATEMÁTICA 33 2.4 CONSTRUINDO O MODELO NO AIMMS 37 2.5 GRAVANDO OS DADOS DO MODELO 44 2.6 CONSTRUINDO AS PÁGINAS DE ABERTURA E DE DADOS 45 2.7 DECLARANDO PÁGINA E CASOS INICIAIS 51

3. O Problema da produção de sucos 53

3.1 INTRODUÇÃO 53 3.2 DESCRIÇÃO DO PROBLEMA 53 3.3 FORMULAÇÃO MATEMÁTICA 55 3.4 CRIANDO PÁGINAS COM O USO DE TEMPLATES. 74 3.5 AS PÁGINAS DO MODELO 78 3.6 LISTING FILE 85

Page 2: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Introdução Este tutorial tem como objetivo abordar as características básicas do AIMMS. Ele é dirigido a estudantes e profissionais da área de modelagem matemática e foi desenvolvido com o intuito de familiarizar o usuário com o software em seus conceitos básicos. Dividido em três capítulos distintos, o usuário encontrará primeiramente a descrição de um problema e a sua modelagem matemática, seguida de instruções de como construir este modelo no ambiente do AIMMS, assim como a construção de páginas onde serão exibidos os dados relevantes ao problema. A primeira parte trata de um simples problema sobre produção de lotes de calças e camisas, e será mostrado passo a passo como se fazem as declarações necessárias para que o modelo possa ser resolvido pelo AIMMS. O segundo problema trata sobre perda de material em cortes de bobinas de papel. Neste capítulo serão abordados itens mais específicos relacionados ao problema, tal como a construção de um gráfico de Gantt. Já no terceiro problema, que diz respeito sobre a produção de sucos, serão desenvolvidos os conceitos pertinentes aos arquivos de saída do AIMMS. Cada um dos capítulos posteriores considera que o usuário já leu e aprendeu os conceitos anteriores, seguindo assim uma ordem de dificuldade crescente para os três modelos apresentados. Bom divertimento !!!

1

Page 3: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

1. O Problema das Calças e das Camisas 1.1 Introdução Este capítulo trata de um problema onde deseja-se determinar o número de lotes de calças e de camisas que devem ser produzidos, de forma a maximizar o lucro com as vendas, sem violar as restrições de disponibilidade das máquinas, matérias-primas e mão-de-obra. No AIMMS, serão apresentados os conceitos básicos de declaração de variáveis e parâmetros, construção do programa matemático que irá resolver o problema e a criação de uma página de visualização dos dados, onde o usuário poderá modificar e manipular os parâmetros e os resultados obtidos. 1.2 Descrição do Problema Uma determinada confecção opera com dois produtos: calças e camisas. Como tratam - se de produtos semelhantes, possuem uma produtividade comparável e compartilham os mesmos recursos. A programação é realizada por lotes de produtos. O departamento de produção informa que são necessários 10 homens x hora para um lote de calças e 20 homens x hora para um lote de camisas. Sabe-se que não é necessária mão-de-obra especializada para a produção de calças, mas são necessários 10 homens x hora desse tipo de mão-de-obra para produzir um lote de camisas. O departamento de pessoal informa que a força máxima de trabalho disponível é de 30 homens x hora de operários especializados e de 50 homens x hora de operários não - especializados. Da planta de produção, sabemos que existem apenas 2 máquinas com capacidade de produzir os dois tipos de produtos, sendo que a máquina 1 pode produzir um lote de calças a cada 20 horas e um lote de camisas a cada 10 horas, não podendo ser utilizada por mais de 80 horas no período considerado. A máquina 2 pode produzir um lote de calças a cada 30 horas e um lote de camisas a cada 35 horas, não podendo ser utilizada por mais de 130 horas no período considerado. São necessários dois tipos de matérias-primas para produzir as calças e camisas. Na produção de um lote de calças são utilizados 12 quilos da matéria-prima A e 10 da B. Na produção de um lote de camisas são utilizados 8 quilos da matéria-prima A e 15 da B. O almoxarifado informa que, por imposição de espaço, só pode fornecer 120 quilos da matéria-prima A e 100 quilos de B, no período considerado. Sabendo-se que o lucro pela venda é de $800,00 nos lotes de camisas e $500,00 nos lotes de calças, formule o problema de maximizar o lucro da operação produtiva em pauta. 1.3 Formulação Matemática O objetivo do problema descrito acima é determinar o número de lotes de calças e camisas que devem ser produzidos de maneira a maximizar o lucro pela venda dos mesmos, sem violar as restrições impostas pela disponibilidade dos recursos utilizados.

2

Page 4: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

A tabela abaixo resume a utilização necessária dos recursos (neste caso, a qualidade da mão-de-obra, máquinas e matérias-primas) para a produção de um lote de cada produto, assim como a disponibilidade de cada um desses recursos:

Mão-de-obra

Não-especializada ( homens x hora )

Mão-de-obra especializada

( homens x hora )

Máquina 1 ( horas )

Máquina 2 ( horas )

Matéria-prima A

( Kg )

Matéria- prima B

( kg ) Calças 10 - 10 30 12 10

Camisas 10 10 20 35 8 15 Disponibilidade 50 30 80 130 120 100

Tabela 1.1: Utilização necessária dos recursos e suas disponibilidades. Definimos as variáveis do problema como:

jx = Quantidade de lotes do produto j produzidos , j = 1 (calças) j = 2 (camisas) z = Lucro total das vendas do lotes

∑=

=2

1jjj xcz

onde cj é o preço de venda do lote do produto j. As únicas restrições do problema dizem respeito à disponibilidade dos recursos utilizados da produção dos lotes de calças e camisas. Se denotarmos por rij, i = 1,..., 6 a quantidade necessária do recurso i utilizada para a produção de um lote do produto j, e di como sua disponibilidade, as restrições podem ser escritas da forma:

∑=

=≤2

1jijij 6,...,1i,dxr

A formulação completa do problema é:

denegativida-não de Restrições0x,x

100x15x01máquinas das idadeDisponibil120x8x12

130x35x30máquinas das idadeDisponibil80x10x20

3010xobra-de-mão de idadeDisponibil50x10x10

sax800x500zMax

21

21

21

21

21

2

21

21

≤+≤+

≤+≤+

≤≤+

+=

3

Page 5: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

1.4 Criando um novo projeto no AIMMS

• Em algum diretório de seu acesso, crie um sub-diretório "Arquivos do AIMMS" para os novos projetos que serão construídos.

• Para iniciar o AIMMS, selecione o programa através do ícone .

• Cada vez que o AIMMS é aberto, uma caixa de diálogo com "A dica do dia" é

mostrada. Como o próprio nome já diz, são dicas, vale a pena prestar atenção nelas. Pressione "Close" para fechá-la.

• Para criar um novo projeto, pressione o botão "New Project" , que se encontra

no canto superior esquerdo da tela principal do programa.

A caixa de diálogo mostrada na Figura 1.1 aparecerá.

• Determine "Lotes" como o nome do novo projeto. Selecione o diretório de trabalho através do botão , ou especifique-o manualmente no campo "Create in folder".

• Pressione o botão "OK".

Figura 1.1 : Caixa de diálogo para um novo projeto.

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

Figura 1.2 : Janela da estrutura do projeto.

4

Page 6: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

1.5 Construindo um modelo no AIMMS

• Tecle F8 ou clique o botão "Model Explorer" na janela principal do projeto para abrir a estrutura inicial do modelo, mostrada na Figura 1.3.

Figura 1.3 : Estrutura inicial do modelo.

Esta estrutura inicial em árvore contém uma seção de declarações "Declaration", onde serão inseridos os elementos básicos do modelo matemático, e três procedimentos pré-definidos, "MainInitialization" , "MainExecution" e "MainTermination". A princípio, apenas as seções "Declaration" e "MainExecution" serão utilizadas para a construção e execução do Problema das calças e camisas. As funções dos demais procedimentos serão 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 botões

ficará ativo na barra de ferramentas. • Pressione o botão "New Set" .

• Defina o nome "S_Produtos" para o conjunto e pressione "ENTER" para registrá-

lo.

• Pressione "ENTER" novamente ou clique duas vezes sobre o nome do conjunto criado. O AIMMS abrirá o formulário de atributos, mostrado na Figura 1.4.

• Segundo o nosso modelo matemático, vamos atribuir o índice j para os

produtos. Para isso, preencha o campo "Index" com o índice j. • Você também pode preencher o campo "Comment", para uma boa

documentação de seu projeto.

• Complete o formulário de atributos pressionando o botão "Check, Commit and Close" , localizado no canto superior direito do formulário de atributos. Este comando verifica se os dados inseridos não sofrem algum tipo de incompatibilidade com o resto do modelo.

5

Page 7: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.4 : Formulário de atributos do conjunto de produtos. O conjunto dos recursos que são utilizados na produção 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 após a criação 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 não foram gravados no projeto. Para gravá-los, pressione o ícone "Save Project" localizado no canto superior esquerdo da barra de ferramentas. Declarando parâmetros A inserção dos parâmetros do modelo no AIMMS pode ser feita de maneira análoga aos conjuntos. Quando declaramos um parâmetro relacionado a algum conjunto já existente no modelo, podemos fazer essa associação de duas maneiras: utilizando o índice do conjunto entre parênteses logo após o nome do parâmetro, ou definindo-o no formulário de atributos no campo "Index domain". Caso o parâmetro seja um número escalar, o campo referente ao índice deve permanecer em branco.

6

Page 8: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Pressione o botão "New Parameter" localizado na barra de ferramentas. • Especifique "P_Disponibilidade(i)" como o nome do novo parâmetro e pressione

"ENTER" para registrá-lo. Se você pressionar "ENTER" novamente, o formulário de atributos do parâmetro "P_Disponibilidade(i)" será aberto, e você poderá verificar que o campo "Index domain" foi preenchido automaticamente. A Figura 1.6 mostra o formulário:

Figura 1.6 : Formulário de atributos do parâmetro de disponibilidade dos recursos. • Feche o formulário de atributos pressionando o botão "Check, Commit and Close"

. Outro parâmetro do nosso modelo são as quantidades de recursos necessárias para a produção de um lote de cada um dos produtos considerados.

• Pressione o botão "New Parameter" localizado na barra de ferramentas. • Especifique "P_Utilizacao(i,j)" como o nome do novo parâmetro e pressione "ENTER"

para registrá-lo. Neste caso, o parâmetro é uma matriz que representa a quantidade do recurso i necessária na produção de um lote do produto j.

• Feche o formulário de atributos pressionando o botão "Check, Commit and

Close" . O último parâmetro do nosso modelo é o lucro de venda de cada lote dos produtos. Crie um novo parâmetro, 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, parâmetros, variáveis ou restrições, não podem conter caracteres de acentuação gráfica ou espaços em branco. Para declarar nomes de identificadores com espaços, utilize o caracter underline " _ ".

7

Page 9: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

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

Após a criação dos três parâmetros, a estrutura do modelo é igual à mostrada pela Figura 1.7.

Figura 1.7 : Estrutura do modelo após a criação dos parâmetros.

• Grave a estrutura declarada, pressionando o ícone "Save Project" .

Declarando variáveis A declaração de variáveis no AIMMS é similar à declaração de parâmetros. Mas além de definirmos à qual conjunto a variável refere-se, devemos também determinar a qual conjunto de números ela pertence. Dependendo do problema que estávamos construindo, as variáveis podem ser reais, reais positivas, inteiras, binárias, etc.

• Pressione o botão "New Variable" localizado na barra de ferramentas. • Especifique "V_LotesProduzidos(j)" como o nome da nova variável e pressione

"ENTER" para registrá-la. Essa variável nos dirá quantos lotes de calças e camisas devem ser produzidos de tal forma que o lucro total com suas vendas seja o maior possível.

8

Page 10: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Pressione "ENTER" novamente para abrir o formulário de atributos da variável "V_LotesProduzidos(j)".

• Pressione o botão referente ao campo "Range". O AIMMS exibirá uma caixa de

diálogo onde podemos definir o domínio de nossa variável. O AIMMS possui alguns domínios pré-definidos, mas podemos também determinar outros domínios mais adequados ao problema que estamos construindo. No nosso caso, como a produção das calças e camisas só pode ser feita em lotes, sabemos que nossa variável só pode assumir valores inteiros e maiores ou iguais a zero. A Figura 1.8 mostra a caixa de diálogo:

• Selecione a opção "User Defined" na caixa de diálogo.

• Selecione a opção "Integer" logo abaixo.

• Defina "0" como o valor mínimo que a variável pode assumir, no campo "Lower Bound". O campo "Upper Bound" já está preenchido corretamente com " inf ".

• Pressione o botão "OK" para fechar a caixa de diálogo.

Figura 1.8 : Caixa de diálogo do domínio da variável.

• Feche o formulário de atributos pressionando o botão "Check, Commit and Close" .

Devemos declarar também outra variável, 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 calças e camisas produzidos, logo, maximizando este número de lotes, estaremos maximizando também o lucro obtido.

• Crie uma nova variável chamada "V_LucroTotal".

9

Page 11: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Abra o formulário de atributos da nova variável. No campo "Definition", insira a seguinte expressão:

sum [ j , P_LucroUnitario(j)* V_LotesProduzidos(j) ]

Você pode digitar a expressão inteira acima, ou pode utilizar o recurso de preenchimento automático 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á após o caracter "P", e na segunda vez, uma janela mostrará todos os identificadores já registrados do problema que começam com a letra "P". Selecione o parâmetro "P_LucroUnitario" e insira-o na expressão. Lembre-se de adicionar também o índice ( j ). Repita o procedimento descrito acima, percebendo que desta vez, é necessário pressionar "Spacebar" apenas uma vez para a janela com os identificadores ser aberta. Este procedimento é válido para o preenchimento automático de qualquer identificador já registrado no modelo.

• O formulário de atributos deve ter o mesmo conteúdo do formulário mostrado na Figura 1.9. Feche o formulário de atributos pressionando o botão "Check, Commit and Close" . Dessa maneira, o AIMMS verifica se sua definição para a variável está compatível com os outros identificadores do modelo.

Figura 1.9 : Formulário de atributos da variável "V_LucroTotal". Declarando restrições Temos somente um tipo de restrição neste problema, o que diz respeito à disponibilidade dos recursos.

• Pressione o botão "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

Page 12: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

A Figura 1.10 mostra o formulário de atributos da restrição criada.

Figura 1.10 : Formulário de atributos da restrição "C_RestricaoDisponibilidade(i)". Declarando o Programa Matemático É no Programa Matemático que definimos a função objetivo do problema. Devemos definir se trata-se de um problema de maximizar ou minimizar uma função, qual variável é o objetivo do modelo, se o problema é linear, não-linear, inteiro, misto, etc.

• Pressione o botão localizado na barra de ferramentas. • Selecione o ícone "Mathematical Program" e pressione "OK".

• Especifique o nome do Programa Matemático como "MaximoLucroTotal"

• Preencha o formulário de atributos como mostrado na Figura 1.11, usando para

isso o botão . Os campos "Constraints" e "Variables" devem ficar em branco. Quando isso acontece, o AIMMS assume que todas as variáveis e restrições declaradas fazem parte do Programa Matemático. Como trata-se de um modelo onde as variáveis devem assumir somente valores inteiros, temos que definir como "mip" (mixed integer problem) o campo "Type", que especifica o tipo do modelo. Se as variáveis pudessem assumir valores contínuos, poderíamos definir o problema como "lp" (linear problem). O campo "Objective" requer sempre uma variável escalar.

Figura 1.11 : Formulário de atributos completo para o Programa Matemático.

11

Page 13: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

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 construído 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 você tiver utilizado a opção "Check, Commit and Close" na criação dos identificadores.

Uma vez verificada a validade do modelo, grave seu projeto pressionando .

Visualizando os identificadores Uma vez que o modelo está construído, será útil em algumas ocasiões que você possa ver todos os identificadores e algumas de suas propriedades simultaneamente. O AIMMS permite a criação de janelas de visualização. Você pode escolher visualizar somente as variáveis, os conjuntos, e suas especificações. Como exemplo, vamos mostrar como criar a janela que exibe todos os identificadores e suas definições.

• Pressione o ícone "Identifier Selector" , localizado na janela principal do projeto, ou pressione "Crtl F8" .

• Selecione a opção "Identifiers with Definition" .

• Com o botão direito do mouse, selecione o comando "Open With..." no menu que

será exibido em seguida, como mostra a Figura 1.13.

12

Page 14: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.13: Janela do Seletor de identificadores.

• Selecione a opção "Domain - Definition" na janela "View Manager", como mostra a Figura 1.14.

Figura 1.14 : Janela do gerenciador de visualização.

• Pressione "Open" para exibir a janela de visualização dos identificadores mostrada na Figura 1.15.

Figura 1.15 : Janela de visualização dos identificadores e suas definições.

13

Page 15: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

1.6 Inserindo os dados de um modelo no AIMMS Como no problema proposto, o número de dados do modelo é pequeno, eles podem ser inseridos manualmente. O AIMMS possibilita também que os dados sejam inseridos à partir de um banco de dados já existente, mas isso será exposto mais adiante.

• Abra o formulário de atributos do conjunto "S_Produtos".

• Pressione o botão "Data" .

• No campo vazio que aparece no topo da página de dados, insira os nomes dos produtos que devem ser produzidos. Para isso, digite "Calças" e pressione "ENTER" para inserí-lo. Repita o mesmo procedimento para "Camisas". A Figura 1.16 mostra a página de dados completa para o conjunto "S_Produtos.

• Pressione "Close" para fechar a janela.

Figura 1.16 : Página de dados para o conjunto "S_Produtos".

Você pode modificar e apagar elementos já inseridos na página de dados. Para modificá-los, selecione o elemento desejado. Ele aparecerá no campo de edição no topo da página, e você pode então modificá-lo e inserí-lo novamente. Para apagar um elemento já existente, selecione-o e pressione o botão "Delete Data" .

• Abra a página de dados do conjunto "S_Recursos". Para isso, você pode abrir o formulário de atributos e pressionar o botão "Data" , ou acessá-la a partir da página de dados do conjunto "S_Produtos" pressionando o botão "Next Page Data"

. O botão permite selecionar a página de dados de qualquer um dos identificadores do modelo.

• Insira os nomes dos recursos utilizados, dados por "Mão-de-obra Especializada", "Mão-de-obra não-especializada" , "Máquina 1" , "Máquina 2" , "Matéria-prima 1" e "Matéria-prima 2".A Figura 1.17 mostra a página de dados do conjunto "S_Recursos" preenchida.

14

Page 16: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.17 : Página de dados do conjunto "S_Recursos".

• Crie a página de dados para o parâmetro "P_Disponibilidade(i)" dos recursos. Selecione o primeiro campo de dados, determine o primeiro valor e pressione "ENTER" para inserí-lo. Os demais valores são inseridos da mesma forma. A Figura 1.18 mostra a página de dados do parâmetro "P_Disponibilidade(i)" completa.

Figura 1.18 : Página de dados do parâmetro "P_Disponibilidade(i)". • Crie a página de dados do parâmetro "P_Utilizacao(i,j)" , como exibida pela Figura

1.19.

Figura 1.19 : Página de dados do parâmetro "P_Utilizacao(i,j)".

• Crie a página de dados do parâmetro "P_LucroUnitario(j)", como mostrada pela Figura 1.20.

15

Page 17: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.20 : Página de dados do parâmetro "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 matemático, podemos ter problemas com valores de parâmetros diferentes, que podem ser gravados em casos diferentes. Vamos gravar os dados que acabaram de ser inseridos em um caso chamado "Produção de lotes de calças e camisas".

• Selecione o menu "Data" , na barra de ferramentas da janela principal do AIMMS e execute o comando "Save Case".

• Na caixa de diálogo "Save Case", preencha o campo "Name" com "Produção de

lotes de calças e camisas", sem as aspas, conforme mostra a Figura 1.21.

• Pressione o botão "SAVE" para gravar os dados neste caso.

Figura 1.21 : Caixa de diálogo para gravação dos dados em um novo caso.

Quando um projeto do AIMMS é fechado e reaberto novamente, não é adotado como procedimento padrão do programa o carregamento dos dados gravados anteriormente. Isso se deve ao fato de que um modelo pode ter vários casos gravados. Entretanto, você pode determinar que o AIMMS carregue um caso específico cada vez que o projeto é iniciado, usando a caixa de diálogo "AIMMS Options" mostrada pela Figura 1.22.

16

Page 18: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Selecione o menu"Settings" e execute o comando "Project Options".

• Selecione a pasta "Project – Startup & Authorization" na estrutura de opções e

clique na opção "Startup Case" na janela à direita.

• Pressione o botão para selecionar o caso "Produção de lotes de calças e camisas" e pressione "OK" para fechar a caixa de diálogo "Select Case".

• Pressione o botão "Apply" na caixa de diálogo "AIMMS Options" e finalize o

procedimento pressionando "OK".

Figura 1.22 : Caixa de diálogo "AIMMS Options".

Lembre-se sempre de gravar seu projeto, pressionando o botão . A opção de configuração especificada acima é gravada juntamente quando você grava o seu projeto todo. Entretanto, note que gravar um projeto não 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 opção "Load Case" e execute o comando "as Active..." • Selecione o caso desejado na caixa de diálogo "Load Case", mostrada pela Figura

1.23.

• Pressione o botão "Load".

17

Page 19: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.23 : Caixa de diálogo "Load Case". 1.8 Resolvendo o modelo Temos o modelo matemático construído, 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 declarações no procedimento já existente "MainExecution" : uma para fazer o AIMMS resolver o Programa Matemático e outro para determinar que as variáveis assumam valor zero, caso a solução do Programa Matemático não 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 botão esquerdo do mouse.

• Insira as duas declarações mostradas pela Figura 1.24.

• Feche o formulário de atributos do procedimento "MainExecution" pressionando o botão "Check, Commit and Close" .

Figura 1.24 : Formulário de atributos do procedimento "MainExecution".

18

Page 20: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Se o AIMMS apresentar uma caixa de diálogo detalhando erros na compilação do modelo, reveja suas declarações e faça as correções necessárias.

• Execute o procedimento "MainExecution" pressionando F6 ou selecionando a opção "Main Execution" no menu "Run".

Pressionando simultaneamente "Ctrl" e "p", o AIMMS exibirá uma janela de progresso que contém informações selecionadas à respeito do progresso que foi feito (ou está fazendo) durante a fase de execução. 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 informações fundamentais da resolução do modelo, tais como: projeto em andamento, procedimento do modelo que foi executado, programa Matemático sobre o qual foi executado o procedimento, número de variáveis e restrições do modelo, tipo do modelo, direção da função objetivo, número de iterações, se a solução encontrada foi ótima, o valor da solução ótima, etc. Uma vez que o AIMMS resolveu o problema, os valores das variáveis "V_LotesProduzidos" e "V_LucroTotal" tornam-se disponíveis em suas páginas de dados correspondentes.

• Abra o formulário de atributos da variável "V_LotesProduzidos" e clique no botão "Data" para ver a quantidade de lotes produzidos de cada produto, como mostra a Figura 1.26.

19

Page 21: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.26 : Quantidade de lotes produzidos.

• Abra o formulário de atributos da variável "V_LucroTotal" e clique no botão "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 página no AIMMS Uma vez o problema resolvido, os valores ótimos das variáveis podem ser acessados através de suas páginas de dados correspondentes. Entretanto, esta visualização é pouco adequada, pois não nos mostra os identificadores, seus parâmetros e os resultados do problema simultaneamente. O AIMMS permite a construção de páginas onde podemos apresentar os dados relevantes ao problema, além de possibilitar a mudança nos valores dos parâmetros e uma resolução de um novo problema, sem que tenhamos que acessar a estrutura principal do programa. Prévia da página de dados A Figura 1.28 mostra a página final que será construída para o problema de produção dos lotes das calças e das camisas.

20

Page 22: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.28 : Página final do modelo. Criando uma nova página Para criar uma nova página vazia no projeto, você deve seguir os seguintes passos:

• Pressione o botão "Page Manager" na janela da estrutura do projeto ou pressione F9.

• Pressione o botão "New Page", localizado na barra de ferramentas da janela

principal do AIMMS.

• Especifique " Dados de entrada e saída da produção de lotes de calças e camisas" como o nome da nova página, como mostra a Figura 1.29.

Figura 1.29 : Gerenciador de páginas com uma única página.

• Pressione "ENTER" para registrar a nova página. Inserindo os dados de entrada do modelo Uma página do AIMMS apresenta-se de dois modos: o modo de edição e o modo do usuário.O modo de edição é utilizado para criar e modificar objetos em uma página. O modo do usuário é utilizado para visualização e modificação dos dados exibidos na página.

21

Page 23: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Para abrir uma nova página no modo de edição:

• Selecionar a nova página na caixa de diálogo "Page Manager". • Pressionar o botão "Edit Mode" na barra de ferramentas para abrir a página

selecionada no modo de edição. Para criar uma nova tabela, você deve:

• Pressionar o botão "New Table" na barra de ferramentas. • Clicar com o botão 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 botão do mouse. Uma caixa de diálogo chamada "Identifier" com a estrutura do projeto e todos os identificadores declarados aparecerá, como mostra a Figura 1.30. Nesta caixa de diálogo é possível selecionar qual dos identificadores fará parte da nova tabela.

Figura 1.30 : Caixa de diálogo para seleção dos identificadores.

• Selecione o parâmetro "P_Utilizacao(i,j)". • Uma segunda caixa de diálogo "Identifier" aparecerá, mas neste caso, apenas

pressione "Finish".

• Ajuste o tamanho da janela, se for necessário. Para isso, posicione a ponta do cursor do mouse sobre a extremidade da borda a ser ajustada. Pressione o botão esquerdo do mouse e, mantendo-o pressionado, arraste o cursor até o ponto desejado.

Como o parâmetro "P_Utilizacao(i,j)" é bidimensional, podemos aproveitar para inserir os parâmetros "P_Disponibilidade(i)" e "P_LucroUnitario(j)" juntamente na mesma tabela.

22

Page 24: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Selecione a tabela onde deseja inserir o novo identificador, clicando sobre ela. • Pressione o botão "Properties" localizado na barra de ferramentas, ou clique

com o botão direito do mouse sobre a tabela e selecione a opção "Properties", para acessar a caixa de diálogo das propriedades da tabela.

• Selecione a opção "Contents", como mostra a Figura 1.31.

Figura 1.31 : Caixa de diálogo das propriedades da tabela.

• Pressione o botão "Add" e selecione o parâmetro "P_Disponibilidade(i)”. • Pressione os botões "Next" e "Finish", sucessivamente.

• Repita o procedimento para o parâmetro "P_LucroUnitario(j)".

• Após adicionar os dois novos identificadores na tabela, pressione "Apply" e "OK"

para fechar a caixa de diálogo das propriedades da tabela. A Figura 1.32 mostra a tabela resultante com os três parâmetros (dados de entrada) do problema:

Figura 1.32 : Tabela com os dados de entrada do problema. A princípio, os títulos dos identificadores na tabela são os mesmos utilizados em suas definições no modelo matemático. Podemos modificar os títulos, alterar os números

23

Page 25: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

decimais dos dados, centralizar os valores à direita, à esquerda, ao centro, podemos adicionar cores ao plano de fundo da página, enfim... Nossa preocupação na construção de uma página 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 diálogo das propriedades da tabela.

Figura 1.33 : Nova tabela com os dados de entrada do problema. Bordas Você pode adicionar bordas à sua tabela na opção "Border", na caixa de diálogo das propriedades da tabela. Títulos Altere os títulos dos identificadores de sua tabela, renomeando-os na opção "Text".

• Selecione o identificador "P_Utilizacao(i,j)" . • Desmarque a opção "Default Text (from Model)" e especifique "Utilização de

recursos por lote de produto" como o título do identificador na tabela, como mostra a Figura 1.34.

• Pressione "Apply" para registrar a modificação.

• Repita o procedimento para os demais identificadores.

Figura 1.34 : Modificação do título dos identificadores.

24

Page 26: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Alinhamento, números decimais e largura de colunas Para cada um dos identificadores do modelo, altere suas propriedades através da opção "Format". A Figura 1.35 nos mostra um exemplo, no caso, para o parâmetro "P_Utilizacao(i,j)".

Figura 1.35 : Formatação de elementos do parâmetro "P_Utilizacao(i,j)". Podemos criar gráficos de barras para representar a disponibilidade dos recursos e o lucro unitário por unidade de produto.

• Pressione o botão "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 parâmetro "P_Disponibilidade(i)".

Neste momento, você deve estar com uma página semelhante à mostrada pela Figura 1.36.

25

Page 27: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.36 : Página intermediária 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 gráfico de barras. Para criar uma tabela que contenha somente os valores das variáveis na solução ótima:

• Pressione o botão "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 botão "Next" e logo após, o botão "Finish".

Uma vez que o domínio dos índices foi determinado, podemos inserir os valores das variáveis que estamos interessados.

• Pressione o botão "Properties" localizado na barra de ferramentas.

• Selecione a opção "Contents" na caixa de diálogo de propriedades. • Pressione o botão "Add" e selecione o identificador "V_LotesProduzidos(j)" para

completar a tabela composta. Para criar o gráfico de barras contendo o número de lotes de calças e camisas produzidos, você deve proceder da mesma maneira quando criou os gráficos de barras para os identificadores "P_LucroUnitario(j)" e "P_Disponibilidade(i)".

26

Page 28: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Como último resultado do modelo, vamos inserir o valor escalar da solução ótima:

• Pressione o botão "Scalar Object" localizado na barra de ferramentas.

• Crie uma caixa de texto para o identificador "V_LucroTotal".

• Pressione "Finish" para fechar a caixa de diálogo das propriedades. Criando o botão de execução Um dos últimos itens para a construção desta página é a criação de um botão que possibilita uma nova execução do Programa Matemático, sem que tenhamos que sair da página de dados do AIMMS. Este recurso é muito utilizado quando queremos analisar a variação dos valores de uma solução ótima para o problema, quando os valores de seus parâmetros são alterados. Para a criação de tal botão, execute os seguintes passos:

• Pressione o botão "New Button" e desenhe o botão usando o mouse.

• Insira "Resolver o Problema dos Lotes" como o título do botão.

• Selecione a opção "Actions" na caixa de diálogo das propriedades do botão. Queremos que, ao pressionarmos o botão "Resolver o Problema dos Lotes", o AIMMS execute novamente o procedimento de resolução do problema, o "MainExecution".

• Selecione a opção "Run" como a ação a ser adicionada ao botão. • Pressione o botão "Add".

• Escolha a opção "Procedure" e selecione "MainExecution", conforme mostra a

Figura 1.37.

• Pressione "Apply", seguido de "OK" para fechar a caixa de diálogo.

27

Page 29: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.37 : Criação do botão de nova execução. Note que o botão de nova execução somente poderá ser usado para resolver o modelo quando a página do AIMMS estiver no modo de usuário. Você pode colocar a página nesse modo pressionando o botão "User Mode" localizado na barra de ferramentas da janela principal do AIMMS. Finalizando a página A página final mostrada pela Figura 1.28 possui três objetos de texto e bordas que separam os dados de entrada e os resultados do problema. Os títulos podem ser criados da seguinte maneira:

• No menu "Object", selecione a opção "Text" e determine a área onde o texto será exibido.

• Especifique "Problema das Calças e Camisas" como um texto estático, como mostra

a Figura 1.38.

28

Page 30: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 1.38 : Caixa de diálogo das propriedades do texto.

• Selecione a opção "Font" na caixa de diálogo das propriedades de texto e pressione o botão "Add".

• Selecione o tamanho e estilo da fonte desejados. Por exemplo, vamos utilizar o

estilo "Bold" e tamanho da fonte 20. Pressione o botão "OK".

• Especifique "Título" como o nome para este padrão de fonte.

• Repita o mesmo procedimento para um padrão de fonte denominado "Subtítulo".

• Crie os subtítulos "Dados de entrada do problema" e "Resultados", definindo-os como subtítulos.

A Figura 1.39 mostra a caixa de diálogo das propriedades de texto com os dois novos padrões de fontes criados.

Figura 1.39 : Caixa de diálogo com novos padrões de fontes.

29

Page 31: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Finalmente, podemos completar a página adicionando retângulos que vão 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 opção "Rectangle" no menu "Object".

• Determine o tamanho do retângulo necessário para agrupar as tabelas

desejadas.

• Você pode modificar as propriedades de seu retângulo, acessando sua caixa de diálogo através do botão direito do mouse.

A Figura 1.40 mostra a página finalizada.

Figura 1.40 : Página finalizada do modelo. 1.10. Analisando mudanças nos parâmetros do modelo Agora que temos o modelo e a página construídos, estamos em condições de usar a página para analisarmos quais são os efeitos sobre os valores da solução ótima, caso os valores dos parâmetros sejam alterados. Primeiramente, pressione o botão "User Mode" para colocar a página no modo de usuário. Por exemplo, suponha que a disponibilidade da mão-de-obra especializada seja reduzida de 30 para 10 homens x hora. Para efetuar essa redução, você precisa simplesmente mudar o valor do parâmetro referente à disponibilidade da mão-de-obra especializada na página de dados.

30

Page 32: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• No gráfico de barras dos recursos, selecione a barra que representa a disponibilidade "Mão-de-obra especializada".

• Posicione o ponteiro do mouse sobre o topo da barra.

• Pressione o botão 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 parâmetro é clicar sobre a barra correspondente e inserir o novo valor no campo de edição que aparece na parte inferior do gráfico de barras.

• Pressione o botão "Resolver o Problema dos Lotes". Você vai reparar que com a diminuição de mão-de-obra especializada, um lote de camisas foi deixado de produzir. Em compensação, um lote de calças foi produzido a mais. No caso inicial, tínhamos 2 lotes de calças 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 página de dados do novo problema.

Figura 1.41 : Página de dados do novo problema.

31

Page 33: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

2. O Problema do Corte de Bobinas 2.1 Introdução 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 padrão de corte seja a mínima possível. Na construção do modelo no AIMMS, você aprenderá como utilizar dois ou mais programas matemáticos e como salvar casos diferentes em um mesmo modelo. Também será mostrado como construir um Gráfico de Gantt, construir duas ou mais páginas com acesso entre elas e como determinar dados e a página que serão carregados automaticamente toda vez que o modelo for iniciado. 2.2 Descrição do Problema Uma máquina 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 específicas Li , i = 1, ... , 9 durante um período de planejamento, como mostra a Tabela 2.1: Pedidos de larguras a serem satisfeitos (ton)

i 1 2 3 4 5 6 7 8 9 Largura Li (mm) 1115 1500 1000 1275 1430 1150 1055 575 950

Quantidade qi (ton) 105 11 9 18 5 5 12 15 16

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

Os padrões de corte são diferentes maneiras de combinar uma ou mais larguras Li das bobinas pedidas dentro de uma bobina mestre. Um padrão de corte especifica o número ni de larguras Li que podem ser cortadas em uma bobina mestre simultaneamente, para i = 1,...,9. Por exemplo, um padrão 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 padrão 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

Page 34: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

A companhia considera somente os 15 padrões de cortes mostrados na Tabela 2.2. Largura Li

(mm) 1115 1500 1000 1275 1430 1150 1055 575 950

Padrão 1 2 0 1 0 0 0 0 0 1 Padrão 2 1 2 0 0 0 0 0 0 0 Padrão 3 2 0 0 1 0 0 0 1 0 Padrão 4 0 0 0 0 2 0 1 0 0 Padrão 5 0 0 0 3 0 0 0 0 0 Padrão 6 0 2 0 0 0 0 1 0 0 Padrão 7 0 0 0 0 0 0 0 0 4 Padrão 8 0 0 0 1 2 0 0 0 0 Padrão 9 0 0 0 0 0 3 0 1 0 Padrão 10 1 0 0 0 0 0 2 0 1 Padrão 11 1 0 2 0 0 0 1 0 0 Padrão 12 3 0 0 0 0 0 0 1 0 Padrão 13 3 0 0 0 0 0 0 0 0 Padrão 14 2 0 0 0 0 0 0 0 2 Padrão 15 0 0 4 0 0 0 0 0 0

Tabela 2.2 : Número de bobinas de largura Li obtidas em cada padrão de corte.

Definimos as variáveis de decisão como: xp = Peso da bobina mestre (ton) cortado de acordo com o padrão de corte p, p = 1, ... , 15. Formular o problema como um Problema de Programação Linear para determinar quantas toneladas da bobina mestre devem ser cortadas de acordo com um dado padrão de corte, de forma a satisfazer a demanda dos pedidos com perda percentual total mínima. Como a formulação muda se a tonelagem a ser entregue dos pedidos pode sofrer uma variação de ± 10%? ( Caso formulado por D.H.Lombardo Ferreira, Unisoma, Brasil ) 2.3 Formulação Matemática 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 = Número de bobinas de largura Li obtidas no padrão de corte p , p = 1, ... , 15.

33

Page 35: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Podemos definir outros parâmetros 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 padrão de corte (mm):

∑=

−=9

1iiipp LnLP

• Perda Percentual no padrão de corte:

LPPP pp /=

As restrições do problema quando as demandas das bobinas são fixas são do tipo:

∑=

≥15

1pipipi dxnpbm

Quando as demandas das bobinas podem sofrer uma variação de ± 10%, as restrições do problema são dadas por:

∑=

≤≤15

11.19.0

pipipii dxnpbmd

Como o objetivo do problema é minimizar a perda percentual do peso da bobina mestre utilizado, podemos escrever a função objetivo como:

∑=

=15

1pppxPPzMin

A Tabela 2.3 mostra as perdas (mm) em cada um dos 15 padrões de corte. Padrão

p 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Perda (mm)

20 85 120 285 375 145 400 65 175 25 30 280 855 70 200

Tabela 2.3 : Perda de papel nos padrões de cortes.

34

Page 36: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Formulação do Problema com demanda fixa: A formulação completa para o problema com demandas fixas é dada por:

)20070855280302517565

4001453752851208520(4200

1

15141312111098

7654321

xxxxxxxx

xxxxxxxzMin

+++++++

+++++++

sa

0,...,,

16)24(4200950

15)(4200575

12)2(42001055

5)3(42001150

5)22(42001430

18)3(42001275

9)42(42001000

11)22(42001500

105)23322(42001115

1521

141071

1293

111064

9

84

853

15111

62

1413121110321

≥+++

≥++

≥+++

≥+

≥++

≥++

≥+

≥+++++++

xxx

xxxx

xxx

xxxx

x

xx

xxx

xxx

xx

xxxxxxx

35

Page 37: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Formulação do Problema com demanda variável A formulação para o problema, quando as demandas das bobinas podem sofrer uma variação de ± 10% é dada por:

)20070855280302517565

4001453752851208520(4200

1

15141312111098

7654321

xxxxxxxx

xxxxxxxzMin

+++++++

+++++++

sa

0,...,,

6,17)24(42009504,14

5,16)(42005755,13

2,13)2(420010558,10

5,5)3(420011505,4

5,5)22(420014305,4

8,19)3(420012752,16

9,9)42(420010001,8

1,12)22(420015009,9

5,115)23322(420011155,94

1521

141071

1293

111064

9

84

853

15111

62

1413121110321

≤+++≤

≤++≤

≤+++≤

≤≤

≤+≤

≤++≤

≤++≤

≤+≤

≤+++++++≤

xxx

xxxx

xxx

xxxx

x

xx

xxx

xxx

xx

xxxxxxx

36

Page 38: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

2.4 Construindo o modelo no AIMMS

• Crie um novo projeto, chamado "Problema das Bobinas".

• Crie as declarações chamadas "Dados de Entrada", "Modelo de Corte" e "Declarações Grafico de Gantt". Para isso, você pode renomear o primeiro ícone para a primeira declaração. Para as demais, selecione a última declaração 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 declaração feita e pressione o botão "New Procedure" , localizado na barra de tarefas. Para criar o procedimento "MainExecution01", basta renomear o procedimento "MainExection" já existente.

A Figura 2.1 mostra a estrutura do modelo com as declarações e procedimentos criados.

Figura 2.1: Estrutura inicial do modelo.

Declaração dos dados de entrada do modelo Na declaração "Dados de Entrada", você deverá criar um conjuntos e três parâmetros: SET: identifier : Larguras index : i order by : - LargurasFinais(i) Obs: Note que o parâmetro "LargurasFinais(i) ainda não foi declarado. Portanto, declare este parâmetro antes de preencher o campo de informação "Order by". Este campo está indicando que os elementos do conjunto "Larguras" serão ordenados em ordem decrescente dos elementos do parâmetro "LargurasFinais(i)". Insira na página de dados do conjunto "Larguras" os valores das larguras das bobinas pedidas, seguidos da unidade (mm), como mostra a Figura 2.2.

37

Page 39: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 2.2: Página de dados do conjunto "Larguras". Declare também os parâmetros: PARAMETER: identifier : Demanda index domain : i Insira os valores das demandas das bobinas, como proposto no modelo matemático. PARAMETER: identifier : LarguraBobinaMestre definition : 4200 PARAMETER: identifier : LargurasFinais index domain : i Especifique na página de dados do parâmetro "LargurasFinais" os próprios valores das larguras das bobinas, como mostra a Figura 2.3.

Figura 2.3: Página de dados do parâmetro "LargurasFinais(i)".

38

Page 40: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Declarações do Modelo de Corte Na declaração "Modelo de Corte", você deverá declarar os identificadores mostrados na Figura 2.4:

Figura 2.4: Identificadores contidos na declaração "Modelo de Corte". SET: identifier : PadraoDeCorte subset of : Integers index : p definition : { 1..15 } Quando inserirmos a definição { 1..15 } para este identificador, o AIMMS cria um conjunto de dados contendo 15 números inteiro, variando de 1 a 15, para representar os 15 padrões de cortes utilizados neste modelo. PARAMETER: identifier : LargurasNoPadrao index domain : (p,i) Inserir a tabela de padrões de cortes proposto pelo modelo. Os parâmetros abaixo não necessitam ter seus dados inseridos manualmente, eles são calculados pelo AIMMS a partir da sua definição. PARAMETER: identifier : PerdaNoPadrao index domain : p definition : LarguraBobinaMestre – sum ( i ,LargurasFinais(i)*LargurasNoPadrao(p,i) ) PARAMETER: identifier : PerdaPercentual index domain : p definition : ( 100*PerdaNoPadrao(p) ) / LarguraBobinaMestre

39

Page 41: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

PARAMETER: identifier : PorcentagemPesoBobinaMestre index domain : i definition : LargurasFinais(i)/LarguraBobinaMestre PARAMETER: identifier : VariacaoDemanda definition : 10 VARIABLE: identifier : PesoCortadoComPadrao index domain : p range : nonnegative VARIABLE: identifier : PerdaPercentualTotal definition : sum(p, (PerdaPercentual(p)/100)*PesoCortadoComPadrao(p)) Os identificadores declarados abaixo, apesar de serem funções da variável "PesoCortadoComPadrão(p)", são interpretados pelo AIMMS como parâmetros do problema. PARAMETER: identifier : PesoTotalBobinaMestre definition : 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 definition : TonelagemProduzida(i) - Demanda(i) 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 variação na tonelagem pedida. Para isso, temos que declarar os dois tipos de restrições, uma para cada tipo de demanda. CONSTRAINT: identifier : RestricaoDemandaFixa index domain : i definition : PorcentagemPesoBobinaMestre(i)* sum(p, LargurasNoPadrao(p,i)* 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

Page 42: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Como temos dois problemas a serem resolvidos, fica claro que também teremos dois Programas Matemáticos nesse modelo. Nestes casos, é conveniente a criação de conjuntos que separam as variáveis e restrições dos problemas. No presente modelo, as variáveis para os dois problemas são as mesmas, portanto temos apenas que determinar quais são as restrições de cada um dos problemas. Podemos criar então os conjuntos: SET: identifier : DemandaFixa subset of : AllConstraints definition : data{RestricaoDemandaFixa} Obs:

• Para preencher o campo "Subset of", clique no ícone no formulário 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 definição faz com que o novo conjunto seja

composto dos dados referentes ao identificador "RestriçãoDemandaFixa", ou seja, este é um conjunto com as restrições que serão utilizadas para a resolução do problema quando as demandas das bobinas forem fixas.

SET: identifier : DemandaVariavel subset of : AllConstraints definition : data{RestricaoDemandaVariavel} Vamos declarar agora os dois Programas Matemáticos 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 Declaração do Gráfico de Gantt Vamos passar agora às declarações que nos permitirão construir um Gráfico de Gantt. Este gráfico é usado neste modelo para mostrar os padrões de cortes e a perda de material em cada padrão, como mostra a Figura 2.5.

41

Page 43: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 2.5 : Gráfico de Gantt com os padrões de corte do Problema das Bobinas.

SET: identifier : Cortes subset of : Integers index : c parameter : Corte definition : { 1..100 } "Cortes" é o conjunto da quantidade de cortes em cada padrão. Sabemos que, neste modelo, o número de corte em cada padrão é 4, mas sem perda de generalidade, podemos definir o número máximo de cortes possíveis como sendo 100. Neste modelo, o parâmetro "Corte" é utilizado em um procedimento que calcula a posição de cada corte no Gráfico de Gantt. Este procedimento é apresentado logo mais. SET: identifier : TiposDeCortes index : tc order by : user definition : 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 binário create, assumindo valor igual a 1 indica que um novo elemento não existente é adicionado ao conjunto durante a chamada da função. 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

Page 44: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

PARAMETER: identifier : ComprimentoCorte index domain : (p,c) Declaração do Procedimento de Visualização dos padrões de corte

• Clique duas vezes sobre o ícone "New Procedure" e crie um procedimento chamado "VisualizacaoPadroes" na janela da estrutura do modelo.

• Crie uma nova declaração e dentro dela, declare um novo parâmetro chamado

"ContaCortes", conforme mostra a Figura 2.6.

Figura 2.6 : Estrutura do modelo com as declarações para a construção do Gráfico de Gantt.

• Clique duas vezes sobre o nome do procedimento "VisualizacaoPadroes" e preencha o campo "Body" com o seguinte algoritmo, que calcula o início e comprimento de cada corte dentro de um padrão:

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

Page 45: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

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; Declaração dos procedimentos "MainExecution" Para cada um dos procedimentos "MainExecution01" e "MainExecution02", basta declararmos qual dos Programas Matemáticos devem ser resolvidos. PROCEDURE: procedure : MainExecution01 body : Solve MinimaPerdaPercentualTotalFixa; PROCEDURE: procedure : MainExecution02 body : Solve MinimaPerdaPercentualTotalVariavel; Você pode também acrescentar no corpo dos procedimentos a condição de verificação de otimalidade da solução obtida para o problema, conforme visto no problema descrito anteriormente ( pag.19). Declaração 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 resolução dos dois Programas Matemáticos. O procedimento é dado por: if ( CaseSaveAll( confirm:2 ) = 1 ) then return 1; else return 0; endif ; Com a função 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, então os dados e conjuntos de dados são gravados sem confirmação. Se o valor é igual a 2, o AIMMS exibirá uma caixa de diálogo para confirmação da gravação dos dados. Caso o valor seja 1, então o AIMMS utiliza-se das propriedades e categorias dos casos para determinar quando uma caixa de diálogo para confirmação da gravação dos dados deve ser exibida. A função retorna o valor 1 se os dados foram gravados com sucesso e retorna 0 se o usuário cancelou a operação de gravação. Se qualquer outro tipo de erro acontecer, a função 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 gravação dos dados do modelo. Lembramos, mais uma vez, que é conveniente a gravação periódica de seu projeto. Podemos gravar os dados

44

Page 46: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

do modelo em apenas um caso, ou dividí-los nos casos de demanda fixa e demanda variável. Para ilustrar isso, primeiramente grave seus dados em um caso chamado "Demandas Fixa e Variável". Para isso, selecione a opção "Save case as" no menu "Data". O AIMMS possui um recurso que permite a gravação periódica de seu projeto e de seus dados, enquanto o programa está em funcionamento. No menu "Settings", selecione a opção "AutoSave & Backups" "Project" , e determine o intervalo desejado para as gravações de seu projeto, assim como o de criação dos backups. A Figura 2.7 mostra a caixa de diálogo para esta opção:

Figura 2.7 : Caixa de diálogo da opção "AutoSave & Backups". Você pode repetir o procedimento para a opção "AutoSave & Backups" "Data". Como o modelo possui dois procedimentos "MainExecution", você pode determinar qual deles será executado, selecionando-o através do menu "Run" "Procedure". Pode ser também que você queira gravar os dados dos casos de demanda fixa e demanda variável separados. Para isso, selecione um dos procedimentos "MainExecution01" ou "MainExecution02" e grave os resultados de cada um deles utilizando a opção "Save case as" no menu "Data". 2.6 Construindo as páginas de abertura e de dados

Pressione o botão "Page Manager" na janela de estrutura do projeto e crie duas novas páginas, chamadas "Descrição do Problema" e "Dados", como mostra a Figura 2.8.

45

Page 47: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 2.8 : Gerenciador de páginas para o modelo de Corte de Bobinas. Página "Descrição do Problema" Quando você cria um projeto no AIMMS, pode ser interessante ter uma página de abertura, que será exibida toda vez que o projeto for aberto. Ela pode, por exemplo, conter uma simples descrição do problema, logotipos e opções para gerenciamento do projeto e outras páginas. A Figura 2.9 exemplifica uma página de abertura.

Figura 2.9 : Exemplo de uma página de abertura de um projeto no AIMMS.

Propriedades da página

• Clique duas vezes sobre o nome da primeira página, "Descrição do Problema". • Coloque-a no modo de edição, pressionando o ícone .

46

Page 48: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Com o botão direito do mouse, abra o formulário de atributos da página.

• Na opção "General", determine " Descrição do Problema de Corte de Bobinas" como o título que será visível na borda superior da página.

• Na opção "Action" , especifique "MainInitialization" no campo "Page Entry

Procedure".

• Na opção "Colors", escolha uma cor para a tela de fundo de sua página. Retângulos Para criar os retângulos coloridos que aparecem sob o texto, utilize a opção "Rectangle" no menu "Object".

• Na opção "Rectangle", selecione o tipo desejado do retângulo. Na Figura 2.9 o tipo utilizado foi "Out-Shadow Rectangle" , com linha sólida de largura 1.

• Na opção "Colors", selecione as cores desejadas para o fundo do retângulo

(Background) e para os elementos que venham a estar sobre o retângulo (Foreground).

Textos Para a inserção dos textos, utilize a opção "Text" no menu "Object".

• Selecione a área do texto sobre a área do retângulo, e insira o texto estático, na caixa de diálogo do texto.

• Selecione a cor e fonte de seu texto.

Bitmaps Você também pode inserir figuras que estejam no formato bitmap (.bmp). No exemplo acima, inserimos o logotipo do AIMMS, que pode ser extraído de exemplos de projetos contidos do subdiretório Examples do AIMMS. Para inserir bitmaps, utilize a opção "Bitmap" no menu "Object".

• Selecione a área sobre a página onde o bitmap será inserido. • Especifique o diretório ou nome de arquivo ou de projeto onde o bitmap desejado

encontra-se. Botões de comandos Vamos criar três botões nesta página inicial: um para abrir o Model Explorer, outro para acessarmos a página que contém os dados do problema e outro que permitirá fechar o projeto. Para criar o botão Model Explorer:

47

Page 49: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Pressione "New Button" para criar um novo botão. • Na opção "Button", especifique "Model Explorer" como título do botão invisível.

• Na opção "Actions", selecione a ação "Menu Command" e pressione o botão "Add".

• Uma lista de comandos pertencentes ao menu aparecerão à direita da janela de

propriedades do botão. Selecione o comando "Tools – Model Explorer" e pressione "Apply".

Crie o botão "Dados do Problema" de forma semelhante, especificando "Goto Page" "Next page" como a ação que o botão deve executar. Crie o botão "Fechar Projeto", especificando sua ação como "Menu Command" "File – Close Project" Se neste momento você colocar a página no modo de usuário, clicando no botão , você perceberá que os botões não serão mostrados. Portanto, você deve criar três objetos de textos referentes a cada um dos botões. Ajuste cada um dos textos exatamente encima de cada um dos botões, para que estes possam ser "visualizados" quando a página for colocada no modo de usuário. Agora sim, você pode colocar a página de abertura no modo de usuário e testar as ações dos novos botões criados. Página "Dados" Vamos construir agora a página onde são mostrados os dados relevantes para o Problema de Corte de Bobinas proposto. Nesta página são mostrados os dados sobre a bobina mestre, as larguras e demandas das bobinas pedidas, informações sobre os padrões de cortes, tais como as perdas de papel e as perdas percentuais em cada um deles. Temos também o Gráfico de Gantt, que nos dá uma visão dos padrões de corte e a perda de papel em uma bobina mestre, assim como os valores das variáveis definidas na estrutura do modelo. A Figura 2.10 mostra como poderia ser uma página de dados para este modelo. A página é composta de um objeto de texto, três tabelas compostas, uma tabela de valores escalares, um Gráfico de Gantt e cinco botões de comando. A seguir, serão fornecidos os passos e as informações necessárias para a construções destes 10 elementos.

48

Page 50: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 2.10 : Página de Dados do modelo "Problema de Corte de Bobinas". Propriedades da página

• Nas propriedades da página, defina "Dados e Resultados do Problema de Corte de Bobinas".

Tabelas Compostas

• Pressione o botão "New Composite Table" para criar uma nova tabela composta.

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

49

Page 51: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

COMPOSITE TABLE: CONTENTS : domain : p columns : PerdaNoPadrao(p) PerdaPercentual(p) COMPOSITE TABLE: CONTENTS : domain : PesoCortadoComPadrao(p) columns : PesoCortadoComPadrao(p)

Escalares

• Pressione o botão "New Scalar" para criar a tabela que contém os identificadores com valores escalares.

CONTENTS : LarguraBobinaMestre VariacaoDemanda

PerdaPercentualTotal PesoTotalBobinaMestre

SCALAR :

layout : Text – Value(s) separator sign : = Você pode renomear os nomes dos identificadores na opção "Text". Para isso, desmarque a opção "Default Text (from Model)" e determine o novo título.

Gráfico de Gantt Antes de construir o Gráfico de Gantt, você deverá executar o procedimento para visualização dos padrões de corte. Para isso, vá ao Model Explorer e clique com o botão direito do mouse sobre o procedimento "VisualizacaoPadroes" e selecione a opção "Run Procedure".

• Para criar um Gráfico de Gantt, pressione o botão "New Gantt Chart" localizado na barra de ferramentas da janela principal do AIMMS.

• Na caixa de diálogo, 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 : Padrão p type of X-axis : Continuous Range grid points : 15 upper : 4500 lower : 0

50

Page 52: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Botões de comando

• Pressione o botão "New Button" para criar os cinco botões de texto. TEXT BUTTON: title : "Descrição do Problema" action : Goto Page Previous Page TEXT BUTTON: title : "Resolver o Problema com Demanda Fixa" action : Run Procedure MainExecution01 Selecionar o procedimento "MainExecution01" através do botão . TEXT BUTTON: title : "Resolver o Problema com Demanda Variável" 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 página e casos iniciais O AIMMS possibilita que você especifique quais são a página e caso que deverão ser inicializados cada vez que um projeto é aberto.

• Selecione a opção "Project Options" no menu "Settings".

• Clique duas vezes sobre o ícone da opção "Project", e selecione a opção "Startup & authorization".

• Especifique "Demanda Fixa" como "Startup case" (ou qualquer outro caso de sua

escolha) e "Descrição do Problema" como "Startup page", como mostra a Figura 2.11.

• Pressione "Apply" e "OK" para fechar a janela de opções. • Grave novamente seu projeto.

51

Page 53: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 2.11 : Janela de declaração do caso e página iniciais.

52

Page 54: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

3. O Problema da produção de sucos 3.1 Introdução Neste problema de Programação Inteira, será modelado o planejamento da produção de produtos obtidos da mistura de sucos de diversos tipos de laranjas, levando em consideração características da produção em si, como gerenciamento de estoque, compra de matérias-primas e produção dos produtos. No contexto da programação do modelo, mostraremos alguns exemplos de como restringir a criação de variáveis e restrições que não devem ser geradas para alguns elementos dentro de um conjunto. Outra novidade bastante prática é a criação de conjuntos com cardinalidade variável, ou seja, o número de elementos no conjunto deixa de ser um número fixo e passa a ser um parâmetro. Abordaremos também o “Listing File”, que é um arquivo de suma importância para a verificação do seu modelo. Nele, estão contidas informações sobre cada variável e restrições geradas na execução do modelo, tais como os valores assumidos e limites máximo e mínimo, nível onde as restrições estão sendo satisfeitas, ou mesmo quais restrições não estão sendo satisfeitas, caso seu modelo esteja infactível. Veremos também como criar procedimentos para inserir, remover e renomear elementos em um conjunto. O AIMMS possui tal recurso, mas é possível criar procedimentos personalizados onde, além de inserir ou remover os elementos, executam outras ações como atualizar dados e confirmar alterações. No contexto da criação de páginas, mostraremos como fazer uso de templates, uma forma de padronizar suas telas, no que diz respeito ao seu aspecto visual. Mostraremo também como, em uma página, criar tabelas nas quais as informações referem-se a um elemento selecionado. Esse recurso é muito útil quando deseja-se representar através de uma tabela as informações contidas em um identificador com mais de dois elementos em seu domínio do índice. As tabelas que representam tais identificadores podem não ser muito claras e fáceis de serem lidas. Quando selecionamos um elemento específico em um dos conjuntos do domínio do identificador, podemos representar a tabela com um índice a menos, o que facilita em muito a sua visualização. 3.2 Descrição do Problema A UniCitrus é uma grande produtora de sucos de laranjas congelados e concentrados, localizada no sul do Brasil. Tais sucos são obtidas através da mistura dos sucos de três variedades de laranjas: Hamlin, Pera e Valência. A companhia compra a produção de plantações selecionadas, processa estas laranjas transformando-as em suco e, finalmente, estes sucos são misturados para a obtenção de dois tipos de produtos: Standard e Dairy. O produto Standard é utilizado na maioria das indústrias de bebidas no mundo todo. Um pouco mais caro, o produto Dairy tem que satisfazer certas condições, como por exemplo, sabor, acidez e cor. O horizonte de planejamento é de 3 meses e a previsão da demanda sobre o horizonte de planejamento é exibida na Tabela 3.1, não existindo custos de penalização caso a demanda não seja completamente atendida.

53

Page 55: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Demanda (ton) no mês Produto 1 2 3

Standard 500 1500 700 Dairy 200 100 100

Tabela 3.1 : Demanda de cada produto para cada mês.

Diferentes variedades de laranjas têm diferentes períodos de maturação e a disponibilidade (em número de caixas) esperada nas regiões de plantações é resumida na Tabela 3.2.

Variedade esperada no mês (em 1000 caixas)

Variedade 1 2 3 Hamlin 300 350 100

Pera 250 350 500 Valncia 0 50 100

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 estão resumidos na Tabela 3.3.

Porcentagem Máxima Porcentagem Mínima

Hamlin Pera Valência Hamlin Pera Valência

Standard 25 100 40 0 60 0

Dairy 30 100 50 0 50 15

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

A matéria-prima produzida em um mês pode ser utilizada para produzir os produtos no mesmo mês ou estocada para uso futuro, a um custo de $10/ton/mês para todas as variedades. O custo de compra, coleta e transporte das frutas para a fábrica é estimado em $1/caixa para todas as variedades. O custo de funcionamento da fábrica é fixo em ½ milhão $/mês e a fábrica não tem restrições de capacidade de processamento e mão-de-obra. A Tabela 3.4 mostra a quantidade de suco (Kg) por caixa de laranja.

Variedade Hamlin Pera Valencia Suco

(Kg/caixa) 3.5 3.7 3.4

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

E finalmente, na Tabela 3.5 temos os preços de venda dos produtos.

Preço de Venda ( $/ton)

Standard 1000 Dairy 1100

Tabela 3.5 : Preço de venda dos produtos.

54

Page 56: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Sabendo-se que os estoques iniciais e finais são zero, formular como um PL e resolver para todo o horizonte de planejamento. 3.3 Formulação Matemática Declaração dos identificadores Inicialmente, declare duas novas seções chamadas “Dados Gerais” e “Procedimentos” na estrutura do modelo, como mostra a Figura 3.1.

Figura 3.1 : Declaração inicial da estrutura do modelo. Em seguida, você pode inserir as declarações e subseções, de forma a organizar a estrutura do modelo, conforme mostra a Figura 3.2.

Figura 3.2 : Declarações e subseções da estrutura do modelo. A seguir, iniciaremos as declarações dos identificadores do modelo, separando-os por seção e declaração. Seção: Dados Gerais Declaração: Dados de Entrada

• Conjunto dos meses do horizonte de planejamento:

No nosso modelo, o horizonte de planejamento é constituído por três meses. Podemos definir o conjunto de meses do horizonte da forma como já conhecemos, ou seja, inserindo elementos do conjunto como “Mês 1”, “Mês 2” e “Mês 3”, por exemplo. Mas suponha agora que em um dado momento, você queria resolver o

55

Page 57: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

mesmo problema, mas com um horizonte diferente. Podemos apresentar algumas opções para que a inserção (ou remoção) desses elementos seja feita. A primeira delas seria inserir os meses faltantes diretamente na página de dados, no formulário de atributos do conjunto dos meses. Esta opção não é muito vantajosa, pois uma das finalidades das páginas que podem ser criadas no AIMMS é permitir que o modelo seja manipulado sem acessar a estrutura do Main Explorer. Além disso, os elementos do conjunto teriam que ser inseridos um a um. A segunda opção seria utilizar um recurso existente no AIMMS, chamado “Selection Object”. Ele é um recurso utilizado nas páginas, 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 é através de procedimentos que podem ser programados para executar a mesma tarefa. Ambos os recursos serão explicados mais adiante, nas seção “Construindo as páginas no AIMMS”. Por fim, vamos à declaração que definirá nosso conjunto de meses. Como no nosso modelo estamos interessados no número de meses que constituem o horizonte de planejamento, e não nos interessa saber exatamente quais são estes meses (pro exemplo, Janeiro ou Fevereiro), apenas nos basta que sejam meses consecutivos. Podemos criar um conjunto de meses não-fixo, declarando os seguintes identificadores: PARAMETER:

identifier : P_Numero_de_Meses_No_Horizonte initial data : 3 ;

SET: identifier : S_Meses

index : MES parameter : Pe_Mes definition : ElementRange(1,P_Numero_de_Meses_No_Horizonte, prefix:"Mês ")

A função ElementRange cria um conjunto contendo um número de elementos igual ao valor assumido pelo parâmetro ‘P_Numero_de_Meses_no_Horizonte’, ou seja, três elementos. Se este parâmetro tiver seu valor alterado, o conjunto também será alterado. O Element Parameter “Pe_Mes” será explicado mais adiante, quando será usado nas páginas para a criação de tabelas que contenham parâmetros e variáveis com três í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

Não se esqueça de inserir os dados referentes a estes dois conjuntos, ok?

56

Page 58: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Demanda máxima (ton) de produto para cada mês: PARAMETER: identifier : P_Demanda index domain : (PROD,MES) ;

• Disponibilidade (unidades) de caixas de cada variedade para cada mês:

PARAMETER: identifier : P_Disponibilidade index domain : (LARAN,MES) ;

• Porcentagens mínima e máxima de suco de cada tipo de laranja no produto, observando e respeitando características 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) ;

• Preço 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 à operação da fábrica: PARAMETER:

identifier : P_Custo_Operacao_Fabrica definition : 500000 ;

57

Page 59: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

A Figura 3.3 mostra a estrutura da Declaração “Dados de Entrada” após todos os identificadores terem sido inseridos.

Figura 3.3 : Declaração “Dados de Entrada”. Seção: Dados Gerais Declaração: Variaveis

• Variável relacionada ao funcionamento da fábrica: Esta variável binária assume valor 1 caso a fábrica esteja ativa no mês e 0, caso contrário.

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 mês:

VARIABLE:

identifier : V_Ton_Suco_Utilizado_no_Produto index domain b: (LARAN,PROD,MES) range : nonnegative ;

• Quantidade (ton) de produto produzido em um dado mês:

VARIABLE: identifier : V_Ton_Produzida index domain : (PROD,MES) definition : sum[LARAN,V_Ton_Suco_Utilizado_no_Produto(LARAN,PROD,MES)] ; Não precisamos declarar o campo “range”, uma vez que ela é função da variável “P_Ton_ Suco_Utilizado_no_Produto”, que só pode assumir valores não-negativos.

58

Page 60: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Neste modelo, supõe-se que todo produto é vendido no mesmo mês em que ele é produzido. Ou seja, não temos produtos em estoque, apenas os sucos processados, que são matérias-primas.

• Quantidade de caixas (unidades) de cada tipo de laranja compradas no mês:

VARIABLE: identifier : V_Caixas_Compradas index domain : (LARAN,MES)

range : {0..inf} } ATENÇÃO: Ao definir o campo “range” de “V_Caixas_Compradas”, lembre-se que se trata de uma variável inteira, pois como ela é definida em unidades, não podemos ter uma solução dada por meia caixa, ou um terço da caixa. Já é provado que a complexidade de problemas lineares inteiros é bem maior que a de problemas não-inteiros, o que significa que o tempo de execução para se resolver o problema é maior, e aumenta de forma não-linear conforme aumenta o número de variáveis. Como nosso modelo é pequeno, esse problema não é facilmente notado.Entretanto, para problemas maiores, é aconselhável procurar uma forma para transformar problemas inteiros em problemas não-inteiros. A sugestão que poderia ser adotada neste modelo seria definir a variável representando o número de caixas compradas em milhares. Assim, se como solução temos o valor ½, compramos 500.000 caixas, por exemplo. Caso o valor fracionário da variável não nos forneça um valor exato em termos da unidade da caixa, um arredondamento nesse número pode ser uma boa saída. Podemos perceber este fato pois teríamos um arredondamento de no máximo 0,9 caixa, na pior das hipóteses.

• Quantidade (ton) de suco processado da cada tipo de laranja em estoque no mês:

VARIABLE:

identifier : V_Estoque index domain : (LARAN,MES) | ord(MES) < card(S_Meses) range : nonnegative 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)] 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 variável refere-se ao estoque de suco processado ao final de cada mês. Pelo enunciado do problema, o estoque do último mês do planejamento deve ser zero. Com a declaração feita no campo “index domain”, garantimos que a variável de estoque será criada apenas para os meses anteriores ao último mês. Podemos traduzir a condição da criação da variável da seguinte forma: poderá haver estoque do suco da laranja no mês, somente se este mês não for o último do planejamento. A função card verifica a cardinalidade de um conjunto, ou seja, o número de elementos do conjunto. A função ord nada mais é do que a posição do elemento no conjunto. Dessa maneira, fica fácil restringir a variável de acordo com o nosso interesse. Por exemplo, suponha que em um período de planejamento,

59

Page 61: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

queremos que os últimos três meses tenham estoque zero. A condição de restrição seria ‘ord(MES) < (card(S_Meses) – 2)’. A variável de estoque pode ser definida de acordo com o mês em questão. Levando em conta que o estoque inicial de sucos é zero, o estoque no primeiro mês é apenas o total de suco obtido com a compra das caixas de laranjas, menos a quantidade que é utilizada para a produção no mês. Caso estejamos em um mês que não seja o primeiro nem o último, o estoque é a quantidade estocada no mês anterior, mais a quantidade obtida com a compra de novas caixas menos a quantidade utilizada para a produção no mês.

• Lucro total obtido, considerando a venda dos produtos, custos de processamento, estoque e operação da fábrica:

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 após as declaração ter sido completada.

Figura 3.4 : Declaração “Variaveis”. Seção: Dados Gerais Declaração: Restricoes e Modelo Matematico

• Restrição de produção: CONSTRAINT: identifier : C_Restricao_de_Producao index domain : (MES) definition : (sum[PROD,V_Ton_Produzida(PROD,MES)]/10^6) < = V_Funciona_Fabrica(MES);

60

Page 62: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Esta restrição nos diz que podemos ter produção apenas nos meses em que a fábrica está em funcionamento. Como já visto anteriormente, a variável “V_Funciona_Fabrica(MES)” só assume valores 0 ou 1. Se a fábrica não está ativa no mês, ou seja, a variável que indica a atividade de fábrica tem valor zero, então toda a produção daquele mês deve ser menor ou igual a zero. Mas como a variável “V_Ton_Produzida(PROD,MES)” é não-negativa, neste caso ela será forçada a assumir valor zero também. Caso a fábrica esteja ativa, estimamos uma constante bem grande (106), de forma que a soma de toda a produção dividida por esta constante seja menor que 1.

• Restrição 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 restrição anterior, apenas podemos comprar caixas de laranjas se a fábrica estiver em operação no mês.

• Restrições de porcentagens mínima e máxima 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 mês, a porcentagem de cada tipo de suco utilizado para compor um produto deve ser maior que a porcentagem mínima da quantidade total do produto, e menor que a porcentagem máxima.

• Restrição de atendimento da demanda: CONSTRAINT: identifier : C_Demanda index domain : (PROD,MES) definition : V_Ton_Produzida(PROD,MES) <= P_Demanda(PROD,MES) ; Como não há custos de penalização caso a demanda não seja completamente atendida, podemos escrever que a tonelagem produzida de cada produto no mês deve ser menor ou igual à demanda.

61

Page 63: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Restrição de disponibilidade no número de caixas de laranjas: CONSTRAINT: identifier : C_Disponibilidade index domain : (LARAN,MES) definition : V_Caixas_Compradas(LARAN,MES) < = P_Disponibilidade(LARAN,MES) ;

• Restrição do Fluxo do suco durante o mês: 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 restrição nos garante o equilíbrio 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 produção ou estoque.

• Restrição de funcionamento da fábrica: CONSTRAINT: identifier : C_Forca_Fabrica_Funcionar definition : sum[MES, V_Funciona_Fabrica(MES)] > = 1 ; Garante que em pelo menos um mês a fábrica estará em funcionamento. Como o custo de operação da fábrica é muito alto, e não há penalização caso a demanda não seja completamente atendida, se não dizemos ao modelo que queremos que a fábrica seja ativada pelo menos uma vez, pode ser que em alguns casos a solução trivial (zero para todas as variáveis) seja a melhor solução. Obviamente, este caso não nos interessa muito…

62

Page 64: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Modelo Matemático: MATHEMATICAL PROGRAM: identifier : MP_Unicitrus objective : V_Lucro_Total direction : maximize type : mip ; É importante lembrar de declarar o tipo de modelo matemático como “mip”, ou seja, “Mixed Integer Program”, pois temos variáveis inteiras e contínuas. Os identificadores declarados são mostrados na Figura 3.5.

Figura 3.5 : Declaração “Restricoes e Modelo Matematico”. Seção: Dados Gerais Declaração: Parametros Pos Rodada Podemos declarar também parâmetros que são definidos a partir das variáveis do nosso modelo. Eles serão usados nas páginas para nos dar algumas informações calculadas após a obtenção da solução 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

Page 65: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

O primeiro parâmetro assume os mesmos valores da variável referente à produção dos produtos. É necessário repassar os valores dessa forma, pois para calcularmos o segundo parâmetro, temos que restringir sua criação apenas para produtos e meses em que a produção foi diferente de zero. Caso contrário, teríamos uma divisão por zero e ocorreria um erro no programa. Essa restrição foi feita no campo “index domain”, ou seja, criamos o parâmetro apenas para os meses e produtos tal que “P_Ton_Produzida(PROD,MES)” existe. Não podemos condicionar a existência de um identificador à existência de uma variável; por isso, o valor é repassado para um parâmetro.

• 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 parâmetro verifica a integridade da mistura, ou seja, se a soma das porcentagens dos sucos utilizados para a produção dos produtos em um dado mês é igual a 1.

• Variação 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 parâmetro mede a diferença entre o total produzido de cada produto e a sua demanda em um dado mês. Já o Element Parameter foi criado para colorir na tabela os dados do parâmetro: se assume valores negativos, os dados são escritos em vermelho, caso contrário são escritos em preto. A Figura 3.6 mostra a estrutura do modelo após a inserção dos parâmetros que são calculados após a execução do programa.

64

Page 66: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 3.6 : Declaração “Parametros Pos Rodada”. Finalmente, vamos declarar o procedimento de execução do programa.

PROCEDURE identifier : MainExecution body : Empty Variaveis; Solve MP_Unicitrus; Ao declararmos o comando “Empty” no corpo de programação do procedimento de execução, estamos garantindo que todas as variáveis contidas na seção “Variaveis” sejam inicializadas com valores iguais a zero. Esta precaução evita que, ao executar o programa novamente, os valores obtidos anteriormente sejam considerados como valores iniciais. Declaração dos procedimentos Como já dito anteriormente neste capítulo, vamos mostrar como realizar operações de inserção e exclusão de elementos em um conjunto. No nosso modelo, vamos criar procedimentos que, antes de realizarem as operações, permitem ao usuário decidir ou não se dá prosseguimento à ação. 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 português. Quando utilizamos o recurso pré-definido do AIMMS, todas as janelas estão escritas em inglês. E se o projeto em questão vai ser apresentado e utilizado por outras pessoas fora o programador, não é 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 explicação sobre as funções utilizadas e as ações de cada comando.

65

Page 67: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Você pode declarar a estrutura da seção “Procedimentos” como mostra a Figura 3.7.

Figura 3.7 : Declaração “Procedimentos”.

A declaração “Parametros” contém dois identificadores que serão utilizados na programação dos procedimentos. “Ps_String_Auxiliar_1” é um identificador do tipo String Parameter, que será utilizado nas páginas para armazenar temporariamente o nome do novo elemento que será inserido no conjunto. O parâmetro “P_Resposta” fará o papel de um indicador, ou seja, assumirá valores 0 ou 1, dependendo se o usuário desejar dar continuidade à ação do procedimento ou não. O valor do parâmetro “P_Resposta” indicará qual parte do procedimento será executada. Para declarar o primeiro identificador, pressione o botão “New Identifier” localizado na 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

Page 68: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Procedimento de inclusão 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 página onde existirão botões para a execução do procedimento de inclusão de um elemento no conjunto de variedades de laranjas, haverá um campo de edição contendo o identificador “Ps_String_Auxiliar_1”, que armazenará o nome da nova variedade de laranja. A primeira ação do procedimento é verificar se este campo foi preenchido ou não. Caso o usuário execute a inserção de um elemento vazio, o procedimento exibirá uma caixa de mensagem de erro, solicitando que o campo seja devidamente preenchido. O usuário fecha a caixa de mensagem e o procedimento volta ao seu início. Caso o campo esteja preenchido, uma caixa de diálogo será exibida, confirmando a inclusão da variedade no modelo. A função DialogAsk retorna valores numéricos, dependendo da opção escolhida. No nosso caso, as opções são incluir ou não a nova variedade de laranja no modelo. Na caixa de diálogo, se o botão referente à opção incluir for pressionado, a função retornará valor 1; caso a opção seja cancelar a operação, o valor retornado será 2. Há nesta linha de programação uma atribuição, ou seja, o parâmetro “P_Resposta” assume o valor retornado pela função DialogAsk. A função FormatString permite utilizar a informação contida na string juntamente com o texto que aparecerá na caixa de diálogo. Esta informação será inserida na posição ocupada pelos caracteres “%s”. Continuando, caso a opção “Incluir” seja selecionada, a função StringToElement irá verificar se o elemento contido na string “Ps_String_Auxiliar_1” já existe no conjunto de variedades de laranjas ou não. A função retorna o elemento caso ele exista e retorna vazio, caso contrário. Se o elemento já existir no conjunto, uma mensagem de erro é exibida, alertando o usuário de que este elemento não poderá ser inserido no conjunto. Caso o elemento não exista, a função SetElementAdd adiciona o novo elemento ao conjunto.

67

Page 69: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Você pode obter mais informações sobre funções do AIMMS através do manual contido no arquivo “AIMMS_func.pdf”, que é instalado juntamente com o programa. Para cada função pré-existente do AIMMS, o manual detalha os tipos de argumentos utilizados em sua declaração, os valores de retorno da função, caso existam, além de citar referências a outras funções relacionadas com o assunto da função em questão. Uma maneira de acessar este arquivo é pressionar o botão direito do mouse sobre a função, e selecionar a opção “Help on”, conforme mostra a Figura 3.8.

Figura 3.8 : Obtendo informações sobre as funções do AIMMS. Além do manual sobre funções, o AIMMS possui outros manuais que são de grande utilidade tanto para aprendizagem como para consulta. Os arquivos deste manuais encontram-se dentro do diretório de nome “Paragon Decision Technology”, conforme mostra a Figura 3.9.

Figura 3.9 : Arquivos contendo os manuais do AIMMS.

68

Page 70: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Procedimento de exclusão 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á excluída."); ENDIF; Na página 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 parâmetro “Pe_Laran” for diferente de vazio, então o procedimento oferece duas opções: excluir ou não este elemento do conjunto de variedades de laranjas. A declaração “ - =” indica que o novo conjunto de variedades de laranjas S_Laranjas é o conjunto que se tinha anteriormente menos o elemento contido no parâmetro Pe_Laran que foi selecionado para ser excluído. Procedimento de verificação dos dados para inclusão de variedade de laranja Este procedimento tem como finalidade verificar se o novo elemento foi adicionado ao conjunto antes que o usuário feche a página 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 não foi incluída 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 inclusão de uma variedade de laranja, você poderá perceber que depois de executado, a string “Ps_String_Auxiliar_1” tem sua informação apagada. Caso a informação ainda esteja contida na string no momento em que a página for fechada, isto significa que o procedimento de inclusão não foi executado. Este procedimento de verificação alerta o usuário de que o elemento não foi incluído no conjunto, e oferece a opção de cancelar a operação de inclusão. Os caracteres “\n” fazem o mesmo papel da tecla “ENTER”, ou seja, posicionam o início do texto subsequente na linha inferior na caixa de mensagem.

69

Page 71: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Procedimento de verificação dos dados para exclusão de variedade de laranja De maneira análoga ao procedimento anterior, a exclusão de elementos em um conjunto tem seus dados verificados no momento em que a página for fechada. PROCEDURE identifier : Proc_Bt_Verifica_Dados_Exclusao_Variedade body : IF [Pe_Laran <> ''] THEN DialogMessage(FormatString("A variedade de laranja %e não foi excluída 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 renomeação 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

Page 72: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Procedimento de verificação dos dados para renomeação de variedade de laranja PROCEDURE identifier : Proc_Bt_Verifica_Dados_Renomeia_Variedade body : IF [Ps_String_Auxiliar_1 <> ""] THEN DialogMessage(FormatString("O produto %e não 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 inclusão e exclusão dos produtos são análogos aos procedimentos referentes às variedades de laranjas. Procedimento de inclusão 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

Page 73: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Procedimento de exclusão 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á excluído."); ENDIF; Procedimento de verificação dos dados para inclusão de produto PROCEDURE identifier : Proc_Bt_Verifica_Dados_Inclusao_Produtos body : IF [Ps_String_Auxiliar_1 <> ""] THEN DialogMessage(FormatString("O produto %s não foi incluído 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 verificação dos dados para exclusão de produto PROCEDURE identifier : Proc_Bt_Verifica_Dados_Exclusao_Produtos body : IF [Pe_Prod <> ''] THEN DialogMessage(FormatString("O produto %e não foi excluído 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

Page 74: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Procedimento para renomeação 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 verificação dos dados para renomeação de produtos PROCEDURE identifier : Proc_Bt_Verifica_Dados_Renomeia_Produto body : IF [Ps_String_Auxiliar_1 <> ""] THEN DialogMessage(FormatString("O produto %e não 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

Page 75: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

3.4 Criando páginas com o uso de templates. Templates Conforme os modelos vão ficando maiores e complexos, é inevitável que o número de páginas necessárias para uma boa apresentação da modelagem e resultados aumente. O template é uma forma de manter o mesmo padrão de cores, disposição e ações de objetos para diversas páginas, sem que tenham que ser feitas uma a uma. Ou seja, todas as páginas que são construídas sob a estrutura de um dado template sempre possuem as mesmas características. Neste modelo temos apenas 3 páginas, mas é o suficiente para ilustrar o funcionamento do template.

• Na estrutura do modelo, pressionar o botão “Template Manager” ou pressione Alt + F9.

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

Figura 3.10 : Criação de um novo template.

No AIMMS, além das cores definidas pelo sistema, você pode personalizar suas próprias cores, através do menu “Tools” “User Colors”.

• Pressionar o botão “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 usuário com duas novas cores, “Fundo Padrão 1” e “Fundo Padrão 2” .

Figura 3.11 : Criação de cores personalizadas.

74

Page 76: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Quando você quiser utilizar as cores personalizadas, a opção “user” deverá ser selecionada na opção “colors”, nas caixas de diálogo das propriedades das páginas e objetos, como mostra a Figura 3.12.

Figura 3.12 : Utilização das cores personalizadas. A Figura 3.13 mostra o template utilizado neste modelo. Ele é dividido em duas áreas, a da esquerda para a exibição dos dados do modelo e a da direita, que é sempre ocupada com um menu. Este menu acessa três páginas, o arquivo do Listing File e contém outros dois botões com ações: execução e parada de execução do programa

Figura 3.13 : Exemplo de template com menu.

75

Page 77: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

No canto superior esquerda da janela principal temos o título do projeto. Como padrão, este título 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 opção “Project Title” e especifique o nome do projeto no

campo de edição, conforme mostra a Figura 3. 14.

Figura 3.14 : Especificando o título de um projeto no AIMMS.

• Crie três novas páginas através do “Page Manager”, localizado na estrutura do modelo, conforme mostra a Figura 3. 15.

Figura 3.15 : Criação das páginas utilizadas no modelo.

• Em seguida, abra novamente a janela do “Template Manager” e perceba que ele possui todas as páginas que foram previamente criadas no “Page Manager”. O próximo passo é clicar duas vezes sobre o ícone do template para abrir sua estrutura e inserir as três páginas, conforme mostra a Figura 3.16. Para inserir as páginas, pressione o botão esquerdo no mouse sobre o nome da página e, mantendo-o pressionado, arraste a página para cobrir o campo onde, no momento, está escrito “Empty”.

76

Page 78: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 3.16 : Inserindo as páginas dentro da estrutura de um template.

Botões Voltando ao template, você deverá criar dois tipos de botões: Botões com bitmap

• Criar dois “bitmap button”, um para executar o programa e o outro, para cancelar a execução. Estes botões estão localizados no canto inferior direito do template.

• É aconselhável o uso de bitmaps que estejam gravados dentro do projeto do

AIMMS. Você consegue importar bitmaps através do menu “Tools” “Project User Files”. No momento de determinar qual será o bitmap utilizado no botão, selecione a opção “Select Project File”.

• Na caixa de diálogo das propriedades do botão de execução do programa, você

deverá definir as ações: - Menu Command Run – Delete Listing File - Run Procedure MainExecution - Menu Command Window – Progress Window

• Para o botão de parada de execução, declare a ação Menu Command Run – Stop.

Botões invisíveis

• Criar três botões invisíveis, que serão utilizados para acessar as páginas “Cadastro”, “Dados Gerais” e “Resultados”.

• Na seção “Actions” da caixa de diálogo das propriedades do botão, selecione a

opção “Linked Page(s)” e pressione “Add”.

• No lado direito da caixa, pressione o botão para selecionar a página desejada.

• Outra ação que também devemos declarar é “Close Page”, caso contrário, ficaremos com várias páginas abertas ao mesmo tempo. Para alterar a ordem das ações declaradas, utilize os botões e . A Figura 3.17 mostra a caixa de diálogo para o botão que a acessa a página “Cadastro”.

77

Page 79: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 3.17 : Adicionando link entre páginas.

• Para o botão que acessa o Listing File, a ação declarada deve ser Menu Command File Open Listing File.

3.5 As páginas do modelo Página: “Cadastro” Antes de passarmos para a construção da página de Cadastro, vamos criar as páginas onde serão executados os procedimentos de inclusão e exclusão de elementos em um conjunto. Estas páginas devem ser diferenciadas, pois serão chamadas a partir da página principal e fechadas logo após a execução do procedimento ter sido concluída. A diferenças dessas páginas estão no seu tamanho (que será bem reduzido, como uma espécie de caixa de diálogo) e no fato que elas só poderão ser fechadas através de um botão que fará a verificação do procedimento, e não da maneira convencional como fechamos as janelas com as quais trabalhamos diariamente. Primeiramente, vamos criar a caixa de diálogo para inclusão de uma variedade de laranja. A Figura 3.18 mostra um exemplo de como esta caixa poderia ser.

Figura 3.18 : Caixa de diálogo para inclusão de uma variedade de laranja.

78

Page 80: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Criar uma nova página chamada “Box – Adiciona_Variedade”. • Redimensionar esta página, para que fiquei parecendo uma caixa de diálogo.

• Nas propriedades da página, defina o título da página como “Incluir Variedade”,

selecione a opção “Behaves as Dialog” e na opção “System Menu Close” selecione a ação “Ignore”.

• Criar um campo de edição através do objeto “New Scalar”, onde o nome da nova

variedade será inserido.

• Crie o botão que executará o procedimento de inclusão “Proc_Bt_Incluir_Variedade” e o que executará o procedimento “Proc_Bt_Verifica_Dados_Inclusão_Variedade” para verificação dos dados.

Para criar a caixa de diálogo onde o procedimento de exclusão será executado, podemos fazer uma cópia da página “Box – Adiciona_Variedade” e modificar poucas coisas. Isso poupará tempo e permitirá que as caixas de diálogo fiquem com seu aspecto padronizado.

• Selecionar a página “Box – Adiciona_Variedade” e pressionar as teclas “Ctrl + C” seguidas das teclas “Ctrl + V”. Você também pode utilizar os comando “Copy” e “Paste” do menu “Edit”.

• Clicar com o botão direito do mouse sobre a cópia e selecionar a opção “Rename”,

ou pressionar F2. Com isso, o nome da página entrará em modo de edição. Renomear a página como “Box – Remove_Variedade”.

• Abrir a nova página em modo de edição. Modificar o título da página para “Excluir

Variedade”, na caixa de diálogo das propriedades da página.

• Excluir o objeto “Scalar”. Pressionar o botão “New Selection Object” localizado na barra de ferramentas da janela principal do AIMMS e selecionar as opções conforme mostra a Figura 3.19.

Figura 3.19 : Declaração de “ New Selection Object”.

79

Page 81: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Associar a execução do procedimento “Proc_Bt_Excluir_Variedade” no botão com sinal menos (-) e “Proc_Bt_Verifica_Dados_Exclusao_Variedade” para checar os dados na hora do fechamento da página.

A Figura 3.20 mostra a caixa de diálogo onde a exclusão de elementos em um conjunto é efetuada.

Figura 3.20 : Caixa de diálogo para exclusão de uma variedade de laranja. Para o conjunto de variedades de laranjas, falta criar apenas a página para renomear os elementos. Essa nova caixa de diálogo pode ser facilmente obtida se copiarmos a caixa de exclusão de variedade.

• Depois de copiar a caixa de diálogo de exclusão 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” e

“Proc_Bt_ Verifica_Dados_Renomeia_Variedade”.

A Figura 3.21 mostra a página onde o procedimento de renomeação será executado.

Figura 3.21 : Caixa de diálogo para renomeação de uma variedade de laranja. De maneira análoga, as caixas de diálogos para inclusão, exclusão e renomeação dos elementos do conjunto de produtos podem ser criadas a partir das caixas existentes para o conjunto de variedade de laranjas. As alterações necessárias são 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 páginas. Se você inserir as páginas de inclusão, exclusão e renomeação de elementos em um conjunto, como subnós da árvore formada pela página “Cadastro”, conforme mostra a

80

Page 82: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Figura 3.22, podemos dar a entender que estas páginas apenas são acessadas a partir da página “Cadastro”. A disposição das páginas como nós de uma estrutura tipo “árvore” também são úteis na hora de atribuir links entre páginas “pai” e “filho”, sem que haja a necessidade de especificar exatamente o nome da página em questão, como foi feito até agora.

Figura 3.22 : Organizando as páginas de um projeto. Com as caixas de diálogo criadas, apenas nos falta criar duas tabelas contendo os elementos dos conjuntos de variedades de laranjas e produto, para a criação da página de cadastro do modelo, conforme a Figura 3.23.

Figura 3.23 : Exemplo de uma página de cadastro.

81

Page 83: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Criar três botões com bitmap para acessar as páginas 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 página de cadastro onde os procedimentos são utilizados. Caso você deseje utilizar o recurso do AIMMS para efetuar as operações sobre os elementos dos conjuntos, a página de cadastro seria mais ou menos como a exibida pela Figura 3.24.

Figura 3.24 : Página de cadastro com utilização do recurso do AIMMS para efetuar operações sobre conjuntos.

• Criar um novo “Selection Object”, escolhendo “Multiple Item Selection”

“Listbox” “Set” “S_Laranjas”.

• Na seção “Selection” da caixa de diálogo das propriedades do objeto, selecionar as opções “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

Page 84: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Para incluir um elemento no conjunto, digite o novo nome na linha de edição e pressione o botão "Add New Data" . Para remover, selecione um elemento na lista e pressione o botão "Delete Data" . Página: “Dados Gerais” Na página “Dados Gerais” colocaremos todas as informações do modelo contidas em parâmetros. A Figura 3.27 exibe o exemplo de uma página “Dados Gerais”.

Figura 3.27 : Página “Dados Gerais”.

• Criar objetos do tipo “Scalar” para exibir as informações contidas nos parâmetros “P_Numero_de_Meses_no_Horizonte” “P_Preco_de_Estoque” “P_Custo_de_Processamento” “P_Custo_Operacao_Fabrica”.

• Criar tabelas para exibir as informações contidas nos parâmetros

“P_Demanda(PROD,MÊS)” “P_Disponibilidade(LARAN,MÊS)” “P_Rendimento(LARAN)”.

• Para o preço de venda dos produtos, criar uma tabela composta, contendo o

parâmetro “P_Preco_de_Venda(PROD)” no domínio e na coluna da tabela. • Já para as porcentagens mínima e máxima de cada suco no produto, criar um novo

“Selection Object” com as seguintes propriedades: Drop Down List Element Paramenter Pe_Prod.

83

Page 85: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• Criar uma tabela contendo os parâmetros “P_Porcentagem_Minima(LARAN,PROD)” e “P_Porcentagem_Maxima(LARAN,PROD)”. A seguir, na caixa de diálogo das propriedades da tabela, abrir a pasta “Contents” e selecionar o primeiro parâmetro. Pressionar o botão “Modify” “Avançar”. No lado esquerdo da nova janela com título “Identifier”, selecione o índice “PROD”. No lado direito, você deve selecionar a opção “Element Parameter” e escolher “Pe_Prod” como este elemento. Repetir o procedimento para o outro parâmetro. Com isso, os dados da tabela serão referentes apenas ao parâmetro que estiver selecionado no “Selection Object”.

Página: “Resultados” A Figura 3.28 mostra a página que contém as informações das variáveis e parâmetros pós-rodada do modelo.

Figura 3.28 : Página “Resultados”.

• Criar uma tabela para a variável “V_Funciona_Fabrica(MÊS)”. Na pasta “Format” selecionar a opção “0-1 Values”.

• Na tabela de variação no atendimento da demanda, ao escolher a cor do parâmetro

“P_Variacao_Atendimento_Demanda(PROD,MÊS)”, selecionar “Model” para especificar que a cor utilizada está declarada no modelo, e a seguir selecione o element parameter “Pe_Cor_Excesso_producao(PROD,MÊS)”, conforme mostra a Figura 3.29.

84

Page 86: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

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_Mês”. Em cada uma das tabelas, modificar os identificadores para que estejam relacionados a este elemento, e não a um índice fixo.

3.6 Listing File O AIMMS produz uma saída padrão para cada execução de procedimentos e cada solução dos programas matemáticos. O nome destas listagens é o nome base do modelo com a extensão “.lis”. As saídas são geradas opcionalmente na primeira execução numa sessão ou dependendo das opções podem ser também geradas durante uma execução subsequente, após cada atualização dos parâmetros e variáveis. Uma saída padrão pode conter um ou mais dos seguintes componentes:

• “source listing” – O código fonte como compilado. • “constraint listing” – uma saída aonde consta cada restrição do programa

matemático. • “solution listing” – os valores das soluções para cada uma de suas variáveis e

restrições. • “solver status file” – o processo de solução. • alguma saída que tenha sido gerada por um comando PUT ou DISPLAY dentro do

modelo.

O procedimento padrão do AIMMS é não gerar estas saídas, para que o processo de solução não seja sobrecarregado, tornando-se lento. No entanto, caso seja necessário, você pode determinar que o AIMMS gere qualquer uma dessas saídas. No nosso caso, estamos interessados em gerar o Listing File. Nele, teremos informações sobre as variáveis, parâmetros, restrições e factibilidade do modelo.

85

Page 87: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

• No menu "Settings", selecione a opção "Project Options". • Selecione as pastas "Solvers general" "Standard reports" "Constraints",

como mostra a Figura 3.30.

Figura 3.30 : Gerando o listing File.

• Marque o campo "At every solve" para as três opções, "Constraints", "Solution" e "Solver especific".

Já foi especificado nas páginas, através dos botões, que um Listing File seja apagado antes de uma execução do programa e um modo de abrir tal arquivo. Caso você queira executar estes procedimentos através do menu, você deverá:

• Selecionar a opção "Delete Listing File" no menu "Run". Dessa maneira, toda informação 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 opções "Open" "Listing File" no menu "File".

A seguir, mostraremos algumas informações do Listing File do modelo Unicitrus. Na primeira parte, vemos o valor da variável que compõe a função objetivo e seus limites inferior e superior. Também temos o status da variável, dizendo se ela é básica ou não, e se ela está situada em um dos seus limites ou não.

86

Page 88: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Como a variável “V_Funciona_Fabrica(MES)” é binária, ela sempre estará em um dos seus limites.

Podemos ver pelas informações abaixo que as variáveis “V_Estoque(LARAN,MES)” no mês 3 não foram criadas. Este é o resultado da restrição imposta sobre o domínio do índice no momento da geração das variáveis. No nosso modelo, apenas três variáveis deixaram de ser criadas, mas em outras situações, esse número pode ser efetivamente muito maior, evitando que a processo de execução do programa e obtenção de uma resposta para o problema tornem-se demorados demais.

87

Page 89: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

Abaixo, temos um exemplo de como as informações sobre as restrições são exibidas pelo Listing File. Cada uma das restrições é descrita em função dos índices para os quais ela existe e de sua definição. O valor de lhs representa o nível onde a restrição está sendo satisfeita. Podemos traduzir a informação abaixo da seguinte maneira: pela definição da variável, temos que a soma das tonelagens de produtos produzido durante o mês, multiplicado pelo fator 106 deve ser menor que 1. A restrição está sendo satisfeita no nível zero, pois as variáveis que fazem parte dessa restrição, com exceção de “V_Funciona_Fabrica( Mês 1)” assume valor zero.

Temos também a definição da variável que representa a função objetivo, assim como os valores das variáveis que fazem parte dessa definição. ---- V_Lucro_Total_definition V_Lucro_Total_definition .. [ 1 | 80 | after ] + 500000 * V_Funciona_Fabrica(Mês 1) + 500000 * V_Funciona_Fabrica(Mês 2) + 500000 * V_Funciona_Fabrica(Mês 3) - 1000 * V_Ton_Produzida(Standard,Mês 1) - 1000 * V_Ton_Produzida(Standard,Mês 2 ) - 1000 * V_Ton_Produzida(Standard,Mês 3) - 1100 * V_Ton_Produzida(Dairy,Mês 1) - 1100 * V_Ton_Produzida(Dairy,Mês 2) - 1100 * V_Ton_Produzida(Dairy,Mês 3) + 1 * V_Caixas_Compradas(Hamlin,Mês 1) + 1 * V_Caixas_Compradas(Hamlin,Mês 2) + 1 * V_Caixas_Compradas(Hamlin,Mês 3) + 1 * V_Caixas_Compradas(Pera,Mês 1) + 1 * V_Caixas_Compradas(Pera,Mês 2) + 1 * V_Caixas_Compradas(Pera,Mês 3) + 1 * V_Caixas_Compradas(Valência,Mês 1)

88

Page 90: Índice Introdução 1 1. O Problema das Calças e das Camisas 2moretti/ms428/Tutorial AIMMS.pdf · Índice introdução 1 1. o problema das calças e das camisas 2 1.1 introduÇÃo

+ 1 * V_Caixas_Compradas(Valência,Mês 2) + 1 * V_Caixas_Compradas(Valência,Mês 3) + 10 * V_Estoque(Hamlin,Mês 1) + 10 * V_Estoque(Hamlin,Mês 2) + 10 * V_Estoque(Pera,Mês 1) + 10 * V_Estoque(Pera,Mês 2) + 10 * V_Estoque(Valência,Mês 1) + 10 * V_Estoque(Valência,Mês 2) + 1 * V_Lucro_Total = 0 ; (lhs=0) Name lower level upper V_Funciona_Fabrica(Mês 1) 0 0 1 V_Funciona_Fabrica(Mês 2) 0 1 1 V_Funciona_Fabrica(Mês 3) 0 1 1 V_Ton_Produzida(Standard,Mês 1) -inf 0 inf V_Ton_Produzida(Standard,Mês 2) -inf 1500 inf V_Ton_Produzida(Standard,Mês 3) -inf 700 inf V_Ton_Produzida(Dairy,Mês 1) -inf 0 inf V_Ton_Produzida(Dairy,Mês 2) -inf 100 inf V_Ton_Produzida(Dairy,Mês 3) -inf 100 inf V_Caixas_Compradas(Hamlin,Mês 1) 0 0 inf V_Caixas_Compradas(Hamlin,Mês 2) 0 82857 inf V_Caixas_Compradas(Hamlin,Mês 3) 0 1 inf V_Caixas_Compradas(Pera,Mês 1) 0 0 inf V_Caixas_Compradas(Pera,Mês 2) 0 349999 inf V_Caixas_Compradas(Pera,Mês 3) 0 212161 inf V_Caixas_Compradas(Valência,Mês 1) 0 0 inf V_Caixas_Compradas(Valência,Mês 2) 0 4413 inf V_Caixas_Compradas(Valência,Mês 3) 0 4412 inf V_Estoque(Hamlin,Mês 1) 0 0 inf V_Estoque(Hamlin,Mês 2) 0 0 inf V_Estoque(Pera,Mês 1) 0 0 inf V_Estoque(Pera,Mês 2) 0 0 inf V_Estoque(Valência,Mês 1) 0 0 inf V_Estoque(Valência,Mês 2) 0 0 inf V_Lucro_Total -inf 766157 inf Por fim, o Listing File apresenta um resumo do número de restrições e variáveis contidas no modelo. These are the first model statistics of MP_Unicitrus. Symbolic Individual Constraints 11 80 (0 infeasible) Variables 6 43 (0 frozen) Elements 24 217

89