Características das principais técnicas de otimização disponíveis no

Transcrição

Características das principais técnicas de otimização disponíveis no
Características das principais técnicas de
otimização disponíveis no mercado.
Introdução
A otimização é o processo de encontrar a melhor solução (ou solução ótima) de um conjunto de soluções
para um problema. Existe um conjunto particular de problemas para os quais é decisiva a aplicação de um
procedimento de otimização, sendo que muitos processos podem se beneficiar de uma alocação otimizada de
recursos. Esses recursos, que podem incluir capital, equipamentos, tarefas, tempo, ou até mesmo largura de
banda, devem ser cuidadosamente alocados nas quantidades corretas, nos tempos corretos, e na seqüência
correta para a obtenção do melhor resultado possível. São problemas complexos, muitas vezes de difícil
solução, e que envolvem significativas reduções de custos, melhorias de tempos de processos, ou uma
melhor alocação de recursos em atividades.
As técnicas de otimização devem ser utilizadas quando não existe uma solução simples e diretamente
calculável para o problema. Isso geralmente ocorre quando a estrutura do problema é complexa, ou existem
milhões de possíveis soluções. Nesses casos, é possível que não exista nenhum procedimento direto de
solução, de forma que as técnicas de otimização podem ser utilizadas na busca pela melhor solução para o
problema. Em alguns casos, quando nenhuma solução pode ser encontrada, o problema é "relaxado"
(algumas restrições ou alternativas são descartadas), e a otimização pode ser utilizada para encontrar a
solução ótima.
A otimização pode se dividida em 2 classes: global e local. A otimização global encontra a melhor solução
do conjunto de "todas" as soluções possíveis. A otimização local encontra a melhor solução dentro de um
conjunto de soluções que está próximo a outro. Na otimização local, a solução encontrada depende do ponto
de início do processo de busca de otimização. A otimização global sempre encontrará a melhor solução
possível, independentemente das condições de início do processo de busca, porém, geralmente, requisita um
maior poder de computação.
Pode ser praticamente impossível de se encontrar uma "solução ótima global" em algumas aplicações,
entretanto, ums "solução ótima local" pode ser bastante eficiente. Em muitos casos, encontrar o ótimo global
não é necessário. Encontrar rapidamente uma "boa solução" (ótimo local) pode ser mais desejável do que
encontrar demoradamente a melhor solução possível. O tipo de otimização empregada depende da estrutura
do problema e do grau de confiabilidade das variáveis utilizadas. Se todas as variáveis de decisão são reais, e
a função-objetivo e restrições são lineares, a programação linear, geralmente, é a melhor escolha. Entretanto,
o mundo real usualmente requer funções não lineares, variáveis de valores discretos (ou inteiras), variáveis
lógicas e restrições de diferentes naturezas aplicadas a esse gama de elementos.
Existem numerosas técnicas de otimização. A aplicação de cada uma delas depende essencialmente do tipo
de problema. Sistemas baseados em regras são comumente usados em aplicações de controle, e envolvem
regras pré-determinadas para gerar as soluções. Programação linear e suas extensões são, via de regra, as
melhores técnicas, e são amplamente utilizadas para otimização de objetivos globais. “Redução de domínio”
e “Programação por Restrições” estão sendo combinadas em uma técnica relativamente nova aplicada
diretamente a problemas de "scheduling". Algoritmos genéticos e recozimento simulado são duas recentes
técnicas desenvolvidas que implementam soluções ao longo do tempo. E, agrupando boa parte dessas
tecnologias, temos uma verdadeira ciência do conhecimento em evolução, que é a utilização desses e outros
conceitos no que se denomina Inteligência Artificial, e seu braço mais mercadológico, a área de
desenvolvimento de Sistemas Especialistas.
Programação linear e inteira
A programação linear é provavelmente a mais conhecida e utilizada técnica de otimização em todo o mundo.
É geralmente utilizada para tomada de decisões gerenciais sobre a alocação de recursos para produção. Os
custos dos recursos e as receitas geradas pelos produtos são usados para determinar a melhor solução.
www.ilab.com.br - Tel: (16) 3623-5680
Página 1 de 5
Qualquer problema que possa ser formulado com variáveis de decisão reais, tendo uma função-objetivo
linear, e funções de restrição lineares, em princípio pode ser solucionado através da programação linear. Tais
programas originariamente utilizavam o método Simplex, porém, mais recentemente, métodos de "pontos
interiores" se mostraram mais eficientes.
Embora a programação linear seja muito eficiente para a resolução de problemas lineares, sua aplicação a
problemas que apresentem objetivos ou restrições não-lineares tem levado a problemas e falhas de
modelagem. Em alguns casos, funções não-lineares podem ser aproximadas por algumas funções lineares
conjugadas, e a programação linear ainda pode ser utilizada. Contudo, isso leva a uma representação
ineficiente do problema, podendo causar matrizes de decisão explosivamente grandes que demandam um
tempo excessivo para resolução. Esta é uma dificuldade comum em problemas que envolvem, por exemplo,
"scheduling" e "sequenciamento" de processos.
De forma equivalente, outros tipos de variáveis não podem ser tratadas diretamente com o uso de
programação linear. Programação inteira usa programação linear para resolver problemas sobre variáveis
inteiras, mas ainda com funções objetivo e restrições puramente lineares. As variáveis inteiras são
representadas como variáveis reais no algoritmo de resolução do problema. Então um processo repetitivo é
usado para "delimitar" o valor destas variáveis em valores inteiros, através da adição de restrições e
reprocessamento da solução. Esse método, conhecido como "branch & bound", finaliza quando todas as
variáveis assumem valores inteiros. Quando o número de variáveis inteiras é pequeno, a programação inteira
soluciona o problema rapidamente. Infelizmente esse procedimento pode consumir muito tempo com um
número grande de variáveis inteiras, podendo, em alguns casos, necessitar de milhões de iterações para
serem resolvidos.
Programação por restrições
A programação por restrições consiste de uma técnica de formulação de problemas onde o objetivo é o
descobrir algum estado do problema que satisfaça um determinado conjunto de restrições. O primeiro passo
na resolução de qualquer problema consiste na determinação da abrangência ou domínio do problema. O
conjunto de todos os possíveis estados do problema, onde se encontra a solução ainda desconhecida,
denomina-se espaço de busca.
Utilizando-se a técnica de programação por restrições, são formuladas condições que diminuem
substancialmente a quantidade de buscas necessárias para se encontrar a solução do problema. Em tese,
quanto maior for o número de restrições informadas ao sistema, menor será o número de possíveis soluções a
serem analisadas, e portanto, melhor será o desempenho da aplicação. Comparando-se a técnica de
programação por restrições com outros procedimentos tradicionais para solução de problemas de otimização
discreta, como a programação linear, notamos que a primeira possui algumas vantagens qualitativas.
A primeira delas diz respeito à representação do problema, que no caso da programação por restrições é
muito mais compacta - exigindo um número muito menor de variáveis - com melhorias no desempenho da
aplicação. O segundo ponto relaciona-se ao processo de propagação das restrições, que permite também um
desempenho melhor ao "eliminar" mais rapidamente combinações que não solucionam o problema, e
portanto agilizando a busca pela solução.
E por último, o que talvez seja a principal vantagem, a programação por restrições permite uma
representação mais direta de alguns problemas do que, por exemplo, a programação linear. Essa última, por
estar atrelada aos rígidos algoritmos implementados, necessita de uma estrutura que, muitas vezes, impõe
uma adaptação das variáveis para a representação do problema. A programação por restrições, por ser
implementada através uma linguagem de programação, permite a elaboração de algoritmos especialmente
dedicados a cada tipo de questão, conseguindo priorizar os pontos de maior importância, identificar pontos
de infactibilidade e propor caminhos alternativos segundo o entendimento e intervenção dos especialistas.
Nesse sentido, a modelagem do problema e o conhecimento existente sobre ele são muito mais valorizados e
contribuem mais efetivamente na sua solução.
www.ilab.com.br - Tel: (16) 3623-5680
Página 2 de 5
Algoritmos Genéticos
Algoritmos genéticos encontram a solução para problemas utilizando um mecanismo de evolução a partir de
uma solução aceitável para um nível superior de otimização. Em contraste com outros processos de
otimização, os algoritmos genéticos focam uma otimização local; entretanto, a evolução é controlada para
tentar percorrer todo o espaço de busca, o que pode tornar a otimização global. Uma população de soluções
existe em cada iteração do algoritmo. Essa população pode ser utilizada para evoluir para uma nova
população na próxima iteração. A evolução é arquivada utilizando operadores específicos: reprodução,
cruzamento e mutação.
O operador de reprodução copia uma solução a partir da população anterior para uma nova população com
uma probabilidade dependente da "saúde" da solução. A "saúde" da solução é o valor da função objetivo de
otimização. Quanto melhor a função-objetivo, maior será a probabilidade de a solução "sobreviver" para a
próxima iteração.
O operador de cruzamento divide uma seção de duas soluções. Cada nova solução contém parte de duas
últimas soluções. Por exemplo, consideremos o problema de encontrar o valor de 5 variáveis. Duas soluções
para esse problema poderiam ser [10010] e [11011]. Fazendo um cruzamento sobre os 3 valores
intermediários dessas soluções, obteríamos [11010] e [10011] na nova população. Esse operador busca criar
soluções que possuam as melhores propriedades das soluções originais.
O operador de mutação modifica randomicamente uma pequena parte de uma solução. Mutações muito
pequenas sempre ocorrem na prática do processo de busca, entretanto, esse passo é necessário quando da
busca de uma solução de otimização global. Com apenas os operadores de reprodução e cruzamento, os
algoritmos genéticos podem vasculhar apenas uma parte do espaço de busca onde exista um ótimo local. O
operador de mutação permite ao algoritmo pular para uma nova solução em outro contexto. Desta forma, se
ocorrerem mutações suficientes, o algoritmo conseguirá atingir um valor de ótimo global.
Obviamente, algoritmos genéticos demandam um enorme número de iterações para obter sucesso, porém a
simplicidade do processo permite uma velocidade de execução razoavelmente boa. Eles se mostraram
particularmente úteis para a resolução de problemas com restrições e funções objetivos que são muito
difíceis de serem tratadas. Algoritmos genéticos funcionam melhor com grandes populações de soluções,
uma vez que isso significa um aumento nas chances de uma boa solução. Infelizmente, o espaço necessário
para uma solução simples geralmente é grande, de forma que esses algoritmos usam uma grande quantidade
de memória para manter a população inteira de soluções. Gerando uma população inicial grande pode
consumir muito tempo, e não existe maneira de se saber de antemão quando o algoritmo encontrou uma
solução ótima global. Como uma evolução natural, o quanto mais permitirmos que um algoritmo genético
seja processado, melhor a solução se torna. A incerteza de quando finalizar o algoritmo, combinada com o
excessivo tamanho da população inicial de soluções, pode levar a um tempo indesejavelmente longo de
execução.
Heurísticas
Em muitos casos, a otimização não é possível ou simplesmente não é eficiente o suficiente para gerar
soluções no tempo disponível, de forma que é necessária a utilização de heurísticas. Heurísticas são
basicamente algoritmos que não buscam diretamente a otimização pura, mas geram soluções aceitáveis
("boas soluções"). São utilizadas por serem computacionalmente mais eficientes e/ou fáceis de serem
implementadas.
Entretanto, em alguns casos, elas podem não ser muito precisas ou previsíveis. Mais ainda, elas
ocasionalmente incorrem em falhas, devido à escalabilidade do problema e/ou hipóteses errôneas que
estejam sendo consideradas. Se um problema é resolvido repetitivamente e os parâmetros se alteram
constantemente, as chances de falha de uma heurística são consideravelmente maiores. Outra característica
www.ilab.com.br - Tel: (16) 3623-5680
Página 3 de 5
de um algoritmo heurístico é o de que ele sempre gera uma resposta para o problema, mas algumas vezes
essas soluções não são de boa qualidade.
A despeito dessas características, muitas vezes a performance de uma heurística pode ser melhorada através
da incorporação de algoritmos localizados de otimização. Soluções melhores são geradas para um
subconjunto de condições utilizando alguns passos de otimização local. Contudo, a "pura otimização" é a
única garantia da "melhor solução" para todos os parâmetros de um problema.
Sistemas baseados em regras
Sistemas baseados em regras não são ferramentas de otimização, mas muitas vezes são utilizados em
sistemas de controles, em heurísticas e em outras formas de sistemas que podem prover algum nível de
otimização. Esses sistemas consistem de um processo controlado por um conjunto fixo de centenas ou
mesmo milhares de regras. Na prática, as regras e suas interações são muito complexas, sendo que
dificilmente a otimização pode ser garantida. De fato, sistemas baseados em regras compreendem sistemas
heurísticos. Geralmente geram boas soluções, entretanto existem casos nos quais as regras demonstram uma
performance ruim. Atualmente esse tipo de tecnologia é mais utilizado em sistemas de alarme, e sistemas de
correlação de informações e filtragem de dados, particularmente em aplicações de monitoramento de redes
de telecomunicações.
Existe um caso no qual sistemas baseados em regras sempre atingem uma otimização real. Se tiver sido
provado que as regras utilizadas sempre gerem uma solução ótima, para qualquer estado do processo, o
sistema pode ser enquadrado dentro dos níveis de otimização real. Infelizmente, essas provas usualmente
transformam-se em problemas mais complexos que a aplicação original, inviabilizando essa conclusão.
Tipicamente o maior problema associado aos sistemas baseados em regras é o da formulação correta e
consistente das regras a serem aplicadas.
Recozimento Simulado (Simulated Annealing)
O recozimento simulado (simulated annealing) é um algoritmo de otimização similar aos algoritmos
genéticos, uma vez que utiliza o mesmo princípio de evolução da solução ao longo do tempo. O termo
"annealing" refere-se à forma como que os metais líquidos são esfriados vagarosamente de forma a garantir
uma baixa energia e formatos de estrutura altamente sólidos. O recozimento simulado pode ser encarado
como um algoritmo que "esfria" vagarosamente a solução para garantir que ela possua a menor funçãoobjetivo possível. Por garantir um alto nível de movimentação através do espaço de busca, o recozimento
simulado busca varrer todo esse espaço, de forma a permitir uma solução global. Mais tarde no processo, o
resfriamento permitirá apenas pequenos movimentos no espaço de soluções, e o processo converge
finalmente para uma solução final. A natureza de movimentos através do processo significa que, uma vez
que o processo "resfrie" totalmente, a solução com a menor função-objetivo possível é encontrada em uma
área específica da memória alocada pelo programa.
O recozimento simulado necessita de 4 elementos para processamento. O primeiro é uma descrição das
possíveis soluções. O segundo é um gerador de alterações randômicas entre as soluções. O terceiro é uma
função-objetivo para as soluções. Por último, o quarto elemento é um parâmetro de controle e um
"scheduling de recozimento", que descrevem como o parâmetro de controle varia ao longo do tempo.
O recozimento simulado tem as mesmas vantagens e desvantagens dos algoritmos genéticos. A abordagem
pode resolver problemas com funções de alto grau de complexidade, porém a otimização tem um caráter
local, e não existe maneira de saber quando uma solução ótima foi alcançada. Novamente, quanto mais se
permite que o algoritmo processe a solução, melhor a solução será. Entretanto, não existe maneira de se
certificar quando finalizar o processo e obter a melhor solução possível.
www.ilab.com.br - Tel: (16) 3623-5680
Página 4 de 5
Inteligência Artificial e Sistemas Especialistas
A Inteligência Artificial (I.A.) tem se consolidado, ao longo dos últimos anos, como uma das mais poderosas
ferramentas para obtenção de ganhos significativos de produtividade nas empresas. Os resultados práticos de
sua aplicação, nos mais diversos nichos de negócio, vêm crescendo tanto em valor como em importância à
medida que se aproximam dos setores gerenciais de tomada de decisão nas empresas.
Existem muitas idéias controvertidas e conceitos mal formulados a respeito do que é essencialmente a I.A..
Um conceito, que de algum modo é aceito universalmente, é o de que a I.A. compreende uma ciência para
desenvolvimento de técnicas e algoritmos destinados à resolução de problemas complexos.
A aplicação das técnicas de I.A. no desenvolvimento de aplicações resulta em sistemas especialistas, que são
nada mais do que programas de computador que usam conhecimento e procedimentos de inferência para
resolver problemas que são de uma complexidade e dificuldade superiores à capacidade humana em calculálos. Ou, em outras palavras, um sistema especialista emula a habilidade de tomada de decisão de um ou mais
especialistas humanos na resolução matemática de problemas.
Desta forma, um dos mitos de que esta classe de aplicações busca substituir a atuação humana perde
totalmente o sentido. Todo o processo de busca e tomada de decisão deve ser orientado a partir do
conhecimento dos "especialistas humanos", que serão os principais e essenciais condutores do sistema. Os
programas nada mais são, portando, do que ferramentas que embutiram dentro de seu código algum
conhecimento ou método para resolver uma questão, e que permitem aos "especialistas humanos" uma visão
mais aprofundada ou específica que seria impossível sem esse mecanismo de cálculo avançado.
A I.A. possui uma série de áreas de atuação atualmente. Algumas dessas áreas são muito específicas, outras
ainda de cunho apenas acadêmico, mas todas em constante desenvolvimento nos principais institutos de
pesquisa do mundo. Exemplos dessas áreas são:
• Reconhecimento ótico
• Redes neurais
• Robótica
• Representação de conhecimento
• Linguagem natural
• Compreensão da fala
• Problemas de busca
• Lógica difusa
Dentro do âmbito de aplicações comerciais, diversos estudos e pesquisas têm direcionado os esforços da I.A.
para o desenvolvimento de técnicas que solucionem problemas complexos de alocação, planejamento e
otimização de recursos. Nessa esfera, modernos algoritmos de otimização têm sido empregados em
aplicações comerciais, que demonstram uma capacidade ímpar na obtenção de retorno financeiro às
empresas.
www.ilab.com.br - Tel: (16) 3623-5680
Página 5 de 5