aplicação comercial de otimização de funções usando método de solução simplex, com foco em...
DESCRIPTION
Eficiˆencia e confiabilidade de resultado s˜ao as duas caracter´ısticas procuradas com maior frequˆencia nos softwares atualmente. Desenvolvedores de software est˜ao cada vez mais preocupados em melhorar estes dois pontos nos produtos que oferecem. Para sistemas que trabalham com volume grande de dados e com necessidade de apresentar resposta r´apida e precisa ao usu´ario, os desenvolvedores est˜ao `a procura de algoritmos que tragam esta caracter´ıstica. Os algoritmos matem´aticos que oferecem a modelagem de dados est˜ao sendo cada vez mais procurados para atingir este objetivo. Este trabalho aplica o algoritmo Simplex em uma situa¸c˜ao comum do cotidiano de uma software house , mostrando a usabilidade da modelagem matem´atica para solu¸c˜ao de problemas complexos.TRANSCRIPT
Universidade Estadual de Campinas - UNICAMP Centro Superior de Educacao
Tecnologica - CESET
Aplicacao comercial de otimizacaode funcoes usando metodo desolucao Simplex, com foco em
sistemas de saude nutricional edietetica
Vanessa Oliveira Campos
Limeira
2007
i
Universidade Estadual de Campinas - UNICAMP Centro Superior de Educacao
Tecnologica - CESET
Aplicacao comercial de otimizacaode funcoes usando metodo desolucao Simplex, com foco em
sistemas de saude nutricional edietetica
Vanessa Oliveira Campos
Trabalho de Graduacao Interdisciplinar (TGI)
apresentado ao Centro Superior de Educacao Tecnologica
- CESET como requisito de conclusao do Curso de
Tecnologia em Informatica.
Orientador: Marli Gomes de Freitas Hernandes
Limeira
2007
ii
Aos meus amigos Elaine, Fernando e Marcela, e a minha irma Lılian.
iii
”Quis custodiet ipsos custodes?”
Juvenal
iv
Sumario
Lista de figuras v
Resumo (Abstract) 1
1 Introducao 2
2 Metodologia e tecnologias envolvidas 3
3 Solucao do problema 8
4 Conclusao 26
Glossario 27
Referencias Bibliograficas 30
v
Lista de Figuras
Figura 1: Dependencia entre os pacotes do Agenda Nutricional . . . . . . . . . . 12
Figura 2: Diagrama de Pacotes: Agenda Nutricional: negocios . . . . . . . . . . 13
Figura 3: Diagrama de Pacotes: Agenda Nutricional: persistencia . . . . . . . . 14
Figura 4: Modelo de dados para os produtos e nutrientes . . . . . . . . . . . . . 15
Figura 5: Exemplo de relacao entre as informacoes, no modelo de dados proposto 15
Figura 6: Agenda Nutricional: Controle de multiplas janelas internas . . . . . . 17
Figura 7: Agenda Nutricional: Janela padrao de consulta de registros . . . . . . 18
Figura 8: JMPS: O problema do prototipo: quadro inicial do Simplex . . . . . . 19
Figura 9: JMPS: O problema do prototipo: primeira iteracao . . . . . . . . . . . 20
Figura 10: JMPS: O problema do prototipo: pivoteamento da linha . . . . . . . 20
Figura 11: JMPS: O problema do prototipo: ajuste das demais linhas da tabela 20
Figura 12: JMPS: O problema do prototipo: primeira iteracao finalizada . . . . 20
Figura 13: JMPS: O problema do prototipo: resultado otimo . . . . . . . . . . . 20
Figura 14: JMPS: Solucao do problema atraves do metodo Grafico . . . . . . . . 21
Figura 15: JMPS: Edicao de problema de otimizacao . . . . . . . . . . . . . . . 21
Figura 16: Estrutura interna do sistema JMPS . . . . . . . . . . . . . . . . . . . 22
Figura 17: Pacote calculo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1
Resumo (Abstract)
Eficiencia e confiabilidade de resultado sao as duas caracterısticas procuradas com
maior frequencia nos softwares atualmente. Desenvolvedores de software estao cada vez
mais preocupados em melhorar estes dois pontos nos produtos que oferecem. Para sistemas
que trabalham com volume grande de dados e com necessidade de apresentar resposta
rapida e precisa ao usuario, os desenvolvedores estao a procura de algoritmos que tragam
esta caracterıstica.
Os algoritmos matematicos que oferecem a modelagem de dados estao sendo cada vez
mais procurados para atingir este objetivo. Este trabalho aplica o algoritmo Simplex em
uma situacao comum do cotidiano de uma software house, mostrando a usabilidade da
modelagem matematica para solucao de problemas complexos.
2
1 Introducao
Todos os dias vemos novas tecnologias surgirem, se aprimorarem. Com elas vem o ciclo
vicioso de aprimoramento de hardware e software. Novas teorias de todas as disciplinas da
area de exatas sao utilizadas na computacao, auxiliando neste aprimoramento contınuo.
O software faz parte de uma tendencia de evolucao constante. A Engenharia de
software esta constantemente se aperfeicoando, de forma a trazer cada vez mais tecnica
e metodos eficazes para melhorar o desempenho tanto do processo de desenvolvimento
quanto do software em si.
Desta forma, a matematica e a informatica se unem para trazer o que existe de melhor
em cada e traduzir tudo isto em um software de qualidade, que atenda nao somente as
necessidades do usuario, mas que utilize todo o potencial de hardware disponıvel atual-
mente. Fundacoes como a Computational Infrastructure for Operation Research , COIN-
OR, trabalham na criacao e disseminacao de solucoes computacionais para problemas
matematicos.
Este trabalho propoe demonstrar em uma aplicacao comercial, focada na area de saude,
mais especificamente em nutricao e dietetica, o uso de metodos e modelos matematicos
simples para solucionar problemas de calculos complexos; neste caso, otimizacao de prob-
lemas lineares.
A proposta e desenvolver um sistema que se utilize de um metodo de otimizacao
linear, o metodo Simplex, para calcular a quantidade de n produtos compondo uma
dieta nutricional, de acordo com a composicao nutricional de cada produto selecionado
para a dieta. O sistema utiliza dietas de referencia, que sao compostas por nutrientes em
quantidades especıficas, para calcular as quantidades de cada produto necessarios a suprir
a ingestao mınima ou maxima de nutrientes da dieta de referencia.
Este trabalho esta organizado em dois capıtulos: Metodologia e tecnologias envolvidas,
que descreve o modelo matematico escolhido (Simplex) e as tecnologias utilizadas no
desenvolvimento do sistema; Solucao do Problema, subdividindo em secoes que descrevem
o problema selecionado no projeto, a metodologia utilizada para desenvolver o sistema e
integrar os componentes selecionado. O trabalho ainda conta com Introducao, Conclusao,
Glossario e Referencias Bibliograficas.
3
2 Metodologia e tecnologias envolvidas
2.1 O problema
A popularizacao do computador pessoal trouxe consigo uma necessidade de evolucao
do hardware e do software que atingiu largamente todos os nıveis da sociedade - desde
o ambiente domestico, com o largo uso do microcomputador para jogos e home office,
ate o ambiente do escritorio - independente do setor economico da empresa (industria,
comercio e governo). Com a constante adaptacao do software aos servicos disponıveis e
dos servicos aos softwares, criou-se um mercado virtualmente infinito para a producao de
software.
Atualmente, o mercado de software personalizado - software desenvolvido para um fim
especıfico, em contrapartida ao software de prateleira, feito com caracterısticas genericas
e distribuıdo em larga escala - tem apresentado um crescimento muito atrativo, que se
mostra com o grande numero de empresas desenvolvedoras de software que surgem a cada
ano. Com o mercado aberto a novos sistemas e a competicao causada pelo numero de
empresas especializadas, possuir um diferencial e importante.
Os softwares produzidos atualmente, de forma personalizada, possuem como requisitos
as regras do negocio do cliente, suas necessidades particulares. Sistemas de controle tem
dominado a demanda no mercado, pois sao servicos cruciais dentro das empresas, e estes
sistemas demandam, muitas vezes, calculos complexos envolvendo multiplas variaveis. A
demanda constante por performance e velocidade de resposta, aliada a pressao de cumprir
cronogramas apertados e o baixo conhecimento da equipe de desenvolvimento em solucoes
computacionais complexas, levam a utilizacao de calculos aproximados com altas taxas
de erro.
2.2 Programacao linear e metodo Simplex
A programacao linear apresenta uma solucao de baixo custo computacional e com
reducao da margem de erro para problemas de otimizacao com multiplas variaveis, como
e o caso de inumeros sistemas de controle - almoxarifado, financas, producao, etc.
4
A programacao linear consiste em problemas de otimizacao que utilizam funcoes lin-
eares. Existem casos tıpicos de programacao linear, como o Problema de Transporte,
que foi utilizado inicialmente para determinar o menor custo de transporte entre diversas
fabricas de um produto e diversos centros consumidores [6]. Situacoes tıpicas de aplicacao
da programacao linear sao os casos onde se deseja, por exemplo, maximizar o lucro de
uma empresa, minimizar o custo de producao de um determinado produto, etc.
A programacao linear utiliza-se de um modelo matematico composto por uma funcao
objetiva e de restricoes tecnicas representadas por inequacoes. Por exemplo:
Lucro = 2x1 + 3x2 (2.1)
Restricoes
tecnicas
4x1 + 3x2 ≤ 10
6x1 − x2 ≥ 20
de nao negatividade
x1 ≥ 0
x2 ≥ 0
(2.2)
Neste modelo, encontramos os seguintes elementos:
• Variaveis de decisao: sao as variaveis que representam as decisoes a serem
tomadas. Por exemplo, em uma fabrica onde se deseja otimizar a producao para
maximizar o lucro, as variaveis de decisao representarao os produtos que ela produz.
No exemplo acima, as variaveis de decisao sao x1 e x2.
• Funcao objetivo: representa o objetivo do modelo. No nosso exemplo, maximizar
o lucro.
• Restricoes: sao representadas por inequacoes lineares e identificam as situacoes
que impoem limitacoes ao modelo. Existem dois tipos de restricoes: tecnicas, por
exemplo, quantidades mınimas que devem ser produzidas de um produto; e de nao
negatividade, que impedem que os valores encontrados para as variaveis de decisao
sejam negativos (nao e possıvel produzir -20 pecas).
Para solucionar os problemas de programacao linear existem diversos algoritmos defini-
dos, como Gauss-Jordan e Simplex. Estes algoritmos e suas variantes definem passos e
pontos de parada para o calculo de problemas de otimizacao. Neste trabalho, optamos
por utilizar o algoritmo Simplex para solucionar os problemas de otimizacao propostos.
5
O Simplex e o algoritmo basico da programacao linear. Seu objetivo e transformar
uma matriz fornecida em outra padronizada, de acordo com a necessidade do problema.
A matriz fornecida e criada a partir das equacoes geradas de otimizacao e restricoes.
Utilizando o exemplo anterior, a matriz inicial ficaria:
4 3 10
6 −1 20
(2.3)
O Simplex soluciona o problema atraves de inumeras iteracoes, onde a cada iteracao
ocorre o pivotamento da matriz. Terminam-se as iteracoes quando a matriz atinge o
estado otimo, ou seja, quando atingem-se valores para as variaveis dentro de faixas pre-
estabelecidas. Por exemplo, num problema de maximizacao, quando todas as variaveis
encontraram-se com valores maiores ou iguais a zero, identifica uma matriz otima.
Para exemplificar o funcionamento do algoritmo Simplex, usaremos o problema[7]:
minx1 + 2x2
s.a.
x1 + x2 ≤ 2
x1 − x2 ≥ 1
x1 ≥ 0
x2 ≥ 0
(2.4)
Colocando-o na forma normal1:
minx1 + 2x2
s.a.
x1 + x2 + x3 = 2
x1 − x2 − x4 = 1
x1 ≥ 0
x2 ≥ 0
x3 ≥ 0
x4 ≥ 0
(2.5)
Multiplicando a equacao de restricao x1 - x2 - x4 = 1 por -1, obtem-se uma solucao
inicial, cuja matriz e identidade.
1A forma normal da equacao linear implica em transformar a inequacao em uma equacao, ou seja,
eliminar os sinais de desigualdade, acrescentando variaveis novas que complementem a solucao da equacao.
Tambem conhecida por forma canonica.
6
x1 x2 x3 x4 -z
x3 1 1 1 0 0 2
x4 -1 1 0 1 0 -1
-z 1 2 0 0 1 0
Porem, esta solucao nao e admissıvel, pois b2 ≤ 0:
p =
0
−1
(2.6)
Introduzindo p como variavel x0 na nossa matriz, obtemos:
x1 x2 x3 x4 x0 -z
x3 1 1 1 0 0 0 2
x4 -1 1 0 1 -1 0 -1
-z 1 2 0 0 0 1 0
Efetua-se a troca da variavel x0 pela x4, pois esta e a que possui valor b negativo.
Obtem-se o quadro:
x1 x2 x3 x4 x0 -z
x3 1 1 1 0 0 0 2
x0 1 -1 0 -1 1 0 1
-z 1 2 0 0 0 1 0
Neste quadro, observa-se que x0 = - x1 + x2 + x4 + 1 . Sendo assim, a variavel que
deve ser escolhida para entrar na base, no lugar de x0, e aquela que tiver o coeficiente
mais positivo na linha da variavel x0. No nosso caso, esta variavel e a x1.
Com esta troca, chegamos ao resultado:
x1 x2 x3 x4 x0 -z
x3 0 2 1 1 -1 0 1
x1 1 -1 0 -1 1 0 1
-z 0 3 0 1 -1 1 -1
O resultado otimo e alcancado quando nao existem resultados negativos na linha do
z. Note os valores das variaveis: x1=0; x2=3; x3=0; x4=1.
7
2.3 Arcabouco tecnologico
O conjunto tecnologico mais utilizado atualmente no desenvolvimento de software
tem variado entre os baseados em Java e .NET. Adotamos o conjunto para Java neste
trabalho. A escolha pela tecnologia Java tem fundamento no fato de todo o kit necessario
para desenvolver e manter o software ser gratuito e estar disponıvel na internet para
aquisicao, incluindo toda a documentacao necessaria para seu entendimento.
Foi utilizado o conjunto de ferramentas:
• Linguagem de programacao: Java SDK 5.0
• Banco de dados: Compatıvel JDBC 2
• Infraestrutura de desenvolvimento:
– IDE: Eclipse 3.2
– Framework de banco de dados: Hibernate 3.0
– Geracao de relatorios: Jasper Reports 1.2.8
– Projeto de relatorios: iReport 1.2.8
– Controle de versao: CVS
O software produzido neste trabalho sera distribuıdo gratuitamente, sob licenca GPL,
atraves do servico de hospedagem de software SourceForge.net.
2Devido ao uso do Hibernate nos servicos de persistencia, utilizamos os bancos de dados PostgreSQL
8.2 e Microsoft SQL Server 2003 nos testes de desenvolvimento.
8
3 Solucao do problema
3.1 O problema escolhido
O objetivo inicial deste trabalho e demonstrar a aplicacao de metodos matematicos
no cotidiano do desenvolvimento de software. A programacao linear, aplicada com o
metodo Simplex, e um dos mecanismos com maior potencial de aplicacao, e por isto, foi
o escolhido.
O problema selecionado refere-se a um problema de nutricao. Problemas de nutricao e
dietetica sao constantemente encontrados em livros de programacao linear nos exemplos e
exercıcios, geralmente de forma simplificada, usando duas ou ate no maximo tres variaveis.
Em geral, estes problemas envolvem dois produtos nutricionais (vitaminas, proteınas,
minerais) e deseja minimizar o custo de uma dieta.
O problema proposto neste trabalho e mais complexo, ja que envolve solucao com-
putacional implementada em um sistema, o que nos da uma margem de calculo maior,
ampliando o numero de variaveis que poderemos manipular.
A proposta e gerar uma dieta nutricional, baseada em componentes nutricionais basicos
e uma dieta de referencia (por exemplo, a dieta mınima de 2500 calorias, indicada em
qualquer produto consumıvel), utilizando a tabela nutricional de produtos consumıveis in-
dicada pelo nutricionista ou paciente usuario do sistema. O sistema implementa o metodo
Simplex e realiza os calculos a partir da dieta de referencia selecionada no momento da
construcao da dieta nutricional desejada.
Na proposta nao esta incluso tratamento de custo, peso, altura, idade ou quadro clınico
do paciente, ou seja, o sistema nao se propoe a utilizar-se de heurısticas clınicas para
selecionar a melhor dieta para um paciente. O objetivo e gerar uma dieta utilizando-se de
uma dieta de referencia, criada previamente, e de uma lista de produtos desejados para
consumo pelo paciente. Os produtos serao as variaveis do problema e as restricoes serao
geradas a partir da dieta de referencia. O fator de minimizacao ou maximizacao da dieta
sera fornecido, tambem, pela dieta de referencia - representado por um dos componentes
desta dieta. Por exemplo, numa dieta recomendada de 2500 calorias/dia, o elemento de
referencia e a caloria. Neste caso, nosso problema sera de maximizacao, ja que esta dieta
9
regula uma ingestao mınima de 2500 calorias por dia. O sistema ira calcular a quantidade
mınima de cada produto que devera ser consumida pelo paciente, a fim de atingir as 2500
calorias mınimas desejadas.
3.2 Analise e solucao
Existem poucos componentes disponıveis prontos que implementem algoritmos de
otimizacao. Encontramos o componente CLP que implementa diversos algoritmos Sim-
plex linear e nao-linear, como o Simplex Primal, Dual Simplex, Simplex nao linear, entre
outros. O componente CLP foi desenvolvido utilizando a linguagem de programacao C++
e e distribuıdo gratuitamente pela Computational Infrastructure for Operations Research
(COIN-OR), uma fundacao sem fins lucrativos para ciencia e educacao, cuja missao e a de
criar e disseminar o conhecimento relacionado a todos os aspectos de pesquisa operacional
computacional [2]. O componente CLP foi implementado com o objetivo de ser utilizado
largamente em aplicacoes comerciais ou nao.
Outro componente pesquisado foi o GLPK - GNU Linear Programming Kit [5], de-
senvolvido em C Ansi. O GLPK implementa os metodos Simplex (primal e dual), mas
foi descartado devido a tecnologia utilizada em seu desenvolvimento.
A escolha pelo arcabouco tecnologico guiou a escolha do componente a ser utilizado,
o que descartou o uso do CLP pela complexidade da integracao via chamada nativa de
bibliotecas C++ no Java, o que tornaria o custo do projeto mais alto (aumento signi-
ficativo do prazo para desenvolvimento) e reduziria a manutenibilidade do software final,
pois a integracao de multiplas linguagens, alem de dificultar a manutencao do software
pelo proprio fato de mesclar duas tecnologias diferentes, impactaria na performance final
do sistema, pois existe queda de performance computacional quando se realiza chamadas
nativas, mesmo que ambos os lados do programa estejam muito bem desenvolvidos, e
tenham considerado todos os pontos possıveis de otimizacao do desempenho de software.
O GLPK foi desconsiderado pela mesma razao e com o agravante de que nao foi desen-
volvido utilizando o paradigma da orientacao a objetos, o que aumentaria a dificuldade
de integracao com o Java.
Devido ao fato do objetivo nao ser a implementacao do metodo Simplex e, sim, a
demonstracao de seu uso, pesquisamos componentes desenvolvidos em Java, similares
10
ao CLP. Nao foi possıvel localizar componentes, porem, localizamos um desenvolvedor
que realizou um projeto academico similar ao proposto neste trabalho, utilizando Java.
Michael Bochenek desenvolveu o applet Java Mathematical Programming Suite [1], porem,
pelo curto prazo estabelecido para o projeto, somente foi implementado o metodo Simplex
e o metodo Grafico para resolucao de problemas de programacao linear. Em contato com
Bochenek, os fontes do applet foram cedidos para serem adaptados a este projeto.
O applet JMPS utiliza o metodo Simplex para solucionar equacoes prontas ou qualquer
equacao informada pelo usuario. Iremos utilizar o applet fornecido por Bochenek para
demonstrar o uso do modelo Simplex proposto neste trabalho e ilustrar as iteracoes do
Simplex, alem de demonstrar a estrutura interna implementada, as adaptacoes necessarias
para ser utilizado neste projeto e o desempenho trazido ao calculo final proposto.
3.2.1 Criando o sistema Agenda Nutricional
O sistema Agenda Nutricional foi projetado para ilustrar o uso do metodo Simplex no
calculo da dieta nutricional. O objetivo do sistema Agenda Nutricional e o de fornecer fer-
ramentas que auxiliem na prescricao de uma dieta nutricional. Seus principais elementos
sao:
1. Cadastro de Produtos: permite manter o cadastro de todos os produtos (ali-
mentos) que estarao disponıveis para o paciente compor sua dieta.
2. Cadastro de Nutrientes: tabela de domınio, nao e possıvel alterar a lista de
nutrientes existentes atraves da aplicacao, porem o sistema fornece uma lista de
nutrientes padronizada [8].
3. Cadastro de Nutricionistas: tabela de domınio; o objetivo e possuir informacoes
do nutricionista necessarias a sua identificacao. A primeira fase do desenvolvimento
nao inclui o cadastro de nutricionistas; esta funcionalidade sera implementada em
fases posteriores.
4. Cadastro de Dietas de referencia: permite manter o cadastro das dietas que
serao utilizadas como referencia na prescricao ao paciente - uma dieta de referencia
e a dieta de 2500 calorias diarias para um adulto.
11
5. Cadastro de Pacientes: o cadastro de pacientes permite manter informacoes
mınimas necessarias a identificacao do paciente e seu historico clınico.
6. Prescricao de dietas: permite ao nutricionista prescrever uma dieta a um pa-
ciente cadastrado; o sistema utiliza o metodo simplex para, implicitamente, calcular
as quantidades de cada produto selecionado pelo nutricionista, de acordo com a
quantidade mınima ou maxima de cada nutriente indicada na dieta de referencia,
otimizando de acordo com o produto de referencia da mesma.
O Agenda Nutricional utiliza um sistema de banco de dados para armazenar as in-
formacoes, porem nao e dependente de tecnologia de banco de dados, ou seja, o usuario
pode escolher um gerenciador de banco de dados da sua preferencia para utilizar o sistema
Agenda Nutricional. O sistema foi projetado de forma a ser totalmente independente de
plataforma e de gerenciador de banco de dados. Sua interface foi desenhada para que se
adeque as configuracoes locais do usuario. Todas as configuracoes basicas do sistema po-
dem ser feitas atraves de arquivos texto, editaveis em qualquer editor de texto disponıvel
no computador do usuario.
Outra caracterıstica importante do sistema e a traducao para multiplos idiomas. O
sistema foi projetado para permitir a traducao de todos os termos para qualquer idioma.
Para isto, existe um arquivo de idiomas onde os termos sao categorizados. A versao
principal do sistema foi feita completamente em portugues brasileiro, porem, havendo a
necessidade de traducao para outro idioma, digamos, ingles, basta criar uma copia do
arquivo de idiomas original, traduzir os termos e configurar o sistema para o novo idioma;
ao reiniciar a aplicacao, o sistema identifica o idioma selecionado e utiliza o arquivo de
idiomas adequado.
A arquitetura do sistema e muito simples, porem utiliza-se de quatro camadas: ap-
resentacao, servicos, negocios e persistencia. As camadas estao distribuıdas de forma a
reduzir a interdependencia entre elas, assim:
12
Figura 1: Dependencia entre os pacotes do Agenda Nutricional
A nıvel de implementacao, as chamadas entre as camadas ocorrem no sentido da
camada de apresentacao para a camada de persistencia, ou seja, as classes de apresentacao
fazem chamadas as classes de servicos, mas nao ocorre o inverso - servicos chamando
apresentacao. Tambem nao existe ligacao entre as camadas nao adjacentes, ou seja,
a camada de apresentacao desconhece a existencia da camada de negocios. Assim, as
camadas somente possuem comunicacao com as duas camadas adjacentes, o que facilita
a manutencao, pois e possıvel isolar um problema encontrado em uma camada.
Os erros ocorridos nas camadas mais internas sao encaminhados as camadas mais
externas atraves de excecoes e estas excecoes sao tratadas somente na camada de apre-
sentacao, onde o usuario toma conhecimento delas atraves de mensagens padronizadas.
As camadas de servicos e de negocios estao intimamente ligadas. Devido a baixa com-
plexidade da aplicacao, a camada de servicos foi simplificada, sendo apenas uma camada
de troca de mensagens, basicamente. Entretanto, a camada de servicos possui um forte
acoplamento com a camada de apresentacao. Por exemplo, escolheu-se apresentar os resul-
tados das consultas em forma de tabela na camada de apresentacao. Deste modo, decidiu-
se centralizar a criacao desta tabela na camada de servicos para que houvesse garantia de
que a tabela criada sempre fosse a mesma, com as mesmas colunas, comportamento, etc.
Assim, o servico implementado gera uma instancia do objeto javax.swing.JTable - tipica-
mente um elemento de apresentacao - com os dados resultantes da consulta solicitada na
camada de apresentacao.
13
Figura 2: Diagrama de Pacotes: Agenda Nutricional: negocios
O acesso ao banco de dados e feito atraves do framework Hibernate, que faz a comu-
nicacao entre a aplicacao e o banco de dados. Alem de trazer a liberdade de tecnologia -
o Hibernate utiliza conexoes JDBC ao banco de dados, permitindo que o acesso seja feito
a qualquer gerenciador que possua driver JDBC disponıvel -, o Hibernate traz agilidade
na construcao da aplicacao pois ele cria todas as consultas e comandos de manipulacao de
dados utilizando uma adaptacao propria do SQL chamada HSQL. Ao desenvolvedor basta
criar os arquivos de mapeamento logico do banco de dados, indicando quais variaveis da
aplicacao estao ligadas a quais campos e tabelas do banco. Como o Hibernate somente
utiliza o arquivo de mapeamento, a aplicacao se torna independente de tecnologia de
banco de dados, sendo necessario somente indicar em um arquivo de configuracao proprio
do Hibernate qual o driver JDBC, o servidor onde o banco de dados esta instalado e o
usuario e senha de acesso.
14
Figura 3: Diagrama de Pacotes: Agenda Nutricional: persistencia
A estrutura de calculo do metodo Simplex foi embutida na camada de negocios, ja que
o calculo faz parte da logica interna e do conjunto de regras do sistema. Veremos esta
estrutura com mais detalhes na secao Adaptando o applet para o sistema Agenda
Nutricional e vice-versa.
Com a arquitetura definida, o componente de calculo do Simplex selecionado, iniciou-
se a pesquisa pela fonte de dados. A maior dificuldade foi encontrar uma fonte de dados
confiavel, pois para o funcionamento adequado do sistema, e necessario que a tabela
nutricional dos produtos esteja correta. O departamento de nutricao da Universidade
de Sao Paulo (USP) [4] disponibiliza consulta online a tabela nutricional dos alimentos
nacionais e de consumo nacional. Porem, nao ha possibilidade de fazer copia completa do
banco de dados. O objetivo era o de localizar uma base de dados confiavel que pudesse
ser importada para o Agenda Nutricional sem perda de informacao e sem impactar no
cronograma estabelecido para o projeto. Em prosseguimento a pesquisa, localizamos o
Banco de Composicao dos Alimentos do Departamento de Agricultura dos Estados Unidos
- USDA. O USDA disponibiliza o National Nutrient Database for Standard Reference ,
15
que pode ser utilizado gratuitamente. Este banco esta disponıvel em formatos texto e do
Microsoft Access. O Agenda Nutricional utilizou o Standard Reference 19, de agosto de
2006 [8].
Para modelar o banco de dados, foi utilizado o banco do USDA como base. Neste
modelo temos os elementos Nutriente, Produto e Unidade de Medida. Cada nutriente
possui uma unidade de medida padrao. Um produto e composto por diversos nutrientes;
a quantidade de cada nutriente e indicada a partir de uma quantidade de produto, numa
determinada unidade de medida.
Figura 4: Modelo de dados para os produtos e nutrientes
Por exemplo, uma unidade de abacaxi contem 476 kcal.
Figura 5: Exemplo de relacao entre as informacoes, no modelo de dados proposto
A partir do modelo proposto para o sistema Agenda Nutricional, foi desenvolvido um
metodo de migracao de dados das tabelas do Microsoft Access para o banco de dados do
sistema. O processo e o descrito:
16
• Criaram-se as consultas desejadas no MS-Access, de acordo com os dados que deseja-
se importar. Por exemplo, foi criada uma consulta que retorna uma lista dos pro-
dutos disponıveis e sua composicao.
• As consultas foram executadas e os resultados salvos em arquivos textos tabulados.
• Desenvolveu-se, em Java, uma ferramenta de migracao que le os arquivos textos
tabulados e gera os comandos SQL para insercao dos dados no banco de dados do
sistema Agenda Nutricional, granvando em arquivos texto estes comandos.
• Os arquivos SQL foram executados no gerenciador de banco de dados escolhido e
os dados importados com sucesso.
Os proximos passos, seguindo o cronograma estabelecido para o projeto, foram im-
plementar todas as funcionalidades do sistema que nao dependessem do calculo que seria
realizado pelo applet - que ainda necessitava adaptacoes. Para a apresentacao, optamos
por utilizar as ferramentas do Java Swing. Isto trouxe independencia de plataforma a
aplicacao e reduziu a necessidade de adaptacoes para os diversos sistemas operacionais
que o usuario pode utilizar.
A interface grafica foi desenvolvida de forma a utilizar os padroes de interface conheci-
dos em aplicacoes comerciais. O uso de multiplas janelas independentes foi desconsiderado
pois a maioria do publico esta acostumada a aplicacoes que gerenciam janelas internas.
Por isto, a camada de apresentacao foi desenhada de forma a utilizar janelas internas na
aplicacao - modelo MDI. Isto trouxe maior controle das janelas e ampliou o numero de
janelas que o usuario pode manter abertas em seu campo visual. A aparencia utiliza o vi-
sual padrao do sistema operacional utilizado pelo usuario, evitando o desconforto causado
pela mudanca brusca de padrao de telas.
17
Figura 6: Agenda Nutricional: Controle de multiplas janelas internas
Foram utilizados padroes de projeto (Design patterns) que facilitaram a implementacao
de diversas caracterısticas da interface. Todas as janelas implementam o padrao Singleton,
nao permitindo multiplas instancias da mesma janela durante a execucao do sistema.
Desta forma, economiza-se memoria do computador, pois a maquina virtual do Java
consome muita memoria para construir a janela. Assim, utilizamos o padrao Composite
para armazenar as instancias das janelas e reduzir o tempo de abertura das mesmas.
Os conceitos de Orientacao a Objetos foram aplicados amplamente, inclusive no de-
senho da interface. Observando o pacote apresentacao, podemos notar o uso de abstracao,
heranca e encapsulamento, que sao os tres pilares da orientacao a objetos.
A classe abstrata apresentacao.adicionais.JanelaInterna implementa os padroes Sin-
gleton e Composite. Ela contem referencia a todas as janelas abertas do sistema. Esta
classe gerencia todas as janelas internas da aplicacao. Ela tambem e a classe mae de todas
as janelas de cadastro e consulta.
No pacote apresentacao.consultas, possuımos uma classe abstrata ConsultaForm que
18
e filha de apresentacao.adicionais.JanelaInterna e mae de todas as classes Consulta. Esta
classe determina o leiaute padrao das janelas de consulta e todas as telas de consulta
herdam suas caracterısticas.
Figura 7: Agenda Nutricional: Janela padrao de consulta de registros
A ultima tarefa do projeto foi a adaptacao do applet JMPS para realizar o calculo do
metodo Simplex, conforme pode ser visto nas secoes seguintes.
3.2.2 O funcionamento do Applet
O sistema Java Mathematical Programming Suite - JMPS [1] e um sistema de com-
posicao muito simples. Bochenek nao utilizou arquiteturas complexas e nao utilizou-se
de recursos como pacotes e estruturas mais complexas para organizar o sistema. Isto
dificultou o entendimento do software no inıcio, pois o sistema nao apresentava nenhuma
documentacao ou estrutura de referencia que pudesse ser utilizada.
Como o JMPS e um applet e nao foi desenvolvido como um componente reaproveitavel,
as camadas de negocio e apresentacao estavam mescladas, ou seja, nao havia separacao
19
formal entre as acoes de apresentacao e de negocio. Se observarmos a arquitetura pro-
posta do Agenda Nutricional, veremos que existe completa separacao entre negocio e
apresentacao, o que nos da liberdade para reutilizar a camada de negocios em outros pro-
jetos, sem necessidade de adaptacoes - por exemplo, se quisermos distribuir uma versao
web do Agenda Nutricional, basta reprojetar a camada de apresentacao e de servicos, pois
os dados serao tratados da mesma maneira, independente da forma como estes dados serao
apresentados. Isto nao ocorre no sistema JMPS, por isto houve necessidade de grande
adaptacao do codigo, inclusive para nao prejudicar a arquitetura do Agenda Nutricional.
O primeiro passo foi entender como o JMPS funciona. Para isto, utilizamos as equacoes
que ele traz de exemplo e inserimos tambem equacoes retiradas da bibliografia de re-
ferencia. Vamos apresentar neste trabalho a resolucao passo-a-passo de uma equacao
sugerida pelo sistema JMPS e, logo em seguida, a forma como ele monta uma nova
equacao, por exemplo, inserida pelo usuario - esta montagem sera utilizada internamente
pelo Agenda Nutricional para iniciar o calculo.
Um dos exemplos propostos pelo JMPS e o seguinte problema de otimizacao:
maxz = 3x1 + 5x2
s.a.
x1 ≤ 4
2x2 ≤ 12
3x1 + 2x2 ≤ 18
x1 ≥ 0
x2 ≥ 0
(3.1)
O primeiro quadro do Simplex e montado:
Figura 8: JMPS: O problema do prototipo: quadro inicial do Simplex
Escolhe-se a variavel que sera utilizada no pivotamento:
20
Figura 9: JMPS: O problema do prototipo: primeira iteracao
Realiza-se o pivotamento e os valores da linha sao recalculados (dividindo-se o valor
pelo valor do pivot):
Figura 10: JMPS: O problema do prototipo: pivoteamento da linha
O restante da tabela e ajustado:
Figura 11: JMPS: O problema do prototipo: ajuste das demais linhas da tabela
Finaliza-se a iteracao:
Figura 12: JMPS: O problema do prototipo: primeira iteracao finalizada
Nova iteracao e feita, seguindo os mesmos passos da iteracao anterior. Neste problema,
sao somente necessarias duas iteracoes para chegar-se ao resultado otimo:
Figura 13: JMPS: O problema do prototipo: resultado otimo
21
O sistema tambem oferece a resolucao atraves do metodo Grafico, para o mesmo
problema:
Figura 14: JMPS: Solucao do problema atraves do metodo Grafico
O JMPS possui uma funcionalidade de inclusao de problemas novos. Estes problemas
sao inseridos atraves de uma interface propria e podem ser utilizados na funcionalidade
de solucao pelos metodos Simplex e Grafico, conforme o exemplo anterior. A interface
para inserir o novo problema e muito simples:
Figura 15: JMPS: Edicao de problema de otimizacao
O sistema solicita o numero de variaveis do problema e o numero de restricoes. Con-
forme esta informacoes, sao solicitadas a funcao a ser otimizada, o metodo (minimizacao
ou maximizacao) e as restricoes. O problema, entao, esta pronto para ser solucionado
atraves do metodo Simplex ou Grafico.
Para efeito ilustrativo, reorganizamos as classes de implementacao do JMPS em pa-
cotes, de acordo com seus objetivos e similaridades:
22
Figura 16: Estrutura interna do sistema JMPS
No pacote applet, concentramos as classes principais de apresentacao, que gerenciam
as telas do sistema JMPS e tratam da exibicao dos dados. O pacote methods contem
as classes principais dos metodos propostos pelo JMPS - o metodo Big M possui classe
mas nao foi completamente implementado e nao possui apresentacao no applet. Os pa-
cotes misc e segundo contem classes que sao compartilhadas pelos metodos do JMPS.
Numa comparacao com a arquitetura adotada pelo Agenda Nutricional, estas classes rep-
resentariam as camadas de negocios e servicos. A dificuldade em separar apresentacao
de negocios no JMPS ocorreu principalmente pelo fato de que mensagens ao usuario sao
tratadas nas classes do pacote misc e nao somente no pacote applet, como seria de se
esperar. Trataremos das classes importantes ao Simplex na proxima secao.
3.2.3 Adaptando o applet para o sistema Agenda Nutricional e
vice-versa
A primeira tarefa de adaptacao foi tratar o JMPS de forma a extrair o componente
de calculo de dentro do applet. Assim, analizamos a estrutura do JMPS, retiramos as
diretivas de apresentacao e incorporamos no Agenda Nutricional.
O JMPS utiliza diversas classes para construir um problema a ser calculado. Esta
estrutura e composta pelas classes:
23
• Constraint - gerencia as restricoes
• ComplexConstraint - contem os dados de uma restricao
• ConstraintContainer - contem todas as restricoes de um problema
• SimpleConstraint - gerencia restricoes com uma unica variavel
• ZFunction - funcao a ser otimizada
• TableData - tabela que armazena os valores a serem manipulados na otimizacao
• SimplexMethod - implementa o metodo Simplex
• MathUtil - conjunto de operacoes matematicas necessarias ao metodo Simplex
• Number - gerencia os valores utilizados no calculo. Internamente, trata todos os
valores como ponto flutuante.
Estas estrutura foram adaptadas e adicionadas ao Agenda Nutricional no pacote ne-
gocios.dieta.calculo, conforme abaixo:
Figura 17: Pacote calculo
24
A classe negocios.dieta.calculo.CalculoDietaOtimizada e chamada pela classe nego-
cios.dieta.DietaPrescrita no momento em que esta preparando os dados para enviar para
a camada de persistencia. A classes CalculoDietaPersonalizada recebe um objeto Di-
etaPrescrita que contem todos os produtos e a dieta de referencia indicada pelo usuario
do sistema. A classe CalculoDietaOtimizada cria instancias de:
• ZFunction: a funcao a ser otimizada e construıda utilizando-se somente os nutrientes
presentes na dieta de referencia; cada produto e uma variavel da funcao principal
e a quantidade do nutriente de referencia presente no produto e utilizado como
coeficiente da variavel equivalente na equacao.
• ConstraintContainer: o sistema gera uma restricao para cada nutriente da dieta de
referencia.
• TableData: e criada uma instancia vazia; e neste objeto que serao armazenados os
valores finais do calculo.
Para realizar o calculo, o JMPS utiliza os valores armazenados em TableData, as
restricoes e a funcao Z. O calculo sobre estes valores (atraves dos pivotamentos) determina
o criterio de parada e o termino do calculo, chegando ao resultado otimo.
Foi necessario realizar diversas adaptacoes no codigo do JMPS e no modelo de dados
do sistema Agenda Nutricional, para que os dois pudessem se comunicar adequadamente.
O controle de fluxo do calculo do Simplex estava nas classes de apresentacao, pois a cada
iteracao eram apresentadas mensagens ao usuario (conforme pode ser visto na secao an-
terior). No JMPS a classe SimplexMethod se ocupa somente dos calculos; toda a regra
do algoritmo esta fora da classe, neste caso, na classe de apresentacao. Para que nao hou-
vesse impacto no resultado, optou-se por nao realizar esta alteracao neste momento, pois
requer um estudo mais delicado do JMPS que nao era possıvel de encaixar no cronograma
do projeto. Assim, limitamo-nos a incluir um metodo privado na classe CalculoDietaO-
timizada que realiza as chamadas aos metodos corretos do Simplex, de acordo com a
logica do JMPS. Nao havia sido previsto variaveis de controle na dieta de referencia para
gerenciar o metodo de calculo (minimizacao e maximizacao) e indicar o produto de re-
ferencia. Tais controles foram adicionados para que pudesse ser realizado o acoplamento
dos dois sistemas.
25
Observamos que nao houve impacto no tempo de resposta da prescricao apos a inclusao
dos mecanismos de calculos usando o Simplex. O tempo que o algoritmo utilizou para
realizar os calculos e imperceptıvel ao usuario, principalmente pelo fato de tal mecanismo
estar embutido na acao de persistencia dos dados no banco de dados, que e uma operacao
lenta, ja que realiza operacoes de leitura e gravacao de disco.
26
4 Conclusao
A implementacao do Simplex utilizada nao impactou no desempenho geral do sistema e
trouxe reducao da margem de erro nos calculo, pois nao foram feitos calculos aproximados,
mas utilizou-se um algoritmo de otimizacao comprovadamente eficiente.
Apesar de ainda ser necessario uma serie de ajustes arquiteturais no cocmponente
JMPS, a utilizacao deste componente e muito simples. Notamos durante o uso e analise do
JMPS que existem ligacoes entre as classes principais que provavelmente sao desnecessarias.
Por exemplo, para o calculo do Simplex, nao seria necessario utilizar quatro objetos de
restricao diferentes, mas somente um seria o suficiente para o calculo adequado. Uti-
lizar padroes de projeto, como o Composite provavelmente ajudaria na performance e
simplificaria ainda mais o componente.
Pudemos obsevar que a implementacao de algoritmos matematicos requer estudos
aplicados do algoritmo e da linguagem de programacao a ser utilizada e adaptacoes sao
necessarias. Utilizar-se de abstracoes e imprescindıvel para identificar os objetos mais
provaveis na manipulacao dos dados produzidos e consumidos pelo metodo selecionado.
No caso do Simplex, selecionado para uso neste projeto, abstraiu-se a funcao Z (funcao a
ser otimizada) e as restricoes (equacoes que restringem o espectro dos dados).
Percebemos que, se nao for prevista na fase de projeto a utilizacao de algum metodo
especıfico, como foi o caso deste projeto, o impacto de incluir tal metodo no sistema
e muito alto, pois impacta no modelo de dados, nos casos de uso, no projeto em si
(componentes, pacotes e classes) e na interface ao usuario.
Entretanto, pudemos notar que e totalmente viavel a utilizacao de modelos matematicos
no cotidiano de desenvolvimento de software e estes modelos devem ser considerados nos
primeiros estagios da engenharia de software. E importante que o analista de requisitos
tenha conhecimento de tais modelos, podendo identificar potenciais utilizadores. Ao ar-
quiteto e projetista e ainda mais importante possuir tal conhecimento, pois pode incluir na
arquitetura e no projeto do sistema o uso de padroes de projeto e de metodos matematicos
que solucionem os problemas levantados pelo analista de requisitos, facilitando, assim, o
uso de tais mecanismos no desenvolvimento do sistema.
27
Glossario
.NET Plataforma de desenvolvimento de software da Microsoft, concorrente do
Java. O .NET fornece diversas ferramentas para o desenvolvimento de
software, porem seu ponto fraco ainda e a portabilidade - assim como o
Java, o .NET trabalha em diversos contextos, mas nao possui compilador
para outros sistemas operacionais que nao o da Microsoft, apesar de estar
em fase de desenvolvimento dos mesmos.
API Application Programming Interface. Interface para o codigo-fonte de uma
aplicacao ou biblioteca; compoe a documentacao de desenvolvimento.
Applet Aplicacao executada dentro do contexto de outra aplicacao, geralmente
um navegador de internet.
Caloria Unidade de medida de energia.
Framework Conjunto de codigos, modelos, bilbiotecas, componentes, etc, reutilizaveis
que ajudam no desenvolvimento de software.
GNU O Projeto GNU tem por objetivos desenvolver um sistema operacional do
tipo Unix inteiramente com software livre. Os sistemas Linux sao do tipo
GNU.
GPL GNU Public Licence. Licenca de software mais utilizada atualmente em
projetos de software livre; em resumo, protege a liberdade do software,
garantindo que o software distribuıdo via GPL possui codigo aberto e
pode ser distribuıdo livremente.
Hibernate Servico de persistencia e consulta a bancos de dados relacionais ou de
objetos com alto desempenho. Pode ser utilizado com Java e com .NET.
28
Home Office
Tendencia mundial de metodologia de trabalho, onde a pessoa opta por
trabalhar em casa.
IDE Integrated Development Environment - Ambiente integrado de desenvolvi-
mento. Software utilizado para auxiliar e agilizar o desenvolvimento de
software. Geralmente oferece ferramentas de auto-complemento, ajuda
online e dicas.
iReport Ferramenta visual para projetar relatorios para o Jasper.
Jasper Ferramenta de geracao de relatorios para Java.
Java Linguagem de programacao da Sun Microsystems, cujo compilador e dis-
tribuıdo gratuitamente. O Java tem como principal caracterıstica a porta-
bilidade - existem versoes do compilador para diversos sistemas opera-
cionais; alem disto, o Java permite trabalhar com ambientes texto, grafico,
web e portateis.
JDBC API para Java que define o modo como um cliente (aplicacao) acessa um
banco de dados.
MDI Multiple Document Interface. Metodo de organizacao de janelas que con-
siste em uma janela principal (gerenciador) e n janelas filhas, controladas
pela janela principal e dispostas de forma a permanecerem internas a janela
principal. Neste modelo, todas as janelas do sistema permanecem juntas.
SDK Software Development Kit. Conjunto de ferramentas de desenvolvimento
utilizadas para criar aplicacoes, frameworks, consoles, etc.
Sistemas de controle de versao
Software especıfico utilizado para gerenciar as alteracoes realizadas em um
software em desenvolvimento. Os sistemas de controle de versao fornecem
ferramentas para acompanhar as alteracoes realizadas, voltar uma versao
do codigo, etc. Muito utilizado em ambientes de multiplos desenvolve-
dores.
29
Software de prateleira
Software produzido com caracterısticas genericas, com o objetivo de ser
distribuıdo em larga escala. Geralmente proprietario, ou seja, desenvolvido
por uma empresa e vendido sob licencas restritas de uso.
Software house
Empresa especializada em desenvolvimento de software. Fabrica de soft-
ware.
SoureForge.net
O maior site de desenvolvimento de software livre no mundo, atualmente.
Hospeda mais de 100.000 projetos, fornecendo diversas ferramentas de
apoio ao desenvolvimento, como gerenciador de tarefas, gerenciador de
bugs, foruns, sistemas de controle de versao, etc.
30
Referencias Bibliograficas
[1] BOCHENEK, Michael. The Java Mathematical Programming Suite .
Disponıvel em: http://sourceforge.net/projects/javamathprog/
[2] COIN-OR. CLP Component . Disponıvel em: http://www.coin-
or.org/Clp/faq.html
[3] DEAN, Warren. A industrializacao durante a Republica Velha in Historia
Geral da Civilizacao Brasileira: III. O Brasil Republicano: 1. Estrutura de poder e
economia (1889-1930), 4a edicao . Sao Paulo: Difel (1985).
[4] Departamento de alimentos e nutricao experimental da Faculdade de Ciencias Far-
maceuticas - USP. Tabela de brasileira de composicao de alimentos . Projeto
Integrado de composicao de alimentos. Universidade de Sao Paulo. Disponıvel em:
http://www.fcf.usp.br/tabela/index.asp
[5] GNU Linear Programming Kit. GLPK Component . Disponıvel em:
http://www.gnu.org/software/glpk
[6] LACHTERMACHER, Gerson, Pesquisa Operacional na tomada de decisoes. Sao
Paulo: Campus (2005).
[7] PATRICIO, Joao. Metodo Simplex in Investigacao operacional . Ano letivo
2006/2007. Disponıvel em: http://www.aim.estt.ipt.pt/ jmmp/InvestOperacional/
[8] US Department of Agriculture. Composition od Foods Raw, Pro-
cessed, Prepared. USDA National Nutrient Database for Stan-
dard Reference, Release 19. Baltimore: August, 2006. Disponıvel em:
http://www.nal.usda.gov/fnic/foodcomp/Data/HG72/hg72.html