Escolar Documentos
Profissional Documentos
Cultura Documentos
INTRODUÇÃO
1.1 CONTEXTUALIZAÇÃO
O problema de enumeração de vértices de um poliedro convexo limitado
(descrito por um conjunto de restrições lineares), denominado politopo, é uma
questão bastante abordada na literatura. Reimers e Stougie (2016)
estabelecem “O problema aberto é provar ou mostrar que existe uma forma de
enumeração dos vértices de um poliedro via um algoritmo de complexidade
polinomial”. Esse problema é dividido em diversas classificações, como
problemas com um tempo de execução limitado polinomialmente “com relação
ao número de vértices do politopo”. Para algoritmos baseados em poliedros
que não apresentam degeneração nos seus vértices, existem algoritmos que
rodam em tempo polinomial em relação ao número de vértices, mas a
existência de algoritmos de tempo polinomial para o caso geral não está
resolvida.
1
restrição a cada vez e onde os novos vértices produzidos estão no hiperplano
definido pela restrição que entra.
Neste trabalho é apresentada uma proposta baseada na abordagem que
utiliza os pivotamentos e mudanças de base do método Simplex-primal da
Programação Linear. A ideia principal do algoritmo proposto é converter as
equações que definem um poliedro num problema de maximização de
programação linear equivalente. Sob a hipótese de conhecer um dado vértice
do poliedro, determinam-se diversos caminhos compostos por arestas e
vértices do poliedro original. Convertendo as equações do poliedro em
restrições de um problema de maximização linear, foi utilizada a abordagem do
método Simplex, para encontrar os pontos onde podemos mudar de base.
Enquanto o método Simplex escolhe apenas o valor mais negativo nos
coeficientes associados à função objetivo, na tabela do Simplex (para encontrar
um ponto melhor ao anterior), na abordagem proposta serão buscados todos
os possíveis pontos para mudança de base. Por conta desta estratégia,
podem-se encontrar diversas bases degeneradas. Sabendo disso, o algoritmo
é baseado na abordagem Lexicográfica do método Simplex, evitando assim,
problemas de ciclagem no algoritmo proposto.
Em relação à programação de algoritmos de busca de vértices, pode-se
mencionar o código da função em Matlab “con2vert” criada por Kleder (2005),
em que utiliza uma abordagem do Simplex primal-dual. Ao final deste trabalho
o algoritmo proposto foi comparado com esse código em relação ao tempo de
execução.
2
Os objetivos específicos do presente estudo encontram-se relacionados nos
itens a seguir:
Analisar a abordagem teórica do assunto, fornecendo base suficiente
para comprovar a possibilidade o algoritmo proposto funcionar
corretamente;
Programar o algoritmo proposto para qualquer tipo de poliedro
convexo limitado (polítopo) baseado nos fundamentos teóricos
apresentados;
Comprovar a efetividade do algoritmo em enumerar os vértices de
um poliedro;
Apresentar o funcionamento do algoritmo com exemplos numéricos.
3
CAPÍTULO 2
REVISÃO TEÓRICA
𝑃 = {𝑥 ∈ ℜ : 𝐴𝑥 ≤ 𝑏, 𝑥 ≥ 0} (1)
×
onde 𝐴 ∈ ℜ e 𝑏 ∈ ℜ , com 𝑚 ≥ 𝑛. Assume-se, também aqui, que 𝑃 é
limitado (i.e., que é um polítopo).
Um vértice de um poliedro 𝑃 é um elemento 𝑥 ∗ ∈ 𝑃 que satisfaz, como
igualdades, um conjunto linearmente independente de 𝑛 das (𝑚 + 𝑛)
desigualdades que definem o poliedro 𝑃.
Um problema de otimização linear, ou de programação linear formula-se como
segui: OL ou PL: 𝑀𝑎𝑥𝑖𝑚𝑖𝑧𝑎𝑟 𝑓(𝑥) = 𝑐 𝑥
𝐴𝑥 ≤ 𝑏
𝑥≥0
Onde o conjunto de restrições está definido pelo poliedro P e tem como
objetivo maximizar a função linear 𝑐 𝑥.
O método simplex, DANTZIG e THAPA (1997); TAHA (2008), é o
algoritmo que resolve problemas de otimização linear, encontrando um vértice
ótimo pesquisando apenas um subconjunto dos K vértices do poliedro P, com
estratégias de melhora a cada iteração.
A estratégia do algoritmo simplex, que resolve um problema de PL,
responde a duas perguntas que devem ser feitas ao encontrar cada novo
vértice (ou, como se verá na Proposição 1, uma nova solução básica viável)
1. Esse vértice (ou solução básica) encontrado(a) é ótimo(a)?
2. Caso o vértice não seja ótimo, como determinar outro (ou outra
solução básica viável) melhor?
Isto, seguindo o critério de decisão ou função objetivo do problema PL, definido
pela função 𝑓(𝑥) = 𝑐 𝑥.
4
Assume-se, neste trabalho, que se conhece um vértice 𝑥 ∗ ∈ 𝑃. Para o
algoritmo a ser proposto, não é necessário assumir que todos os vértices de P
são simples.
Em Otimização Linear um vértice se chamará de simples quando uma
solução básica do problema de PL está associada a uma única base. Quando
existem bases diferentes definindo um mesmo vértice o vértice é chamado de
vértice que apresenta degeneração,
O conjunto de pontos do poliedro 𝑃 ou soluções das desigualdades em (1),
podem-se escrever como soluções do sistema,
𝑥
[𝐴 𝐼] 𝑠 = 𝑏
, (2)
𝑥 ≥ 0, 𝑠 ≥ 0
× 𝑥
onde 𝐼 ∈ ℜ denota a matriz identidade, e o vetor ∈ℜ , solução de
𝑠
(2), é vértice do poliedro 𝑃 se é solução única de 𝑛 das igualdades que
determinam (2).
𝑥
Seja ℬ ⊆ {1, … , 𝑛, 𝑛 + 1, … 𝑛 + 𝑚} e 𝑦 = ∈ℜ , denota-se por 𝑦 o
𝑠
subvector de 𝑦 e por B a submatriz de [𝐴 𝐼 ] que consistem das componentes
e das colunas indexadas por ℬ, respectivamente. Se o posto da submatriz B é
|B| = 𝑚 e a matriz B é não singular, diz-se que B é uma base de [A I].
𝑦
Considere a solução de (2) associada a uma base 𝐵, dada por 𝑦 = 𝑦 =
5
𝑠 são os subvetores de 𝑥 e 𝑠 cujos índices não estão em ℬ nem em ℬ ,
𝑥
respectivamente; i.e., soluciona o sistema:
𝑠
𝑠 0 𝑏
𝐵𝑥 +𝑁 𝑥 + + 𝑠 =
0 𝑏 (3)
𝑥 ≥ 0, 𝑥 ≥ 0, 𝑠 ≥ 0, 𝑠 ≥ 0
𝐵 0
Sendo 𝐵 = 𝐵 𝐼 não singular, resulta que 𝐵 é não singular, e de (4),
×
𝑥 =𝐵 𝑏 ≥0 e 𝑠 =𝑏 −𝐵 𝐵 𝑏 ≥ 0, onde 𝐼 ∈ℜ é uma matriz
𝑥 𝐵 𝑏
identidade. O vetor 𝑠 = ≥ 0 é solução básica viável de
𝑏 −𝐵 𝐵 𝑏
(2) associada à base 𝐵.
Note que outros vértices do poliedro 𝑃 podem ser encontrados
determinando outras bases viáveis da matriz [𝐴 𝐼 ].
6
Da proposição 1 está mostrando que todo vértice de um poliedro está
associado a uma solução básica e vice-versa, o que forma parte do sustento
algébrico e geométrico do método Simplex
𝑚𝑎𝑥𝑖𝑚𝑖𝑧𝑎𝑟 𝑧= 𝑠
∈
𝑥
𝐵 𝑁 𝐼 0 𝑥 𝑏 (5)
𝑠 =
𝐵 𝑁 0 𝐼 𝑏
𝑠
𝑥 ≥ 0, 𝑥 ≥ 0, 𝑠 ≥ 0, 𝑠 ≥ 0
𝑥 𝐵 𝑏 𝑠 0
Nota-se que 𝑥 = 𝑥 = e 𝑠= 𝑠 = 𝑏 −𝐵 𝐵 𝑏 é uma
0
𝑥
solução viável para o programa linear (5), com variáveis básicas 𝑠 ,
𝐵 0
associadas à base 𝐵 𝐼 .
𝐵 0
Assim, a tabela do Método Simplex associada à base 𝐵 𝐼 para o
𝑇= 𝑇 =
𝑥 𝑠 𝑥 𝑠 𝑑
⎡ ⎤
⎛ 0 0 0 0 −1 … − 1⎞ ⎢ 𝑑 ⎥ (6)
⎜ 𝐵 𝑏 𝐼 0 𝐵 𝑁 𝐵 ⎟=⎢ ⋮ ⎥
⎝𝑏 −𝐵 𝐵 𝑏 0 𝐼 𝑁 −𝐵 𝐵 𝑁 −𝐵 𝐵 ⎠ ⎣𝑑 ⎦
7
primeira coluna de 𝑇, [𝑇 ] , corresponde, respectivamente, ao valor da
função objetivo do programa linear (5), 𝑇 = 𝑧 = 0, avaliada na solução atual,
𝑥
, e às variáveis básicas, [𝑇 ] ∈ℬ = 𝑥 = 𝐵 𝑏 ≥ 0 e [𝑇 ] ∈ℬ = 𝑠 =
𝑠
𝑏 −𝐵 𝐵 𝑏 ≥ 0. As entradas da primeira linha de 𝑇, a partir da segunda
componente, 𝑇 , correspondem aos custos reduzidos das variáveis
8
elementos diferentes, tem um único elemento 𝑑 , tal que 𝑑 ≺ 𝑑 , ∀𝑖 ∈ 𝐽. 𝑑 é
chamado mínimo lexicográfico de {𝑑 } ∈ , denotado por 𝑑 = 𝑚𝑖𝑛 𝑙𝑒𝑥 {𝑑 , 𝑖 ∈ 𝐽}.
0.
𝑥
Desde que as variáveis básicas atuais correspondem as variáveis 𝑠 ,
9
𝑑̅
⎡ ⎤
̅
𝑇= 𝑇 = ⎢𝑑 ⎥, (8)
⎢ ⋮ ⎥
⎣𝑑̅ ⎦
obtida da tabela 𝑇, tem o seguinte formato
𝑑̅ = 𝑑 − 𝑑 ,𝑖 ≠ 𝑞
, (9)
𝑑̅ = 𝑑
Figura 1 - Vértices e aresta definidos pelas bases viáveis ℋ e ℱ do programa linear (5), onde 𝑞 ∈ ℋ, 𝑝 ∉
ℋ, ℱ = ℋ ∪ {𝑝}\{𝑞} e 𝑧ℋ < 𝑧ℱ .
10
Figura 2 - Vértices e aresta definidos pelas bases ℋ e ℱ do programa linear (5), onde 𝑞 ∈ ℋ, 𝑝 ∉ ℋ, ℱ =
ℋ ∪ {𝑝}\{𝑞} e 𝑧ℋ = 𝑧ℱ .
( ; , ) ( ; , )
Se 𝑇 >0 e 𝑇 > 0, cálculos simples mostram que introduzindo a
variável não básica 𝑟 na base e tirando da base as variáveis 𝑘 ou 𝑠,
respectivamente, na tabela 𝑇 ( ; , )
, geram-se as tabelas viáveis degeneradas
𝑇( ; , )
e 𝑇( ; , )
. Além disso, é possível gerar, a partir de 𝑇 ( ; , )
a tabela 𝑇 ( ; , )
e vice-versa. Portanto, pode se obter qualquer uma das três tabelas a partir de
qualquer outra. É possível notar que em todos os casos o valor da função
objetivo é o mesmo. A Figura 4 ilustra a participação no grafo das tabelas
(bases) indicadas.
11
Figura 3 - Obtenção das tabelas 𝑇 ( ; , ), 𝑇 ( ; , ) e 𝑇 ( ; , ) , por mudança de bases, umas a partir das outras,
por uma única variável.
Prova:
Considerando que a tabela 𝑇 se obtém da tabela 𝑇 pela entrada da variável
não básica 𝑠 e a saída da variável básica 𝑟. Assim, 𝑇 é gerada de 𝑇
substituindo as colunas correspondentes às variáveis 𝑠 e 𝑟 pelas respectivas
colunas transformadas segundo as regras de pivotamento lexicográfico e as
relações (8) e (9); i.e.,
𝑇 𝑇 −𝑇 ⁄𝑇
⎡ ⎤ ⎡0⎤ ⎡ ⎤ ⎡ ⎤
⎢𝑇 ⎥ ⎢0⎥ ⎢𝑇 ⎥ ⎢ −𝑇 ⁄𝑇 ⎥
⎥ = ⎢ ⋮ ⎥ e [𝑇 ] ⋮
[𝑇 ] =⎢ ⋮ =⎢ ⋮ ⎥=⎢ ⎥. (11)
⎢𝑇 ⎥ ⎢1⎥ ⎢𝑇 ⎥ ⎢ 1 ⁄𝑇 ⎥
⎢ ⋮ ⎥ ⎢⋮⎥ ⎢ ⋮ ⎥ ⎢ ⋮ ⎥
⎣𝑇 ⎦ ⎣0⎦ ⎣𝑇 ⎦ ⎣−𝑇 ⁄𝑇 ⎦
12
Nota-se que, pelas regras de transformação, 𝑇 ≤ 0, = 𝑚𝑖𝑛 𝑙𝑒𝑥 :𝑇 >
13
CAPÍTULO 3
METODOLOGIA
14
Fazer
𝑘 ≔ 1; 𝑥 : = 𝑥; 𝑉é𝑟𝑡𝑖𝑐𝑒𝑠 ≔ {𝑥 };
ℬ ≔ {í𝑛𝑑𝑖𝑐𝑒𝑠 𝑏á𝑠𝑖𝑐𝑜𝑠 𝑑𝑒𝑡𝑒𝑟𝑚𝑖𝑛𝑎𝑑𝑜𝑠 𝑝𝑒𝑙𝑜 𝑣é𝑟𝑡𝑖𝑐𝑒 𝑥 };
ℵ ≔ 𝑁 ∪ 𝑁 ≔ {í𝑛𝑑𝑖𝑐𝑒𝑠 𝑛ã𝑜 𝑏á𝑠𝑖𝑐𝑜𝑠 𝑑𝑎𝑠 𝑣𝑎𝑟𝑖á𝑣𝑒𝑖𝑠 𝑥 e 𝑠};
𝑇 ≔ tabela associada ao vértice 𝑥 , dada em (5);
ℬ ∶= ℬ; ℵ: = ℵ; 𝐵𝑎𝑠𝑒𝑠: = {ℬ }; 𝐸𝑛𝑡𝑟𝑎𝐵𝑎𝑠𝑒: = 0; ℳ ∶= ∅.
Prova:
15
Desde que o poliedro 𝑃 é convexo e limitado, o Algoritmo 1 determina, para
cada variável não básica que entra na base, no Passo 1, uma sequência de
pontos que irá terminar ou em uma solução de (5) ou em um vértice já
encontrado numa sequência anterior. Assim, sendo ℵ ≔ 𝑁 ∪ 𝑁 , conjunto
inicial de índices não básicos, no Passo 0, finito, tem-se que o Algoritmo é
finito.
Por outro lado, para provar que todos os vértices do poliedro 𝑃 são
encontrados, suponha que existe um vértice 𝑣 do poliedro que não foi
encontrado pelo Algoritmo 1. Então, de acordo à proposição 3 e à Observação
2, existe uma sequência de vértices que vai de 𝑣 , até o vértice inicial, onde
nenhum desses vértices foi encontrado pelo Algoritmo. O que contradiz o fato
de que do vértice inicial só pode sair através de um vértice que o Algoritmo 1
encontra. Portanto, todos os vértices do poliedro 𝑃 são encontrados.
16
CAPÍTULO 4
EXEMPLOS NUMÉRICOS
𝑥 + 𝑥 + 𝑥 ≤ 3 ← 𝐵𝐶𝐺𝐹
𝑥 + 𝑥 − 𝑥 ≥ 1 ← 𝐴𝐷𝐻𝐾
−𝑥 + 𝑥 + 𝑥 ≤ 1 ← 𝐴𝐵𝐹𝐾
𝑥 − 𝑥 + 𝑥 ≤ 1 ← 𝐷𝐶𝐺𝐻
16𝑥 − 6𝑥 + 60𝑥 ≤ 37 ← 𝐹𝐼𝐺
(12)
6𝑥 − 16𝑥 + 60𝑥 ≤ 17 ← 𝐾𝐼𝐻
6𝑥 − 6𝑥 + 60𝑥 ≤ 27 ← 𝐾𝐼𝐹
16𝑥 − 16𝑥 + 60𝑥 ≤ 27 ← 𝐺𝐼𝐻
𝑥 − 2𝑥 + 20𝑥 ≤ 8 ← 𝐸𝐹𝐼𝐽
𝑥 ≥ 0, 𝑥 ≥ 0, 𝑥 ≥ 0
17
dado resulta um conjunto determinado por 12 restrições de desigualdade e 12
variáveis não negativas, onde as primeiras 3 variáveis correspondem a 𝑥 , 𝑥 e
𝑥 e as últimas 9 às variáveis de folga das respectivas desigualdades (𝑠 , … , 𝑠 )
correspondem a 𝑥 , … , 𝑥 .
Figura 4 - Ilustração do poliedro (12), mostrando vértices relevantes (note que a pirâmide EFIJK de base
EFIJ não pertence ao poliedro definido pelas restrições em (12)).
18
Portanto, a Figura 6 mostra o mapeamento realizado pelo algoritmo. O
primeiro ponto, ou o ponto de partida, é o ponto 𝐼 , com as variáveis não
básicas {9,11,12}. Na tabela simplex desse vértice (Figura 8, pag. 24) é
possível realizar a mudança de base em qualquer uma das 3 variáveis não
básicas (todas do mesmo valor, -1). Logo, têm-se 3 caminhos iniciais
diferentes: o primeiro, quando a variável 9 entra na base (mostrado em
vermelho na Figura 6); o segundo, quando a variável 11 entra na base
(mostrado em azul na Figura 6); e o terceiro, quando a variável 12 entra na
base (mostrado em verde na Figura 6). Cada caminho complementa os vértices
encontrados pelos outros caminhos, como ilustra a Figura 6. É possível
observar, portanto, que o vértice I, apresenta degeneração, pois possuí 4
planos que o definem (mais de um caminho sai dele) como pode ser observado
na Figura 5.
O algoritmo identifica as variáveis a sair e entrar na base, realizando os
respectivos pivotamentos. Por exemplo, no primeiro retângulo da Figura 6, se
encontra o ponto 𝐼 , seguindo a linha vermelha, entra à base a variável 9. No
retângulo seguinte é possível notar que a variável 8 se tornou não básica, no
lugar da variável 9. Nesse segundo retângulo ainda estamos no ponto 𝐼 , mas
associado a uma base diferente em relação ao retângulo anterior, onde as
variáveis não básicas atuais são {8,11,12}. Neste caso, verifica-se que tanto as
variáveis não básicas 11 quanto a 12, podem aumentar o valor objetivo da
função 𝑧, do programa linear (5) associado (pois ambos seus custos reduzidos
resultam negativos). Assim, ao introduzir as variáveis não básicas 11 e 12 se
geram os ramos vermelhos da esquerda e da direita, respectivamente, com os
,
vértices 𝐹 e 𝐺, indicados na Figura 6 como 𝐹 : {4,8,12} e 𝐺 : {4,8,11}.
Continuando dessa forma, chega-se à solução ótima 𝐵 : {3,4,6} e o ramo
vermelho é encerrado. Foram gerados sequencialmente os novos vértices 𝐹, 𝐵,
𝐺 e 𝐶. Analogamente, geram-se os ramos azul e verde da Figura 6,
encontrando os novos vértices 𝐽, 𝐸 e 𝐴 e 𝐻 e 𝐷, respectivamente. É possível
notar que o ramo verde finaliza em, além do vértice ótimo 𝐵, nos vértices 𝐽, 𝐶 e
𝐺, já encontrados exatamente com as mesmas bases. Observando a Figura 6 é
possível perceber que todos os vértices, do poliedro exemplo na relação (12),
foram encontrados.
19
No Anexo A, Figura 29 (pag. 47), apresenta-se o mapeamento completo do
problema utilizando apenas o algoritmo Simplex-Primal, sem a incorporação do
código do algoritmo lexicográfico. Comparando a Figura 6 com a Figura 29 do
Anexo A, é possível notar uma significativa redução de pivotamentos para
encontrar todos os vértices. Isso ocorre principalmente pela implementação da
abordagem lexicográfica, que seleciona os melhores pontos para a realização
dos pivotamentos na tabela simplex, mesmo em bases degeneradas, como foi
encontrado diversas vezes neste exemplo. Este mapeamento ainda foi
simplificado, pois encontrando valores de bases que já haviam sido calculados,
foi determinado não continuar com o mapeamento, pois provavelmente seriam
encontrados problemas de ciclagem.
Figura 5 - Ilustração do poliedro (12), mostrando os seus vértices, o vértice inicial I e as sequências de
vértices encontrados pelo algoritmo (na ordem: vermelho, azul, verde).
20
Figura 6 - Sequencias de vértices do poliedro (12) encontradas pelo algoritmo, a partir do vértice
𝐼 : {9,11,12}.
21
CAPÍTULO 5
PROGRAMAÇÃO EM MATLAB
22
Figura 7 - Dados necessários para execução do programa na linguagem Matlab
23
básicos terão valores diferentes de 0, neste caso {−1, −1, −1} para as variáveis
9, 11 e 12, respectivamente, na Figura 8.
Figura 8 - Tabela simplex do vértice I, vértice inicial necessário para o algoritmo proposto. (saída do
Matlab)
1
Custo Reduzido é o nome dado aos coeficientes da segunda linha da matriz da tabela do
algoritmo simplex. Utilizado para orientar as melhoras da função objetivo de um problema de
programação linear.
24
10 será considerado como o número 0. Esse critério foi implementado para
evitar que o programa encontrasse o mesmo vértice, porém considerasse ele
como diferente do outro.
Essa tabela segue o padrão definido na seção 2.2, na equação (6). Perceba
que nessa tabela os três índices que não estão na base (9, 11, 12) podem
entrar na base, pois todos possuem índices negativos na segunda linha. O
método simplex tradicional deveria escolher apenas um ponto para continuar
suas iterações, porém, como o foco do algoritmo proposto é a enumeração de
vértices, e não somente a otimização da função objetivo z do problema
proposto, o código preparado irá realizar a mudança de base para todas as
variáveis que possuem o índice negativo, tanto nessa tabela, quanto em
tabelas futuras. Além disso, o programa já armazena os índices e os vértices
encontrados. Nesse caso, ele armazena um vetor valendo [0 1.0 1.0 0.45],
sendo o primeiro elemento o valor da função objetivo ao índice associado (para
o ponto 𝐼, sempre será 0), e os restantes valores as coordenadas das variáveis
(𝑥 , 𝑥 , 𝑥 ) no vértice I.
25
Passo 4: O programa verifica quais elementos da segunda linha (que são
os valores dos custos reduzidos do método Simplex associados à função
objetivo) são negativos. Ao encontrar um valor negativo (na Figura 9, ele
encontraria primeiro a variável 9) o programa começa realizar as operações de
pivotamento lexicográfico, conforme descrito na seção 2.2.1, para determinar
qual deverá sair da base. Os resultados são organizados em uma matriz,
chamada de candidatosMinLex, na qual a primeira linha é o menor índice
lexicográfico. O número da variável não está em evidência nessa matriz, porém
o programa armazenou anteriormente o valor do índice das variáveis,
informando abaixo da matriz, a variável que sai da base (Figura 11).
Figura 10 - Tabela dos valores organizados lexicograficamente. Primeira iteração do algoritmo proposto
Passo 5: Assim que o programa define quem sai da base, ele já realiza a
permutação e armazena os índices básicos e não básicos novos na
“tabelaTrocas”, conforme mostra a Figura 11. Vale ressaltar que a primeira
linha já foi criada automaticamente, ao definir o ponto inicial.
26
primeiros índices em cada linha, corresponde às variáveis básicas para a
montagem de novas tabelas Simplex, enquanto os 3 últimos correspondem às
variáveis não básicas. Após o armazenamento da permutação encontrada, o
programa volta para o passo 4, onde ele vai realizar agora o pivotamento
lexicográfico para o índice 11 e armazenar a permutação encontrada na nova
“tabelaTrocas”. Novamente, ele volta ao passo 4, onde existe último elemento
negativo da linha associada à função objetivo. Dessa vez com a variável 12,
realizando os mesmos procedimentos, encontrado, finalmente, a nova e última
“tabelaTrocas” (Figura 12) da tabela para as variáveis básicas
(1,2,3,4,5,6,7,8,10). Portanto, é possível concluir, observando a “tabelaTrocas”
que a primeira permutação foi da variável 9 pela 10, a segunda permutação, da
variável 11 pela 5, e a terceira iteração, da variável 12 pela 7.
Figura 12 - Última "tabelaTrocas" para a base (1,2,3,4,5,6,7,8,10) do algoritmo proposto
27
Passo 7: Nesse último passo o programa utiliza a tabela dos
“verticesEncontrados” (Figura 13) atualizada pelo passo 2 de cada iteração e
excluí os vértices iguais.
É possível notar observando a Figura 13 que foram encontrados várias
vezes alguns pontos, por exemplo o ponto 𝐼(1.0, 1.0, 0.45) que foi encontrado 3
vezes, ou o ponto 𝐺(1.75, 1.0, 0.25), encontrado 4 vezes. Isso ocorre pelo fato
de existirem fortes degenerações no problema. Isso afirma o que foi
mencionado no Capítulo 2, principalmente sobre a escolha do algoritmo
lexicográfico implementado. Embora trabalhando com o código que implementa
o método lexicográfico, não foi possível escapar dos problemas causados pela
degeneração, porém esse método se mostrou eficiente, evitando numerosos
passos indesejáveis, como pode-se ver na Figura 29 no Anexo 1, pag. 47, e
evitando a formação de ciclos infinitos, conhecido como problema da ciclagem.
29
Figura 15 - Tempo de execução do algoritmo proposto extraído de relatório fornecido pelo Matlab
30
𝑥 + 𝑥 + 𝑥 ≤ 3 ← 𝐵𝐶𝐺𝐹
𝑥 + 𝑥 − 𝑥 ≥ 1 ← 𝐴𝐷𝐻𝐾
−𝑥 + 𝑥 + 𝑥 ≤ 1 ← 𝐴𝐵𝐹𝐾
𝑥 − 𝑥 + 𝑥 ≤ 1 ← 𝐷𝐶𝐺𝐻
16𝑥 − 6𝑥 + 60𝑥 ≤ 37 ← 𝐹𝐼𝐺 (13)
6𝑥 − 16𝑥 + 60𝑥 ≤ 17 ← 𝐾𝐼𝐻
6𝑥 − 6𝑥 + 60𝑥 ≤ 27 ← 𝐾𝐼𝐹
16𝑥 − 16𝑥 + 60𝑥 ≤ 27 ← 𝐺𝐼𝐻
𝑥 ≥ 0, 𝑥 ≥ 0, 𝑥 ≥ 0
31
Figura 17 - Dados para o exemplo complementar 1 na linguagem do Matlab
32
Figura 18 - Matriz dos vértices encontrados para o exemplo complementar 1
5.2.2 Exemplo 2
Como segundo exemplo complementar, foi adicionada uma nova variável 𝑥
ao exemplo principal, na relação (12). O novo exemplo, portanto, é definido por:
𝑥 +𝑥 +𝑥 +𝑥 ≤3
𝑥 +𝑥 −𝑥 −𝑥 ≥1
−𝑥 + 𝑥 + 𝑥 + 𝑥 ≤ 1
𝑥 −𝑥 +𝑥 +𝑥 ≤1
16𝑥 − 6𝑥 + 60𝑥 + 𝑥 ≤ 37
(14)
6𝑥 − 16𝑥 + 60𝑥 + 𝑥 ≤ 17
6𝑥 − 6𝑥 + 60𝑥 + 𝑥 ≤ 27
16𝑥 − 16𝑥 + 60𝑥 + 𝑥 ≤ 27
𝑥 − 2𝑥 + 20𝑥 + 𝑥 ≤ 8
𝑥 ≥ 0, 𝑥 ≥ 0, 𝑥 ≥ 0, 𝑥 ≥ 0
34
Figura 21 - Dados para o exemplo complementar 2 na linguagem do Matlab
35
Figura 22 - Matriz dos vértices encontrados para o exemplo complementar 2, extraído do relatório
fornecido pelo Matlab
Figura 23 - Matriz dos vértices do poliedro do exemplo complementar 2, extraído do relatório fornecido
pelo Matlab
36
Em relação ao tempo de execução, o programa ainda tem sua execução
abaixo de 0,1s. Mesmo adicionando uma nova variável e realizando mais
iterações o programa teve um tempo de execução menor que o exemplo
principal, conforme ilustra a Figura 24.
37
facilmente solucionado deixando os índices na matriz, como se mostrou na
Figura 9. A primeira linha da matriz é composta pelos índices das variáveis, e
para que as mudanças fossem realizadas corretamente, eles tiveram de ser
mantidos dessa forma.
A segunda principal dificuldade da programação foi conseguir definir uma
ordem para a realização das mudanças de base. Na execução manual do
algoritmo era escolhido um caminho e realizado a mudança para ele. Na Figura
6, por exemplo, o primeiro caminho poderia ser a coluna em vermelho. A partir
disso, eram realizadas as mudanças a partir desse caminho. Caso o próximo
passo criasse mais de um caminho, esse passo era marcado, um caminho era
escolhido, até que se chegasse a um fim. Chegando no final, voltar-se-ia pelo
caminho andado, procurando os caminhos marcados por bifurcações. Essas
bifurcações eram resolvidas, até que todo o caminho vermelho fosse traçado.
Após isso, outro caminho foi selecionado (o azul, por exemplo), até que todos
os caminhos principais fossem resolvidos. Porém na programação em
MATLAB, tal programação não seria possível em uma ordem tão exata. Para a
solução desse problema foi a criação da “tabelaTrocas” (Figuras 12 e 13).
Nessa tabela são registradas todas as bases que podem ser trocadas. Em um
passo que encontra 4 mudanças possíveis, serão adicionadas essas 4 novas
bases na “tabelaTrocas”. Como cada base só pode ser executada sozinha, o
programa vai adicionando as linhas da “tabelaTrocas” e resolvendo elas na
ordem adicionada. Caso uma execução tente adicionar uma linha de bases que
já foi adicionada anteriormente, a “tabelaTrocas” rejeita essa linha, pois se não
o fizesse, o programa nunca iria parar. Ao chegar na última linha, e não for
possível adicionar mais nenhuma, significa que o programa rodou por todas as
bases possíveis, mesmo não sendo na ordem da Figura 6.
Esses foram os maiores problemas durante a programação do algoritmo.
Alguns problemas pequenos foram também encontrados, mas rapidamente
resolvidos, como: a criação do critério de parada, criada para que quando não
fosse possível mais adicionar linhas na “tabelaTrocas” a partir da última linha, o
programa parasse de executar as iterações; a criação da matriz
“VerticesDoPoliedro” (Figuras 14, 19 e 23), armazenando somente um vértice
de cada valor associado à função objetivo; problemas na programação do
38
pivotamento lexicográfico, que consistiu somente na dificuldade da
programação propriamente dita.
39
Figura 25 - Tempo de execução do con2vert.m para o exemplo principal, extraído do relatório fornecido
pelo Matlab
40
Figura 26 - Tempo de execução do con2vert.m para o exemplo complementar 1, extraído do relatório
fornecido pelo Matlab
41
Comparando a Figura 27 com a Figura 23, é possível perceber que o
con2vert.m conseguiu encontrar os mesmos vértices que o algoritmo proposto.
Porém, foram marcadas com um “?” as anomalias encontradas no resultado
dos vértices. A quarta linha da matriz, é semelhante à terceira linha, ambas
correspondendo ao vértice I. Porém na 4 linha foi encontrado um -0.0000, uma
aproximação para −1,0 . 10 . Por esse motivo, foi implementado no algoritmo
proposto a aproximação de 6 dígitos de precisão, conforme mencionado no
Passo 2 no início do capítulo 5.
Outra linha que chama atenção na Figura 27 é a 12ª linha, onde foram
encontrados os erros NaN e Inf. No Matlab, o erro NaN corresponde a
expressão “Not-a-Number”, ou seja, não é um número, já o Inf corresponde a
“Infinite”, ou seja, infinito. Não é possível ter certeza do motivo desse erro,
porém, provavelmente, ele encontrou alguma divisão por 0 nesse passo, o que
pode ter acarretado erros de arredondamento, o que retornou essas
mensagens de erro.
Anomalias a parte, o con2vert.m consegue encontrar os vértices que foram
propostos. O tempo de execução é ilustrado na Figura 28. O algoritmo aqui
proposto executou o problema em 0,042s, enquanto o con2vert.m levou
0,063s.
42
CAPÍTULO 6
CONCLUSÕES
De acordo com o que foi apresentado, foi possível concluir que os objetivos
deste trabalho foram completados. O novo algoritmo proposto foi testado e
funcionou corretamente tanto manualmente, como discutido no capítulo 4,
quanto em sua programação em linguagem MATLAB.
O algoritmo proposto é baseado em pivotamentos do método Simplex
primal evitando degeneração via a implementação lexicográfica. Pelas
dificuldades encontradas na implementação, espera-se que funcione para
qualquer poliedro, mas a complexidade de tempo polinomial em termos do
número de bases só será garantida para polítopos, segundo Reimers e Stougie
(2016).
O MATLAB como ferramenta de programação foi de grande ajuda,
principalmente pelo fato do trabalho utilizar diversas matrizes para a
implementação do algoritmo. Além de ser uma ferramenta excelente de
programação de matrizes, o programa se mostrou simples de ser utilizado,
apresentando poucos problemas durante a codificação do algoritmo proposto.
Em relação ao novo algoritmo apresentado, ele pode ser facilmente
implementado para problemas de enumeração de vértices de um poliedro
definido por 𝑃 = {𝑥 ∈ ℜ : 𝐴𝑥 ≤ 𝑏, 𝑥 ≥ 0}. Usando o programa codificado, basta
inserir as restrições do problema e o ponto inicial, conforme realizado nos
exemplos do Capítulo 5.
A abordagem por pivotamentos da tabela Simplex permitiu que o algoritmo
se mantivesse com a facilidade de implementação, porém sempre eficiente.
Além disso, a implementação da abordagem lexicográfica também foi
essencial, principalmente pelo fato de que o algoritmo proposto trabalha com
mudanças de bases fortemente degeneradas, como as bases encontradas
pelos exemplos do capítulo 5, em que foram encontrados os mesmos vértices
mudando as bases. Com a implementação dessa abordagem lexicográfica, o
programa se mantém seguro em relação aos problemas de ciclagem.
A comparação com outra função de enumeração de vértices demonstrou
que o tempo de execução está no mesmo nível, superando a outra função em
43
alguns exemplos. É importante lembrar que o con2vert.m é um programa já
estabelecido na biblioteca do Matlab, portanto é uma função mais otimizada na
sua implementação computacional do que a do algoritmo aqui proposto. E
mesmo com essa diferença de otimização, os tempos ficaram muito similares.
Como trabalho futuro, recomenda-se a pesquisa mais aprofundada da
complexidade do algoritmo proposto. Recomenda-se também a realização de
testes em mais problemas numéricos, para estudar o comportamento do
algoritmo e o tempo de execução do programa.
44
REFERÊNCIAS
BALINSKI, M.L. An algorithm for finding all vertices of convex polyhedral sets.
SIAM Journal on Applied Mathematics, 9:72-81, 1961.
BLAND, R.G. New finite pivoting rules for the simplex method. Mathematics of
Operations Research, p. 103–107, 1977.
45
KHACHIYAN, L.; BOROS, E.; BORYS, K.; ELBASSIONI, K; GURVICH, V.
Generating All Vertices of a Polyhedron is Hard. Discrete and Computational
Geometry. 39(1-3): 174-190. 2008.
46
ANEXO A – MAPEAMENTO COMPLETO DO POLIEDRO (12)
𝐹10 𝐵97
𝐹10 𝑪𝟒𝟎
𝑁 = {4, 𝟔, 𝟖} 𝑁 = {3,4,6}
𝑁 = {4,6,12} 𝑁 = {3,4,7}
𝐶 40 𝐺 10,75 𝑩𝟗𝟕
𝑁 = {3,4,7} 𝑁 = {4,7,8} 𝑁 = {3,4,6}
𝐼0
𝑁 = {9,11,12}
Vértices encontrados: I, F, B, G, C
𝑱𝟒,𝟏𝟔𝟔𝟕
𝑁 = {5,9,12}
𝐹10 𝑬𝟖,𝟑𝟖𝟏𝟎
𝐹 10 𝑁 = {𝟓, 6, 𝟏𝟐} ∗ 𝑨𝟖𝟔 𝐴86
𝑁 = {6,8,12} 𝑁 = {1,3,6}
𝑁 = {4,6,12} 𝑁 = {1, 𝟓, 𝟔}
𝐹10 𝐴86
𝐹10 𝐴86
𝑁 = {6,10,12} 𝑁 = {3,5,6} ∗ 𝐵97
𝑁 = {4,6,8} 𝐵 97 𝑁 = {1,3,5}
𝑁 = {3,4,6}
𝑁 = {3,4,6}
𝐸𝐻𝑒𝐶𝑜𝑟𝑡𝑒𝐼 4,1667
𝐻2,5 Vértices encontrados: I, F, B, G, C, 𝐽, E, A
𝑁 = {5,9,12}
𝑁 = {5, 𝟕, 𝟗} ∗
𝐼0 𝐺 10,75
𝐻2,5 𝑁 = {9,11,12} ∗ 𝑁 = {4,7,11}
𝑯𝟐,𝟓 𝐻2,5
𝑁 = {7, 𝟗, 𝟏𝟏} ∗
𝑁 = {5, 𝟗, 𝟏𝟏} 𝑁 = {𝟓, 7, 𝟏𝟏} ∗
𝐻2,5 𝐺 10,75
𝐷29 𝑁 = {5,9,12} 𝑁 = {7,8,11}
𝑁 = {3,5,7} 𝐷29 𝑫𝟐𝟗
𝐷 29 𝑁 = {2, 𝟓, 𝟕} ∗ 𝑁 = {3, 𝟓, 𝟕} ∗ 𝐺 10,75
𝐷29 𝑁 = {𝟐, 3, 𝟕} 𝑁 = {4,7,8}
10,75
𝑁 = {2,5,7} 𝐺
𝑁 = {4,7, 11}
𝐷29 𝐶 40
𝑁 = {2,3,5} ∗ 𝑁 = {3,4,7}
𝐺 10,75
𝑁 = {7,8,11}
𝐴86
40 𝑁 = {1,3,5}
𝐶
𝑁 = {3,4,7}
Vértices encontrados: I, G, C, B, F, 𝐽, 𝐸, A, H, D
47
APÊNDICE
𝑐𝑜𝑛𝑣(Ω) = {𝑥 ∈ ℜ : 𝑥 = ∑ 𝛼𝑥 ;∑ 𝛼 = 1 , 𝛼 ≥ 0 𝑒 𝑥 ∈ Ω, ∀i}.
Figura 30 - O desenho da esquerda mostra o fecho convexo de um conjunto Ω_1, de pontos discretos
(representado pelos pontos em preto), e o desenho da direita mostra o fecho convexo de Ω_2 formado
pelas duas elipses em cinza.
Ω Ω
Exemplos
48
2-Sejam os pontos 𝑋2 = {(0,0), (0,1), (1,0)} em ℜ . O 2-simplex definidos
por 𝑋2 está definida pela envoltória convexa, ou fecho convexo, de 𝑋2,
𝑐𝑜𝑛𝑣(𝑋2)={𝑜 𝑝𝑜𝑙𝑖𝑔𝑜𝑛𝑜 𝑡𝑟𝑖𝑎𝑛𝑔𝑢𝑙𝑎𝑟 𝑑𝑒𝑓𝑖𝑛𝑖𝑑𝑜 𝑝𝑒𝑙𝑜𝑠 𝑝𝑜𝑛𝑡𝑜𝑠 𝑒𝑚 𝑋2}. Observar que
os vetores definidos pelos pontos de 𝑋2, {𝑒 = (1,0) − (0,0), 𝑒 = (0,1) − (0,0)}
são linear independentes eles são os canônicos. É chamado 2-simplex padrão.
3- Sejam os pontos 𝑋3 = {(0,0,0), (0,0,1), (0,1,0)}, (1,1,1) em ℜ . O 3-simplex
definidos por 𝑋3 é a envoltória convexa ou fecho convexo de 𝑋3,
𝑐𝑜𝑛𝑣(𝑋3)={𝑜 𝑡𝑒𝑡𝑟𝑎𝑒𝑑𝑟𝑜 𝑑𝑒𝑓𝑖𝑛𝑖𝑑𝑜 𝑝𝑒𝑙𝑜𝑠 𝑝𝑜𝑛𝑡𝑜𝑠 𝑒𝑚 𝑋3}.
Na figura 31, se esboçam as representações de simplexes não
necessariamente n-simplexes padrões.
Figura 31 - Mostram-se as configurações de 1-simplex em R, 2-simplex (um triângulo) em R^2, e um 3-
simplex (tetraedro em ℜ )
Fonte: https://www.haroldserrano.com/blog/visualizing-the-gjk-collision-algorithm.
49