Introdução
História:
• 1955 - Frisch publica o primeiro manuscrito do método de pontos interiores - MPI
• 1968 – Fiacco e Mc Cormick apresentam um método de pontos interiores para problemas de programação não linear - PNL
• 1969 – Khachiyan apresenta o método elipsoidal para resolver problemas de PL em tempo polinomial. A experiência prática, no entanto, foi um pouco frustrante. Em quase todos os casos, o método simplex era muito mais rápido do que o método elipsoidal
• 1984 – Karmarkar usa a transformada projetiva para resolver PLs. Aos poucos a comunidade científica entendeu que a ideia de Karmarkar era revolucionária.
– O MPI de Karmarkar é superior ao Simplex (Dantzig - 1941) para problemas de grande porte – É um algoritmo com tempo de convergência polinomial
– Algumas ideias do MPI podem ser estendidas para PNL ou inteira para conseguir algoritmos com tempo de convergência polinomial.
• Depois do método de Karmarkar surgiram diversas variantes do MPI. Hoje os MPI mais populares são:
– Métodos baseados na transformada projetiva – Método afim primal e dual
Ideias Básicas
• O MPI é iterativo
• Inicia em um ponto dentro da região factível
• Os próximos pontos continuam dentro da região factível (são pontos interiores) • O método apresenta uma boa estimativa da função objetivo desde as primeiras
iterações
• Na figura se apresentam as trajetórias seguidas pelo método simplex e pelo MPI
•
Algoritmo de Karmarkar
• Este algoritmo resolve problemas na forma padronizada
s.a.
• Algumas considerações do algoritmo de Karmarkar:
– , então é um ponto factível
– O valor da função objetivo no ponto ótimo é zero,
Algoritmo de Karmarkar
• Define-se a transformada projetiva que
coloca o ponto atual no centro da região
factível e é definida como:
• onde D é uma matriz diagonal formada pelas
coordenadas da solução corrente
• A transformação inversa é definida como:
Algoritmo de Karmarkar
1. Iniciar em um ponto dentro da região factível e fazer k=0 2. Se pare. Caso contrário ir ao passo 3
3. Colocar o ponto atual no centro da região factível usando a transformação projetiva 4. Transformar as restrições e o gradiente da função objetivo
5. Projetar o gradiente da função objetivo dentro do espaço que atravesa as restrições (colunas de mais )
Onde
6. A direção de descida, é dada por Substituindo
Este é o passo onde se realiza o maior esforço computacional
Algoritmo de Karmarkar
7. Calcular o tamanho do passo
8. Calcular o novo ponto
Na prática
9. Retornar ao espaço original
10. Fazer e voltar ao passo 2
Exemplo
• Considere o seguinte problema no formato
padrao de Karmarkar:
s.a.
Suponha x
0=(1/3)*[1 1 1]
•
Observações
• Para resolver qualquer problema de PL o
algoritmo de Karmakar precisa de 3 fases:
– Fase I: Converter o PL no formato padrão de Karmarkar
– Fase II: Resolver o PL padrão usando o algoritmo de
Karmarkar
– Fase III: Rotina de arredondamento ao ponto ótimo
• O algoritmo de Karmarkar pode ser modificado
para considerar problemas na forma padronizada
de PL
Método escala-afim primal
Será visto agora a natureza da abordagem proposta por Karmarkar
descrevendo uma variante relativamente elementar ("afim" ou
“escala-afim"). As ideias básicas do algoritmo podem ser resumidas da seguinte
forma:
Conceito 1: desloque através do interior da região viável em direção a uma
solução ótima.
Conceito 2: mova em uma direção de melhoria do valor da função objetivo à
taxa mais rápida possível.
Conceito 3: transforme a região viável de modo a posicionar a solução
tentativa atual próximo de seu centro permitindo, assim, uma grande
melhoria quando o conceito 2 é aplicado.
Exemplo : Resolva o seguinte PL usando MPI escala-afim
s.a.
Ilustração gráfica do problema
anterior
Direção de Busca
• O algoritmo começa com uma solução teste inicial que se
situa no interior da região factível.
• Uma solução teste que se encontre na fronteira não pode ser
utilizada porque isso levaria à indefinição matemática por
divisão por zero em um dado passo do algoritmo.
• Escolhe-se arbitrariamente (, ) = (2, 2) para ser a solução
inicial.
• A direção do movimento a partir de (2, 2) que aumenta o
mais rapidamente possível é perpendicular à reta da função
objetivo . Usando a adição de vetores, tem-se:
O algoritmo na verdade funciona para problemas de
programação linear depois que estes tenham sido reescritos na
forma aumentada. Assumindo como uma variável de folga para
a restrição funcional do exemplo, vemos que esta forma é
em que
Para o exemplo, note-se que c
T=[1, 2, 0] agora é o gradiente da
função objetivo.
• Projeção do vetor gradiente: Na forma aumentada, a solução tentativa inicial para o exemplo é (x1, x2, x3) = (2, 2, 4). Ao somar com o gradiente (1, 2, 0) resultante, o próximo ponto é
(3, 4, 4) = (2, 2, 4) + (1, 2, 0)
• Observe que (3, 4, 4) é inviável! Quando = 3 e = 4, então deveríamos ter x3 = 8 – – = 1, em lugar de 4.
• Portanto, para permanecer viável, o algoritmo (indiretamente) projeta o ponto (3, 4, 4) sobre o triângulo viável pela definição de uma linha perpendicular a este triângulo. Um vetor de (0, 0, 0) a (1, 1, 1) é perpendicular a este triângulo e, então, a linha perpendicular através de (3, 4, 4) é descrita pela equação
(, , ) = (3, 4, 4) – (1, 1, 1)
• em que é um escalar. Visto que o triângulo satisfaz a equação + + = 8, esta linha perpendicular intercepta o triângulo em (2, 3, 3). Como
(2, 3, 3) = (2, 2, 4) + (0, 1,-1)
• o gradiente projetado da função objetivo (gradiente projetado na região viável) é (0,1,-1). É este gradiente projetado que define o sentido de movimento da busca a partir de (2, 2, 4) com base no algoritmo.
Para o cálculo direto do gradiente projetado utiliza-se matriz de projeção P
o gradiente projetado (em forma de coluna) é Então, para o exemplo, temos
de modo que
Mover-se a partir de (2, 2, 4) na direção do gradiente projetado (0, 1, -1) implica no aumento de na equação
em que o coeficiente 4 é usado simplesmente para dar um limite superior de 1 para de modo a manter a viabilidade (todos xj 0). Assim, controla a fração da distância que poderia levar a busca para fora da região viável.
Quão grande deveria ser para a busca se encaminhar à próxima solução tentativa? Visto que o aumento em Z é proporcional a , um valor próximo do limite superior de 1 é bom para se dar um passo relativamente grande em direção à otimalidade na iteração atual. Por outro lado, o problema com um valor muito próximo de 1 é que a próxima solução tentativa é pressionada contra uma fronteira restritiva, tornando difícil de se realizar grandes passos de melhoria durante várias iterações seguintes. Por conseguinte, é muito útil que as soluções tentativa fiquem o mais perto possível do centro da região viável (parece um contra-senso!) ou, pelo menos, perto do centro da porção da região viável na vizinhança da solução ótima!), e não muito perto de qualquer fronteira criada por restrição.
Com isto, Karmarkar sugeriu para seu algoritmo um valor para
não maior do que 0,25, considerado "seguro". Na prática,
valores muito maiores (por exemplo, = 0,9), por vezes, são
utilizados.
Esquema para Centralização. Outro benefício importante deste
esquema de centralização é que ele mantém a rotação do
gradiente projetado de modo a dar a direção para que ele
aponte mais acertadamente para o ótimo do espaço de busca à
medida que o algoritmo converge para esta solução. A ideia
básica do esquema de centralização é simples: basta alterar a
escala (unidades) de cada uma das variáveis, de modo que a
solução tentativa torna-se equidistante das fronteiras criadas
pelas restrições no novo sistema de coordenadas.
A solução tentativa inicial é (, , ) = (2, 2, 4), de modo que esta solução é 2
unidades distante das fronteiras x1 = 0 e x2 = 0, e 4 unidades distante da
fronteira x3 = 0, quando são usadas as unidades das respectivas variáveis.
Portanto, vamos redimensionar as variáveis do seguinte modo:
a fim de fazer a solução tentativa corrente (, , ) = (2, 2, 4) tornar-se
Nestas novas coordenadas, o problema passa a ser
Graficamente, a região viável é reescalonada.
Veja que a solução tentativa (1, 1, 1) encontra-se equidistante das três restrições:
Para cada iteração subsequente, o problema é reescalonado novamente para se obter esta mesma propriedade (situação), de modo que a solução tentativa atual é sempre (1, 1, 1) para as coordenadas atuais...
Iteração 1. Dada a solução tentativa inicial (, , ) = (2,2,4), faça D ser a matriz
diagonal correspondente de tal modo que . Para o exemplo:
As variáveis reescalonadas são então as componentes de
Nestas novas coordenadas, A e C tornam-se
Portanto, a matriz de projeção é:
e o gradiente projetado é:
Definir v como o valor absoluto da componente negativa de cp tendo o maior valor absoluto, de modo que v = |-2| = 2, neste caso. Consequentemente, nas coordenadas atuais, o algoritmo define um movimento a partir da solução tentativa atual para a próxima
A definição de v foi feita para fazer a menor componente de x igual a zero quando =1 nesta equação para a solução tentativa seguinte. No sistema de coordenadas original, esta solução é:
Isto completa a iteração, e esta nova solução vai ser utilizada para iniciar a iteração seguinte.
1. Dada a solução tentativa corrente (, , , ..., ), defina
2. Calcule e .
3. Calcule e .
4. Identifique o componente negativo de cp que tenha o maior valor absoluto, atribua a v este valor absoluto. Em seguida, calcule
em que é uma constante selecionada entre 0 e 1 (por exemplo, 0,5).
5. Calcule como a solução tentativa para a iteração seguinte (passo 1). (Se esta solução se mantiver praticamente inalterada em relação à precedente (admitindo um valor de tolerância ), então pare pois o algoritmo convergiu.
Passo 1:
Dada a solução corrente (, , ) = (5/2, 7/2, 2), defina
Note-se que as variáveis são escalonadas.
de modo que as soluções básicas viáveis (BFs) nestas novas coordenadas são
e
Graficamente, tem-se
Passo 2:
e
Passo 3:
Passo 4:
de modo que e
Passo 5:
é a solução tentativa para a iteração 3...
O processo deve então continuar... A figura a seguir mostra a aparência da
região viável após o escalonamento baseado na solução tentativa obtida pela
3ª iteração.
Como
sempre,
o
reescalonamento
posiciona a solução teste a (, , ) = (1,1,1)
equidistante das fronteiras de restrição.
Verifique pela evolução do processo como
a
sequência
de
iterações
e
redimensionamento tem o efeito de
“deslizar" a solução ótima para (1,1,1).
Eventualmente,
depois
de
uma
quantidade suficiente de iterações, a
solução ótima estará muito perto de
após o
redimensionamento.
A figura abaixo mostra o progresso do algoritmo no sistema de coordenadas original , antes do problema ser aumentado. Os três pontos - (, ) = (2, 2), (2.5, 3.5) e (2,08, 4,92) - são as soluções tentativas para se iniciar as iterações 1, 2, e 3, respectivamente. Uma curva suave pode ser desenhada através e além destes pontos para mostrar a trajetória do algoritmo nas iterações subsequentes, à medida que ele se aproxima de (, ) = (0, 8).