lo
U NIVERSIDADE F EDERAL DE G OIÁS
I NSTITUTO DE I NFORMÁTICA
Mo
de
S ANTIAGO VALDÉS R AVELO
Modelos Matemáticos e Algoritmos
para Problemas Combinatórios
Goiânia
2011
U NIVERSIDADE F EDERAL DE G OIÁS
I NSTITUTO DE I NFORMÁTICA
AUTORIZAÇÃO PARA P UBLICAÇÃO DE D ISSERTAÇÃO
EM
F ORMATO E LETRÔNICO
Na qualidade de titular dos direitos de autor, AUTORIZO o Instituto de
Informática da Universidade Federal de Goiás – UFG a reproduzir, inclusive em outro
formato ou mídia e através de armazenamento permanente ou temporário, bem como a
publicar na rede mundial de computadores (Internet) e na biblioteca virtual da UFG,
entendendo-se os termos “reproduzir” e “publicar” conforme definições dos incisos VI
e I, respectivamente, do artigo 5o da Lei no 9610/98 de 10/02/1998, a obra abaixo
especificada, sem que me seja devido pagamento a título de direitos autorais, desde que
a reprodução e/ou publicação tenham a finalidade exclusiva de uso por quem a consulta,
e a título de divulgação da produção acadêmica gerada pela Universidade, a partir desta
data.
Título: Modelos Matemáticos e Algoritmos para Problemas Combinatórios –
Autor(a): Santiago Valdés Ravelo
Goiânia, 18 de Fevereiro de 2011.
Santiago Valdés Ravelo – Autor
Dr. Cláudio Nogueira de Meneses – Orientador
S ANTIAGO VALDÉS R AVELO
Modelos Matemáticos e Algoritmos
para Problemas Combinatórios
Dissertação apresentada ao Programa de Pós–Graduação do
Instituto de Informática da Universidade Federal de Goiás,
como requisito parcial para obtenção do título de Mestre em
Ciências da Computação.
Área de concentração: Otimização Combinatória.
Orientador: Prof. Dr. Cláudio Nogueira de Meneses
Goiânia
2011
S ANTIAGO VALDÉS R AVELO
Modelos Matemáticos e Algoritmos
para Problemas Combinatórios
Dissertação defendida no Programa de Pós–Graduação do Instituto
de Informática da Universidade Federal de Goiás como requisito parcial para obtenção do título de Mestre em Ciências da Computação,
aprovada em 18 de Fevereiro de 2011, pela Banca Examinadora constituída pelos professores:
Prof. Dr. Cláudio Nogueira de Meneses
Instituto de Informática – UFG
Presidente da Banca
Prof. Dr. Humberto José Longo
Instituto de Informática – Universidade Federal de Goiás
Prof. Dr. Reinaldo Morabito
Departamento de Engenharia de Produção – Universidade Federal de São Carlos
Todos os direitos reservados. É proibida a reprodução total ou parcial do
trabalho sem autorização da universidade, do autor e do orientador(a).
Santiago Valdés Ravelo
Graduou-se Ciências da Computação na Universidade da Havana, Cuba
(2007). Durante sua graduação foi monitor no departamento de Matemática
Aplicada da Faculdade de Matemática e Ciências da Computação da Universidade da Havana e membro do grupo de pesquisa deste departamento.
Fez iniciação científica desenvolvendo modelos matemáticos e implementado algoritmos para localizar o centro de furacões tropicais, que resultou em
um software para o Intituto de Meteorologia de Cuba. Atualmente, cursa o
mestrado na Universidade Federal de Goiás e trabalha na área de otimização
combinatória, estudando diferentes problemas para os que propõe modelos
matemáticos e projeta vários algoritmos.
A Fernan, quem sempre será meu irmãozinho.
Agradecimentos
Gostaria de expressar minha gratidão ao meu orientador, o professor Cláudio
Nogueira de Meneses, por ter confiado em mim e dar-me a oportunidade de crescer como
cientista. Sem sua orientação, paciência e estímulo, este trabalho não teria sido finalizado.
Sou muito grato aos professores Humberto José Longo e Maristela Oliveira dos
Santos, por seus conselhos e auxílios.
Meu sincero agradecimento aos meus pais que me deram uma educação excepcional, não só em conhecimentos senão também em valores humanos.
Quero agradecer as minhas tias e especialmente a minha avó pelo constante apoio
que me deram.
Também sou grato ao pessoal da secretaria e da coordenação da pós-graduação
do INF-UFG, pela ajuda que me ofereceram durante o mestrado.
Agradeço aos meus amigos, colegas de classe, e todas aquelas pessoas que de
uma forma ou outra me ajudaram, apoiaram ou confiaram em mim.
Muito obrigado a todos vocês.
Não existem métodos fáceis para resolver problemas difíceis
René Descartes,
.
Resumo
Ravelo, Santiago Valdés. Modelos Matemáticos e Algoritmos para Problemas Combinatórios. Goiânia, 2011. 94p. Dissertação de Mestrado. Instituto
de Informática, Universidade Federal de Goiás.
Este trabalho considera três problemas, NP-difíceis, relevantes de estudo em otimização
combinatória. O primeiro deles é o problema de corte uni-dimensional de objetos,
onde o material não usado pelos padrões de corte pode ser usado no futuro. Para este
problema analisamos os modelos matemáticos existentes, propomos novos modelos,
projetamos uma heurística construtiva e duas metaheurísticas, sendo seus desempenhos
melhorados com programação paralela, e resolvemos instâncias, práticas e aleatórias,
encontradas na literatura; sendo os experimentos computacionais muito bons para todas as
intâncias testadas. O segundo problema que consideramos é o problema dos companheiros
estáveis (stable roommates problem), uma variante do problema de emparelhamento
estável (stable matching problem). Para este propomos dois modelos matemáticos, uma
implementação sequencial e uma paralela de uma Tabu Search, e um Branch-andBound. Também reportamos experimentos computacionais para instâncias do problema.
O último problema considerado é o da mochila compartimentada (uma generalização do
problema clássico da mochila), para o qual analisamos uma modelagem quadrática inteira
e propomos um modelo linear inteiro; também projetamos uma heurística gulosa, um
algoritmo GRASP, que usa path-relinking, e resolvemos intâncias geradas aleatóriamente.
Todas as implementações em paralelo usam unidades de processamento gráfico (Graphics
Processing Units, GPUs).
Palavras–chave
Otimização Combinatória, Problema de Corte, Stable Matching Problem, Problema da Mochila, Modelos Matemáticos, Heurísticas.
Abstract
Ravelo, Santiago Valdés. Mathematical Models and Algorithms to Combinatorial Problems. Goiânia, 2011. 94p. MSc. Dissertation. Instituto de Informática, Universidade Federal de Goiás.
This work considers three relevant NP-hard problems. The first one is the one-dimensional
cutting stock problem in which the non-used material in the cutting patterns may be used
in the future. For this problem we analyze the existing mathematical models, propose new
models, design a heuristic and two metaheuristic approaches, being their performances
improved by using parallel programming, and solve instances, practical and randomly
generated, from the literature. The computational experiments were quite good for all
tested instances. The second problem we consider is the stable roommates problem (a
variant of the stable matching problem). For this we give two mathematical programming
models, sequential and parallel implementations of a Tabu Search, and a Branch-andBound. Also, we report computational experiments to instances of the problem. The
last problem we consider is the compartmentalized knapsack problem (a generalization
of the knapsack problem) for which we analyze a quadratic integer model and give a
linear integer model. We design a greedy heuristic and a GRASP algorithm, that uses
path-relinking, and solve randomly generated instances. All parallel implementations use
Graphics Processing Units (GPUs).
Keywords
Combinatorial Optimization, Cutting Problem, Stable Matching Problem, Knapsack Problem, Mathematical Models, Heuristics.
Sumário
Lista de Figuras
11
Lista de Tabelas
12
Lista de Algoritmos
14
Lista de Códigos de Programas
15
1
Introdução
16
2
Problema de Corte Uni-dimensional de Objetos com Retalhos
19
20
2.1
2.2
Definição do Problema de Corte Uni-dimensional de Objetos com Retalhos
Modelos Matemáticos para o Problema de Corte Uni-dimensional de Objetos
com Retalhos
2.2.1
Modelos Matemáticos na Literatura para o Problema de Corte Uni-dimensional
com Retalhos
2.2.2
2.3
2.4
Novos Modelos Matemáticos para o CSPUL
Algoritmos
2.3.1
Heurística Construtiva
2.3.2
Algoritmo Baseado no GRASP
2.3.3
Metaheurística Baseada em Algoritmos Evolutivos
2.3.4
Processos Paralelos
Testes Computacionais
2.4.1
Instâncias
Instâncias Numéricas
Instâncias Práticas
Instâncias Aleatórias
2.4.2
Discussões sobre os Modelos Matemáticos
Discussões sobre as Instâncias Numéricas
Discussões sobre as Instâncias Práticas
2.4.3
Discussões sobre os Algoritmos
Discussões sobre as Instâncias Numéricas
Discussões sobre Instâncias Práticas
2.4.4
24
Discussões sobre Instâncias Aleatórias
Comparação com os Resultados de [6]
24
30
32
32
34
38
40
42
42
42
44
45
45
46
48
49
50
50
51
52
3
Problema de Emparelhamento Estável
3.0.5
3.1
3.2
3.3
3.4
3.5
4
Novos Modelos Matemáticos para o Problema dos Companheiros Estáveis
3.1.1
Novo Modelo Quadrático
3.1.2
Novo Modelo Linear Inteiro
Busca Tabu para o Problema dos Companheiros Estáveis
3.2.1
Forma Geral da Busca Tabu
3.2.2
Busca Tabu para o Problema dos Companheiros Estáveis
Branch-and-Bound para o Problema dos Companheiros Estáveis
3.3.1
Forma Geral do Branch-and-Bound
3.3.2
Branch-and-Bound para o Problema dos Companheiros Estáveis
3.3.3
Estratégias para Melhorar o Desempenho do Branch-and-Bound
Melhorando as Implementações com Programação Paralela em GPUs
Experimentos Computacionais
Problema da Mochila Compartimentada
4.1
4.2
4.3
4.4
5
Variantes
Modelo Quadrático do Problema da Mochila Compartimentada
4.1.1
Observações
4.1.2
Exemplo
Modelo Linear Inteiro para o Problema da Mochila Compartimentada
Algoritmos
4.3.1
Heurística Gulosa
4.3.2
GRASP usando Path-Relinking
Experimentos Computacionais
4.4.1
Instâncias
4.4.2
Resultados Computacionais
Conclusões
55
56
57
57
59
60
60
60
61
61
62
64
67
69
72
72
74
75
76
79
79
79
80
80
80
83
Referências Bibliográficas
84
A
Funções para Trabalhar com Vetores Inteiros na Memória das GPUs
87
B
Código dos Kernels Correspondêntes às Implementações Parallelas das
Heurísticas
88
C Código para Executar os Kernels
92
Lista de Figuras
2.1
2.2
2.3
2.4
Solução 1
Solução 2
Solução 3
No gráfico a solução ideal está nas coordenadas (50, 3), a aceitável em
(40, 3) e a indesejável em (66, 1). A solução ideal é dominada, enquanto
as soluções aceitável e indesejável são não-dominadas.
2.5 a), b) e c) mostram como permutando a ordem dos itens são gerados
diferentes padrões de corte usando um processo similar ao FFD.
2.6 Exemplo de execução da Heurística Construtiva (os padrões verdes são
os incluídos na solução)
2.7 Este exemplo mostra como o movimento para criar melhores padrões
consegue uma solução com uma perda de comprimento 1cm e um retalho
a partir de uma solução com três perdas, cada uma de comprimento 1cm
(o que é 3cm de perda total) e um retalho.
2.8 Nas tabelas, as filas Valores, Itens e Número, respectivamente, representam os valores que podem ser obtidos como combinações lineares dos
itens, o tipo de item que chega no valor, e o número de itens desse tipo
necessários para chegar nesse valor. Quando adicionamos um padrão de
corte na solução, o vermelho indica o tamanho do objeto que será cortado
e os itens do padrão estão em verde.
2.9 Os valores obtidos por RGRL 1, RGRL 2 e RGRL 3 foram dominados, enquanto os valores obtidos por Const. H., GRASP BA e Evol. BA foram
não-dominados
2.10 Os resultados do GRASP BA foram dominados, enquanto os do Const.
H., RSHP e Evol. BA foram não-dominados
3.1
4.1
4.2
22
22
23
24
33
35
37
43
53
54
Os valores dentro dos vértices indicam o candidato livre que foi selecionado para gerar os subproblemas desse nó, enquanto os valores das
arestas são os candidatos livres que foram associados com o selecionado
para gerar o subproblema. As folhas mostram o último par de candidatos
emparelhados e é apressentada a solução associada à folha.
64
Padrão compartimentado não ótimo
Padrão compartimentado ótimo
75
76
Lista de Tabelas
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22
2.23
3.1
3.2
4.1
Labels e seus significados.
Comprimentos e demandas dos itens da instância numérica 1
Comprimentos e demandas dos itens da instância numérica 2
Comprimentos e demandas dos itens da instância numérica 3
Comprimentos e demandas dos itens da instância prática 1
Comprimentos e demandas dos itens da instância prática 2
Instâncias aleatórias
Resultados do CPLEX com a instância numérica 1. O * indica que a
solução é ótima.
Resultados do CPLEX para o modelo 1 com a instância numérica 2.
Resultados do CPLEX para os modelos 2 e 3 com a instância numérica 2.
Resultados do CPLEX para o modelo 4 com a instância numérica 2. O *
indica que a solução é ótima.
Resultados do CPLEX com a instância prática 1. O * indica que a solução
é ótima.
Resultados do CPLEX para os modelos 1 e 2 com a instância prática 2. O
* indica que a solução é ótima.
Resultados do CPLEX para os modelos 3 e 4 com a instância prática 2. O
* indica que a solução é ótima.
Sementes para a geração de números pseudo-aleatórios
Soluções para a instância numérica 1. O * indica que a solução é um
ótimo de Pareto.
Soluções para a instância numérica 2. O * indica que a solução é um
ótimo de Pareto.
Soluções para a instância numérica 3.
Soluções para a instância prática 1. O * indica que a solução é um ótimo
de Pareto.
Soluções para a instância prática 2. O * indica que a solução é um ótimo
de Pareto.
Resultados com instâncias aleatórias.
Resultados com instâncias aleatórias.
Comparação com [6]
Soluções do CPLEX e das variantes do Branch-and-Bound. O (*) indica
que todas as soluções da classe foram ótimas.
Soluções da Busca Tabu. O (*) indica que todas as soluções da classe
foram ótimas.
Dados dos itens do exemplo
42
43
44
44
45
45
46
47
47
47
48
48
49
49
49
50
50
51
51
52
52
53
53
70
70
75
4.2
4.3
4.4
4.5
Parâmetros fixos para todas as intâncias
Parâmetros aleatórios para todas as intâncias
Descrição das classes de instâncias
Soluções para o Problema da Mochila Compartimentada
81
81
82
82
Lista de Algoritmos
2.1
2.2
2.3
2.4
2.5
2.6
3.1
3.2
3.3
3.4
Heurística Construtiva
Forma geral do GRASP
Algoritmo baseado no GRASP
Forma geral de um algoritmo evolutivo
Metaheurística Baseada em Algoritmos Evolutivos
Processo para construir os dados auxiliares para o problema da mochila.
Forma geral da Busca Tabu.
Busca Tabu para o Problema dos Companheiros Estáveis.
Forma Geral do Branch-and-Bound
Algoritmo para calcular o limite inferior de um nó a partir do limite inferior
do pai. Note que para este algoritmo ser O(n), deve ser pré-calculada uma
estrutura que permita saber para cada candidato livre quais dos restantes
candidatos livres ele prefere; o processo para calcular isto tem um custo
computacional de O(n2 ).
3.5 Processo de seleção do nó a ser explorado
3.6 Busca local aumentando a vizinhança
3.7 Primeira fase do processo para obter uma solução inicial para a busca local
3.8 Segunda fase do processo para obter uma solução inicial para a busca local
3.9 Processo guloso para obter uma solução inicial viável para a busca local
3.10 Método modificado de seleção do nó a ser explorado
4.1 Heurística Gulosa para o problema da Mochila Compartimentada
4.2 Forma geral do Path-relinking
4.3 Algoritmos baseado no GRASP e no Path-relinking
34
35
36
38
39
41
61
62
63
65
65
66
66
67
68
68
79
80
81
Lista de Códigos de Programas
A.1 Funções para Trabalhar com Vetores Inteiros na Memória
das GPUs
B.1 Kernels da Heurística Construtiva para o Problema de
Corte com Retalhos
B.2 Kernels do Algoritmo Baseado em GRASP para o Problema de
Corte com Retalhos
B.3 Kernels do Algoritmo Baseado em GRASP para o Problema de
Corte com Retalhos
B.4 Kernel do Algoritmo Baseado em Processos Evolutivos para
o Problema de Corte com Retalhos
C.1 Código para Executar os Kernels
C.2 Código para Executar os Kernels
C.3 Código para Executar os Kernels
87
88
89
90
91
92
93
94
CAPÍTULO 1
Introdução
A área de otimização combinatória é repleta de problemas de interesse prático.
Neste trabalho consideramos três destes problemas. Para cada um deles propomos novos
modelos matemáticos, assim como diferentes algoritmos heurísticos com suas implementações em paralelo usando unidades de processamento gráfico.
O primeiro problema estudado é um caso particular de problemas de corte de
objetos. Estes têm muitas aplicações na indústria e consistem no corte de um conjunto
de objetos maiores, que estão no estoque, para satisfazer certas demandas de itens, tendo
como possíveis objetivos, dentre outros, minimizar a perda de material e o custo dos objetos cortados. Em geral, estes problemas são difíceis de solucionar computacionalmente,
pertencendo uma boa parte deles à classe NP-difícil. Nós consideramos o problema de
corte uni-dimensional com retalhos, neste caso se a perda de material gerada no corte de
um objeto é suficientemente grande, então ela é considerada um retalho que será levado
em conta em futuros planejamentos de corte. Esta característica introduz maior complexidade ao problema e tem recebido atenção na literatura. Vários pesquisadores propuseram
modelos matemáticos e algoritmos para esse problema, ver referências [1, 5, 11, 12, 13],
com o intuito de encontrar boas soluções.
O segundo problema considerado é o problema dos companheiros estáveis
(stable roommates problem), que é uma subclasse dos problemas de emparelhamento
com preferêcias. Algumas das aplicações destes são: alocar médicos em treinamento em
hospitais, estudantes em moradias no campus e pacientes a possíveis doadores, entre
outras. Uma subclasse dos problemas de emparelhamento são os de emparelhamento
estável, introduzida por D. Gale e L.S. Shapley em College admissions and the stability
of marriage (1962) com o problema do casamento estável e dos companheiros estáveis.
O terceiro problema estudado é o problema da mochila compartimentada (que é
uma generalização do problema clássico da mochila). Este tipo de problema tem muitas
aplicações: cortar objetos maiores (bobinas, placas) para produzir itens menores, ou empacotar pequenos itens em espaços definidos. O problema da mochila compartimentada
consiste em dado um conjunto de itens agrupados em diferentes classes para serem alocados em uma mochila, onde itens de classes diferentes devem estar em compartimentos
17
diferentes da mochila, objetiva-se determinar as capacidades adequadas de cada compartimento e como estes devem ser carregados. Em [30], F.P. Marques e M.N. Arenales
introduzem o problema da mochila compartimentada.
Nos últimos anos as unidades de processamento gráfico (Graphics Processing
Units, GPUs) evoluíram de simples geradores de tela em poderosas plataformas programáveis, e em constraste com CPUs, as GPUs foram projetadas especificamente para
computações em paralelo. Assim, em teoria, as GPUs têm maior poder computacional
que as CPUs. Sendo esta a razão pela qual as GPUs têm sido usadas para melhorar o
desempenho de algoritmos que solucionam problemas não gráficos ([7, 24]).
Nas arquiteturas de computadores atuais, os espaços de memória da CPU e das
GPUs são diferentes. Isto significa que se um processo vai ser executado nas GPUs,
então, necessariamente, os dados requeridos por ele deverão ser copiados da memória da
CPU para os das GPUs e consequentemente os dados resultantes do processo deverão ser
copiados das memórias das GPUs para a da CPU. Assim, para obter um bom desempenho,
deve ser pouca a transferência de dados entre os diferentes espaços de memória e, por
outro lado, os processos selecionados para serem paralelizados devem ser aqueles que
consumem maior tempo computacional.
Para finalizar, as principais contribuições deste trabalho são:
• Para o Problema de Corte de Objetos Uni-dimensional com Retalhos:
– Dois novos modelos matemáticos;
– Três novos algoritmos heurísticos: uma heurística construtiva, um algoritmo
baseado no GRASP e um algoritmo evolutivo;
– Implementações em paralelo de processos para melhorar o desempenho das
heurísticas.
• Para o Problema dos Companheiros Estáveis:
–
–
–
–
Dois novos modelos matemáticos;
Uma metaheurística Busca Tabu;
Duas variantes do Branch-and-Bound;
Implementações em paralelo de processos para melhorar o desempenho dos
algoritmos propostos.
• Para o Problema da Mochila Compartimentada:
– Análise de um modelo quadrático;
– Proposta de um modelo em programação linear inteira;
– Uma heurística gulosa e uma metaheurística híbrida que usa GRASP com
path-relinking.
A dissertação é organizada como segue: no capítulo 2 são analisados modelos
e definições para o problema de corte uni-dimensional com retalhos, junto com novos
18
modelos matemáticos, projetos de três algoritmos heurísticos com processos em paralelo
para melhorar o desempenho dos mesmos e resultados computacionais. No capítulo
3 são apresentados dois modelos para o problema dos compaheiros estáveis, também
são projetadas uma busca tabu e adaptações do Branch-and-Bound para esse problema,
com testes computacionais comparando implementações sequenciais e paralelas. No
capítulo 4 são discutidos diferentes modelos matemáticos para o problema da mochila
compartimentada e também são propostas uma heurística gulosa, baseada em soluções do
problema clássico da mochila e uma metaheurística, baseada no GRASP que usa pathrelinking. As conclusões são dadas no capítulo 5.
CAPÍTULO 2
Problema de Corte Uni-dimensional de Objetos
com Retalhos
Os problemas de corte de objetos estão presentes nas mais variadas situações
práticas de processos industriais, como produção de papel, móveis, vidro, plástico,
calçados, roupas, chapas metálicas, circuitos impressos, entre outros. Estes problemas
consistem em cortar unidades maiores (unidades em estoque) em unidades menores
(unidades demandadas) de maneira a otimizar certos objetivos, como por exemplo:
minimizar o número de unidades em estoque necessárias para produzir as unidades
demandadas ou minimizar a perda de material quando são arranjadas geometricamente
as unidades demandadas dentro das unidades em estoque.
Neste capítulo consideramos um caso particular do problema de corte unidimensional de objetos, no qual o material que sobra dos cortes, se for suficientemente
grande, pode ser usado no futuro. Esta característica introduz dificuldade ao problema e
tem sido tratada na literatura por meio da criação de modelos matemáticos e projetos de
algoritmos para obter boas soluções ([1, 5, 6, 11, 12, 13]).
Os primeiros a considerar a existência de retalhos no problema de corte foram
Gradisar et al. em [11], ao propor um modelo aplicado à indústria têxtil e uma abordagem
de resolução heurística para o problema. O estudo em [12] é uma continuação daquele
começado em [11], neste caso considerando instâncias onde todos os objetos no estoque
são diferentes. O modelo matemático de [11] foi analisado e uma outra heurística foi
projetada.
Em [13] foi definido um novo algoritmo que combina as ideias de um Branchand-Bound com heurísticas sequenciais, melhorando as propostas de [11, 12].
Em [1] são apresentados dois modelos matemáticos para o problema de corte
uni-dimensional, que considera a existência de retalhos aplicado ao planejamento de corte
uni-dimensional de tubos metálicos na indústria aeronáutica agrícola. Estes modelos são
baseados no modelo anteriormente proposto em [11, 12, 13]. Os modelos foram resolvidos, por meio de uma linguagem de modelagem usando um software de otimização, sobre
instâncias práticas obtidas da empresa brasileira Neiva/Embraer.
2.1 Definição do Problema de Corte Uni-dimensional de Objetos com Retalhos
20
Em [5] são propostos critérios de qualidade de uma solução do problema de corte
uni-dimensional com retalhos. Também foram projetadas e implementadas heurísticas
determinísticas e os resultados obtidos foram comparados com os de [11]. Em [6] foi
proposta uma heurística e os resultados computacionais foram comparados com os de [5]
sobre intâncias aleatórias.
Este capítulo é organizado como segue. Na seção 2.1 são vistas definições para o
problema de corte uni-dimensional de objetos com retalhos. Na seção 2.2 são analisados
os modelos matemáticos para este problema e propostos novos modelos matemáticos.
A seção 2.3 apresenta uma heurística construtiva, um algoritmo baseado no GRASP
e um algoritmo evolutivo, com alguns processos em paralelo usados para melhorar
o desempenho dos algoritmos. A seção 2.4 mostra os testes computacionais usando
instâncias da literatura (práticas, numéricas e aleatórias).
2.1
Definição do Problema de Corte Uni-dimensional de
Objetos com Retalhos
Em [5] o problema de corte uni-dimensional de objetos com retalhos (onedimensional Cutting Stock Problem with Usable Leftover (CSPUL)) é definido como:
Um conjunto de peças (itens) tem que ser produzido cortando unidades maiores (objetos) de tamanho padrão (objetos dos fornecedores) ou não-padrão (retalhos de cortes
anteriores). A demanda dos itens e a quantidade de objetos no estoque são dados. Devese satisfazer a demanda cortando os objetos no estoque de forma que se gerem perdas
“pequenas” ou “suficientemente grandes” (retalhos) que retornarão ao estoque mas em
número reduzido.
A definição do problema usada nesta dissertação é similar a dada acima, porém
procura-se minimizar o número de retalhos no estoque. Isto é, o CSPUL é definido
como: Um conjunto de peças (itens) tem que ser produzido cortando unidades maiores
(objetos) de tamanho padrão (objetos dos fornecedores) ou não-padrão (retalhos de
cortes anteriores). A demanda dos itens e a quantidade de objetos no estoque são dadas.
Deve-se satisfazer a demanda cortando os objetos no estoque de forma que se gerem
perdas “pequenas” ou “suficientemente grandes” (retalhos) que retornarão ao estoque,
com o objetivo de reduzir o número final de retalhos no estoque.
Os valores para definir pequeno e suficientemente grande são definidos pelo
usuário. Assim, podem ser usados os parámetros β, θ e δ para definir esses valores:
• β ∈ (0, 1): usado para saber se uma sobra de material de um objeto padrão é
considerada pequena, para isto o comprimento da sobra deve ser menor ou igual
a βL, sendo L o comprimento do objeto.
2.1 Definição do Problema de Corte Uni-dimensional de Objetos com Retalhos
21
• θ ∈ (0, 1): usado para saber se uma sobra de material de um objeto não-padrão é
considerada pequena, para isto o comprimento da sobra deve ser menor ou igual a
θL, sendo L o comprimento do objeto.
• δ ∈ R∗+ : usado para saber se uma sobra é suficientemente grande para ser considerada retalho, para isto o comprimento da sobra deve ser maior ou igual a δ.
Este problema é multi-objetivo, pois além de minimizar a perda de material
procura-se minimizar o número de retalhos no estoque. Para classificar as soluções, em
[5] foi proposta a seguinte definição para uma solução ser ideal, aceitável ou indesejável.
Uma solução é considerada:
• Ideal: quando tem poucos objetos que geram perdas pequenas, nenhum objeto gera
perda de tamanho intermediário (scrap of intermediate size) (isto é, uma perda que
não é considerada nem pequena nem retalho) e muito poucos objetos que geram
retalhos.
• Aceitável: quando tem poucos objetos que geram perdas de tamanho intermediário
e poucos objetos que geram retalhos.
• Indesejável: quando tem muitos objetos que geram perdas de tamanho intermediário
ou muitos objetos que geram retalhos.
Na definição anterior os termos muito pouco, pouco e muito são dados pelo
usuário. Isto pode ser feito usando os parâmetros ε1 e ε2 , onde 0 < ε1 < ε2 < 1. Assim o
número de objetos com certa caraterística em uma solução é considerado:
• muito pouco: quando é menor ou igual a dε1 ηe,
• pouco: quando não é muito pouco e é menor ou igual a dε2 ηe,
• muito: quando é maior que dε2 ηe,
onde η é o número total de objetos usados na solução. O objetivo de usar estas definições
é gerar soluções ideais ou pelo menos aceitáveis.
Estas definições dão um tipo de classificação para as soluções, porém, em geral,
há instâncias com soluções aceitáveis melhores que soluções ideais. Ainda, encontramos
soluções indesejáveis que são tão boas quanto as ideais. Isto é visto no seguinte exemplo.
Considere a anstância:
• O estoque contém 200 objetos padrões todos com comprimento de 1000cm;
• Deve-se gerar três tipos de itens:
– 9 itens de comprimento 300cm;
– 903 itens de comprimento 100cm;
– 67 itens de comprimento 99cm.
• Sendo: β = 0.005, δ = 99, ε1 = 0.03, ε2 = 0.1.
2.1 Definição do Problema de Corte Uni-dimensional de Objetos com Retalhos
22
Consideremos as soluções 1, 2 e 3, a seguir:
Solução 1: (Figure 2.1)
Figura 2.1: Solução 1
• três objetos são cortados gerando cada um: três itens de comprimento 300cm e um
item de comprimento 100cm. Isto é, 3 × (3 × 300 + 100) = 3 × 1000.
• dez objetos são cortados gerando cada um: cinco itens de comprimento 100cm,
cinco itens de comprimento 99cm e uma perda pequena de comprimento 5cm. O que
produz uma perda total de 50cm. Isto é, 10 × (5 × 100 + 5 × 99) = 10 × (1000 − 5).
• dois objetos são cortados gerando cada um: quatro itens de comprimento 100cm,
cinco itens de comprimento 99cm e um retalho de comprimento 105cm. Isto é,
2 × (4 × 100 + 5 × 99) = 2 × (1000 − 105).
• Um objeto é cortado gerando dois itens de comprimento 100cm, sete itens de
comprimento 99cm e um retalho de comprimento 107cm. Isto é, 2 × 100 + 7 × 99 =
1000 − 107.
• 84 objetos são cortados gerando cada um: dez itens de comprimento 100cm. Isto é,
84 × (10 × 100) = 84 × 1000.
Solução 2: (Figure 2.2)
Figura 2.2: Solução 2
• três objetos são cortados gerando cada um: três itens de comprimento 300cm e um
item de comprimento 100cm. Isto é, 3 × (3 × 300 + 100) = 3 × 1000.
• 20 objetos são cortados gerando cada um: oito itens de comprimento 100cm, dois
itens de comprimento 99cm e uma perda pequena de comprimento 2cm. O que
produz uma perda total de 40cm. Isto é, 20 × (8 × 100 + 2 × 99) = 20 × (1000 − 2).
• três objetos são cortados gerando cada um: nove itens de comprimento 99cm e um
retalho de comprimento 109cm. Isto é, 3 × (9 × 99) = 3 × (1000 − 109).
2.1 Definição do Problema de Corte Uni-dimensional de Objetos com Retalhos
23
• 74 objetos são cortados gerando cada um: dez itens de comprimento 100cm. Isto é,
74 × (10 × 100) = 74 × 1000.
Solução 3: (Figure 2.3)
Figura 2.3: Solução 3
• três objetos são cortados gerando cada um: três itens de comprimento 300cm e um
item de comprimento 100cm. Isto é, 3 × (3 × 300 + 100) = 3 × 1000.
• 11 objetos são cortados gerando cada um: quatro itens de comprimento 100cm, seis
itens de comprimento 99cm e uma perda de tamanho intermediário de comprimento
6cm. O que produz uma perda total de 66cm. Isto é, 11 × (4 × 100 + 6 × 99) =
11 × (1000 − 6).
• Um objeto é cortado gerando seis itens de comprimento 100cm, um item de
comprimento 99cm e um retalho de comprimento 301cm. Isto é, 6 × 100 + 99 =
1000 − 301.
• 85 objetos são cortados gerando cada um: dez itens de comprimento 100cm. Isto é,
85 × (10 × 100) = 85 × 1000.
Cada uma das soluções fez 100 cortes e de acordo com a classificação das
soluções tem-se que a solução 1 é ideal, a 2 é aceitável e a 3 é indesejável. Não obstante,
o total de material perdido pela segunda solução é 40cm, menor que os 50cm perdidos
pela primeira solução, tendo as duas soluções 3 retalhos. Assim, podemos concluir que
uma solução aceitável (a segunda) é melhor que uma solução ideal (a primeira).
No caso da terceira solução, que é indesejável, apresenta só 1 retalho enquanto
a primeira gera um número maior de retalhos (3 retalhos). Sendo a diferença da perda
de material entre a terceira e a primeira soluções de 16cm, que pode ser considerada
desprezível comparada com o total de material cortado que é 100000cm. Desta forma
encontramos uma solução indesejável (a terceira) que é pelo menos tão boa quanto uma
ideal (a primeira). Além disto, existem instâncias para as quais não é possível encontrar
soluções ideais nem aceitáveis (veja as instâncias práticas da seção 2.4).
A figura 2.4 mostra a relação de dominância de Pareto entre as soluções 1, 2 e 3,
onde os objetivos considerados são a perda de material e o número de retalhos.
Pelas razões explicadas anteriormente, o nosso objetivo não será obter soluções
ideais e sim abordar o CSPUL como um problema multi-objetivo. Na seção que segue são
discutidos alguns modelos matemáticos para este problema.
2.2 Modelos Matemáticos para o Problema de Corte Uni-dimensional de Objetos com Retalhos
24
Figura 2.4: No gráfico a solução ideal está nas coordenadas
(50, 3), a aceitável em (40, 3) e a indesejável em
(66, 1). A solução ideal é dominada, enquanto as
soluções aceitável e indesejável são não-dominadas.
2.2
Modelos Matemáticos para o Problema de Corte Unidimensional de Objetos com Retalhos
2.2.1
Modelos Matemáticos na Literatura para o Problema de Corte
Uni-dimensional com Retalhos
No nosso conhecimento, o artigo de M. Gradisar et al. [11] é a primeira referência na literatura, que considera a existência de retalhos no problema de corte unidimensional de objetos. Dando assim a seguinte modelagem:
Dados:
•
•
•
•
•
•
•
m: número de objetos
d j : comprimento do objeto j (1 ≤ j ≤ m)
n: número de tipos de itens
si : comprimento dos itens de tipo i (1 ≤ i ≤ n)
bi : demanda dos itens de tipo i (1 ≤ i ≤ n)
UB: comprimento mínimo de uma sobra para ser considerada retalho
Y, M: constantes usadas para definir o número máximo de itens de tipos diferentes
gerados por um objeto
Variáveis:
•
•
•
•
•
xi j : número de itens de tipo i cortados do objeto j (1 ≤ i ≤ n e 1 ≤ j ≤ m)
δ j : sobra de material gerada pelo objeto j (1 ≤ j ≤ m)
∆i : demanda não satisfeita de itens de tipo i (1 ≤ i ≤ n)
t j : perda de material do objeto j (1 ≤ j ≤ m)
yi j : indica se um item de tipo i é cortado do objeto j (1 ≤ i ≤ n e 1 ≤ j ≤ m)
2.2 Modelos Matemáticos para o Problema de Corte Uni-dimensional de Objetos com Retalhos
25
• z j : indica se o objeto j é considerado na solução (1 ≤ j ≤ m)
Modelo:
n
min
∑ ∆i
[Demanda não Satisfeita]
(2-1)
∑ tj
[Perda de Material]
(2-2)
[Restrições de Mochila]
(2-3)
[Restrições de Demanda]
(2-4)
i=1
m
min
j=1
n
s.a :
∑ sixi j + δ j = d j
∀j
i=1
m
∑ xi j + ∆i = bi
∀i
∑ yi j ≤ Y ≤ M
∀j
j=1
n
(2-5)
i=1
(
tj =
(
yi j =
(
zj =
δ j , se z j = 1 e δ j < UB
0, c/c
0, se xi j = 0
1, c/c
∀j
∀i, j
0, se ∑ni=1 xi j = 0
1, c/c
(2-6)
(2-7)
∀j
(2-8)
Inteiros : xi j ≥ 0, δ j ≥ 0, t j ≥ 0, ∆i ≥ 0, yi j , z j ∈ {0, 1}
(1 ≤ i ≤ n e 1 ≤ j ≤ m)
O modelo anterior é bi-objetivo, as funções (2-1) e (2-2) procuram minimizar,
respectivamente, a demanda de itens não atendida e a perda de material. As restrições
(2-3) fazem com que a soma dos comprimentos dos itens cortados em um objeto seja
menor ou igual que o comprimento do objeto. Enquanto, as restrições (2-4) garantem que
o número de itens produzidos não seja maior que a demanda. Finalmente, as restrições
(2-5) limitam o número de itens diferentes que podem ser cortados em um objeto.
Em [12] e [13] o mesmo modelo foi estudado e novas variáveis foram incluídas,
junto com uma restrição que limita a um o número de retalhos maiores que o maior item.
Isto é:
m
∑ u j ≤ 1, onde: u j =
j=1
(
1, se δ j < d j e δ j > maxi si
0, c/c
Esta restrição não é considerada nesta dissertação, pois pode ser interessante ter
em uma solução poucos retalhos, mas, que sejam grandes.
2.2 Modelos Matemáticos para o Problema de Corte Uni-dimensional de Objetos com Retalhos
26
Em [1], modificou-se o modelo de [11] e foram propostas duas modelagens,
que incluíram as variáveis binárias w j (1 ≤ j ≤ m), empregadas para indicar se o objeto
j é usado na solução e não gera retalho. Na continuação mostramos os dois modelos
propostos (Modelo 1 and Modelo 2).
Modelo 1:
m
min
(2-9)
∑ tj
j=1
n
s.a :
∑ sixi j + δ j = d j
∀j
[Restrições de Mochila]
(2-10)
i=1
m
∑ xi j = bi
∀i
[Restrições de Demanda]
(2-11)
∑ xi j ≥ z j
∀j
[Restrições de Objetos]
(2-12)
[Restrições de Objetos]
(2-13)
[Máximo Número de Retalhos]
(2-14)
−z j + u j ≤ 0 ∀ j
[Restrições de Sobra]
(2-15)
wj +uj ≤ 1
[Restrições de Sobra]
(2-16)
[Restrições de Sobra]
(2-17)
δ j −UB ≥ −Mw j + ε ∀ j
[Restrições de Perda]
(2-18)
δ j −UB ≤ M(1 − w j ) ∀ j
[Restrições de Perda]
(2-19)
t j − Mw j ≤ 0
∀j
[Restrições de Perda]
(2-20)
t j − Mz j ≤ 0
∀j
[Restrições de Perda]
(2-21)
[Restrições de Perda]
(2-22)
[Restrições de Perda]
(2-23)
j=1
n
i=1
n
∑ xi j ≤ Mz j
∀j
i=1
m
∑ u j ≤ RUB
j=1
∀j
zj −wj −uj ≤ 0
tj −δj ≤ 0
∀j
∀j
δ j − t j + Mw j + Mz j ≤ 2M
∀j
δ j ,t j , xi j ≥ 0, xi j ∈ Z, z j , u j , w j ∈ {0, 1}
(1 ≤ i ≤ n e 1 ≤ j ≤ m)
Onde: UB = mini {si }, M = max j {d j } − UB, RUB é o limitante superior para o número
de retalhos em uma solução (foi sugerido RUB = 1), e ε é um número positivo que muda
o sinal da desigualdade (quando todos os valores são inteiros, foi sugerido ε = 1).
Este modelo considera só um objetivo que é minimizar a perda de material.
Sendo as restrições (2-12) e (2-13) as que garantem que z j = 1 se e somente se o objeto j
é considerado na solução. As restrições (2-14) forçam o número de retalhos ser menor ou
igual a RUB. Se um objeto é considerado na solução e tem sobra, então sua sobra é um
retalho ou uma perda de material, isto é garantido pelas restrições (2-15), (2-16) e (2-17).
2.2 Modelos Matemáticos para o Problema de Corte Uni-dimensional de Objetos com Retalhos
27
Enquanto as restrições (2-18), (2-19), (2-20), (2-21), (2-22) e (2-23) garantem que se a
sobra de um objeto considerado na solução não é um retalho, então é perda de material.
Modelo 2:
m
min
(2-24)
∑ tj
j=1
n
s.a :
∑ sixi j ≤ d j
∀j
[Restrições de Mochila]
(2-25)
[Restrições de Demanda]
(2-26)
[Máximo Número de Retalhos]
(2-27)
[Restrições de Sobras]
(2-28)
[Restrições de Sobras]
(2-29)
i=1
m
∑ xi j = bi
∀i
j=1
m
∑ u j ≤ RUB
j=1
n
d j z j − ∑ si xi j ≥ UBu j
∀j
i=1
n
d j z j − ∑ si xi j ≤ t j + Mu j
∀j
i=1
t j , xi j ≥ 0, xi j ∈ Z, u j , z j ∈ {0, 1} (1 ≤ i ≤ n e 1 ≤ j ≤ m)
O modelo 2 é muito parecido com o modelo 1, tentando as restrições (2-28) e (2-29)
expressar o mesmo conjunto de pontos que as restrições (2-12)-(2-23) do modelo 1.
Sendo qualquer solução viável do modelo 1, uma solução viável para o modelo 2, porém
o contrário não é verdadeiro. Isto é dado pela seguinte proposição.
Proposição 1. O conjunto de soluções viáveis do modelo 1 é um subconjunto
próprio do conjunto de soluções viáveis do modelo 2.
Demonstração:
Primeiramente será mostrado que o conjunto de soluções viáveis do modelo
1 é um subconjunto do conjunto de soluções viáveis do modelo 2. Para isto, seja
y = (x, z, u, w,t, δ) uma solução viável do modelo 1, a seguir é provado que y é também
uma solução viável do modelo 2:
Para y ser solução viável do modelo 2, deve satisfazer todas as restrições deste
modelo, assim analizemos cada uma dessas restrições:
• Restrições 2-25: ∑ni=1 si xi j ≤ d j ∀ j. Como y é solução viável do modelo 1 ela
satisfaz as restrições 2-10, dadas por: ∑ni=1 si xi j + δ j = d j ∀ j, onde δ j ≥ 0 ∀ j,
portanto resulta que y também satisfaz as restrições 2-25.
• Restrições 2-26: ∑mj=1 xi j = bi ∀i. Estas igualdades são exatamente as mesmas
restrições 2-11 do modelo 1, que y satisfaz por ser solução viavél desse modelo.
2.2 Modelos Matemáticos para o Problema de Corte Uni-dimensional de Objetos com Retalhos
28
• Restrição 2-27: ∑mj=1 u j ≤ RUB. Esta restrição é exatamente a mesma restrição 2-14
do modelo 1, que y satisfaz por ser solução viavél desse modelo.
• Restrições 2-28: d j z j − ∑ni=1 si xi j ≥ UBu j ∀ j. Como y é uma solução viável do
modelo 1, tem-se que y satisfaz a restrição 2-18, onde ∀ j:
δ j −UB ≥ −Mw j + ε
⇔
δ j + Mw j ≥ UB + ε ≥ UB
⇔
δ j u j + Mw j u j ≥ UBu j
(2-30)
Mas sendo que u j , w j são variáveis binárias das restrições 2-16, que são dadas
w j + u j ≤ 1, tem-se que em uma solução viável do modelo 1, w j u j = 0 para todo j.
Aplicando essa ideia em 2-30, tem-se que y satisfaz para todo j:
δ j u j ≥ UBu j
(2-31)
Das restrições 2-10 tem-se que para todo j, y satisfaz: δ j = d j − ∑ni=1 si xi j , portanto
a equação 2-31 fica:
n
d j u j − u j ∑ si xi j ≥ UBu j
(2-32)
i=1
Da restrição 2-15 tem-se que para todo j, y satisfaz: u j ≤ z j . Assim a restrição 2-32
pode ser substituida por:
n
d j z j − u j ∑ si xi j ≥ UBu j
(2-33)
i=1
A seguir é feita uma análise por casos que mostra que y satisfaz 2-28, para todo j:
– caso 1: Para os j em que u j = 0. Neste caso tem-se que a restrição 2-28 fica:
d j z j − ∑ni=1 si xi j ≥ 0, isto é garantido pelas restrições 2-10 e 2-13 do modelo
1. Portanto para os j em que u j = 0, y satisfaz 2-28.
– caso 2: Para os j em que u j = 1. Neste caso tem-se que a restrição 2-28 fica:
d j z j − ∑ni=1 si xi j ≥ UB, que é exatamente a forma em que fica a restrição 2-33
que y satisfaz. Assim, para os j em que u j = 1, y satisfaz 2-28.
• Restrições 2-29: d j z j − ∑ni=1 si xi j ≥ t j +Mu j
por casos:
∀ j. A análise destas restrições é feita
– caso 1: Para os j em que z j = 0. Neste caso a restrição 2-29 fica: − ∑ni=1 si xi j ≥
t j + Mu j , onde y satisfaz ∑ni=1 si xi j ≥ 0. Portanto − ∑ni=1 si xi j ≤ 0 e t j + Mu j ≥
0, o que implica que y satisfaz esta restrição para os j em que z j = 0.
2.2 Modelos Matemáticos para o Problema de Corte Uni-dimensional de Objetos com Retalhos
29
– caso 2: Para os j em que z j = 1. Como y é solução viável do modelo 1, y
satisfaz 2-23 para todo j:
δ j − t j + Mw j + Mz j ≤ 2M ⇔ δ j ≤ t j − Mw j − Mz j + 2M
Como z j = 1, então y satisfaz:
δ j ≤ t j − Mw j + M
⇔
δ j ≤ t j + M(1 − w j )
(2-34)
Note que, para todo j, y também satisfaz 2-10:
n
n
∑ sixi j + δ j = d j , daí tem-se que δ j = d j − ∑ sixi j
(2-35)
i=1
i=1
De 2-34 e 2-35 tem-se que y satisfaz:
n
d j − ∑ si xi j ≤ t j + M(1 − w j )
(2-36)
i=1
Sendo y solução viável do modelo 1, tem-se que y satisfaz 2-17:
zj −wj −uj ≤ 0 ⇔ zj −wj ≤ uj
Como z j = 1, então y satisfaz:
1−wj ≤ uj
(2-37)
De 2-36 e 2-37, tem-se que y satisfaz: d j − ∑ni=1 si xi j ≤ t j + Mu j , que é a
mesma restrição que 2-29 quando z j = 1. Assim está provado que para todo j,
com z j = 1, y satisfaz 2-29.
Desta forma tem-se que para todo j, y satisfaz 2-29.
Como y satisfaz todas as restrições do modelo 2, pode-se concluir que o conjunto
de soluções viáveis do modelo 1 é subconjunto do conjunto de soluções viáveis do modelo
2.
Para mostrar que o conjunto de soluções viáveis do modelo 1 é um subconjunto
próprio do conjunto de soluções viáveis do modelo 2, basta encontrar uma instância para
a qual o modelo 2 tenha uma solução viável que não seja solução viável do modelo 1. Para
isto, é considerada a seguinte instância: há somente um objeto no estoque, este objeto tem
tamanho 5cm, e a demanda é um único item de tamanho 2cm, de forma que não produza
retalhos (ou seja RUB = 0).
2.2 Modelos Matemáticos para o Problema de Corte Uni-dimensional de Objetos com Retalhos
30
Assim o modelo 2 para esta instância resulta em:
min
t1
s.a :
2x11 ≤ 5
x11 = 1
u1 ≤ 0
5z1 − 2x11 ≥ 2u1
5z1 − 2x11 ≤ t1 + Mu1
t1 , x11 ≥ 0, x11 ∈ Z, u1 , z1 ∈ {0, 1}
Note-se que uma solução para este modelo é: S = {u1 = 0, z1 = 1,t1 = 3, x11 = 1}.
Para S os valores de δ1 e w1 , correspondentes à mesma solução no modelo 1, são obtidos
pelas restrições 2-10 e 2-17 respectivamente, e resultam: δ1 = 3 e w1 = 1. Porém S não é
solução para o modelo 1 desta instância, pois não satisfaz a restrição de perda 2-19 que é:
δ1 − 2 ≤ M(1 − w1 ) ou seja 3 − 2 ≤ M(1 − 1). Portanto está provado com este exemplo
trivial que há soluções viáveis do modelo 2, que não são soluções viáveis do modelo 1. Estes modelos não solucionam exatamente o CSPUL, o que pode ser visto
analisando os objetivos dos modelos e do CSPUL, além de que não consideram os retalhos
que estão inicialmente no estoque. Porém trocado a função objetivo por
∑mj=1 d j z j
∑ t j + ∑m d j
j=1
j=1
m
conforme sugerido em [1], se dá prioridade aos objetos de menor tamanho,
considerando a minimização do número de retalhos como um objetivo secundário.
Na próxima subseção são propostos novos modelos para o CSPUL.
2.2.2
Novos Modelos Matemáticos para o CSPUL
Como o CSPUL minimiza o número de retalhos no estoque é necessário considerar os objetos que foram retalhos de cortes anteriores. Para isto é definido:
R: conjunto de objetos no estoque que foram retalhos de planejamentos de corte anteriores
(isto é, conjunto de objetos não-padrões).
Os modelos propostos em [1] permitem soluções simétricas, assim soluções
similares podem ser obtidas trocando os padrões de corte de objetos do mesmo tipo.
Com o objetivo de evitar algumas destas situações, propomos ordenar os objetos pelos
comprimentos e adicionar as seguintes restrições:
2.2 Modelos Matemáticos para o Problema de Corte Uni-dimensional de Objetos com Retalhos
z j+1 ≤ z j
∀j
31
se os objetos j e j + 1 são do mesmo tipo.
Assim reduzimos o número de soluções simétricas permitidas pelo modelo 2, e obtemos
o seguinte modelo.
Modelo 3:
m
min
(2-38)
∑ tj
j=1
m
min
∑ u j + ∑ (1 − z j )
j=1
n
s.a :
[Retalhos no Estoque]
(2-39)
[Restrições de Mochila]
(2-40)
[Restrições de Demanda]
(2-41)
[Restrições de Sobras]
(2-42)
[Restrições de Sobras]
(2-43)
j∈R
∑ sixi j ≤ d j
∀j
i=1
m
∑ xi j = bi
∀i
j=1
n
d j z j − ∑ si xi j ≥ UBu j
∀j
i=1
n
d j z j − ∑ si xi j ≤ t j + Mu j
∀j
i=1
z j+1 ≤ z j
∀ j se os objetos j e j + 1 são do mesmo tipo
(2-44)
t j , xi j ≥ 0, xi j ∈ Z, u j , z j ∈ {0, 1} (1 ≤ i ≤ n e 1 ≤ j ≤ m)
Porém, o modelo 3 ainda permite soluções simétricas, assim é proposto o modelo
4.
Dados do Modelo 4:
•
•
•
•
•
m: número de tipos de objetos;
R: conjunto de tipos de objetos não padrões (retalhos de cortes anteriores);
C j : número de objetos do tipo j (1 ≤ j ≤ m);
K j : número de possíveis padrões de corte para objetos de tipo j (1 ≤ j ≤ m);
ai jk : número de itens do tipo i no padrão de corte k de objetos de tipo j (1 ≤ i ≤ n,
1 ≤ j ≤ m, 1 ≤ k ≤ K j )
• u jk : indica se o padrão de corte k de objetos de tipo j gera um retalho (1 ≤ j ≤ m,
1 ≤ k ≤ K j)
• t jk : perda de material gerada pelo padrão de corte k de objetos de tipo j (1 ≤ j ≤ m,
1 ≤ k ≤ K j)
Variáveis do Modelo 4:
2.3 Algoritmos
32
• x jk : número de vezes que o padrão de corte k de objetos de tipo j é incluído na
solução
Modelo 4:
m Kj
min
∑ ∑ t jk x jk
[Perda de Material]
(2-45)
[Retalhos no Estoque]
(2-46)
[Restrições de Demanda]
(2-47)
[Restrições de Estoque]
(2-48)
j=1 k=1
m Kj
min
Kj
∑ ∑ u jk x jk + ∑ (C j − ∑ x jk )
j=1 k=1
j∈R
k=1
m Kj
s.a :
∑ ∑ ai jk x jk = bi
∀i
j=1 k=1
Kj
∑ x jk ≤ C j
∀j
k=1
x jk ≥ 0, x jk ∈ Z (1 ≤ j ≤ m e 1 ≤ k ≤ K j )
Neste modelo as restrições (2-48) impedem que uma solução considere mais
objetos de um determinado tipo dos que há no estoque.
É ipmortante mencionar que o número de variáveis do modelo 4 é exponencial
no tamanho da instância que é dado pelo comprimento do maior objeto padrão e as
combinações de items que podem ser alocados nele. Porém, podería-se utilizar um
algoritmo de geração de colunas com esse modelo.
2.3
Algoritmos
Nesta seção são descritos os algoritmos que projetamos para o CSPUL. Apresentamos uma heurística construtiva baseada no First Fit Decreasing algorithm (FFD) e
duas metaheurísticas: uma baseada no GRASP e outra em algoritmos evolutivos. Também mostramos como pode ser melhorado o desempenho das nossas propostas usando
processos em paralelo.
2.3.1
Heurística Construtiva
Dada uma instância do CSPUL, o procedimento FFD é aplicado em cada objeto:
corta o objeto para gerar itens do maior tipo tantas vezes quanto seja possível, levando
em conta que não se pode gerar um número maior de itens do que os demandados, depois
gera itens do segundo maior tipo, e assim até gerar itens do menor tipo.
2.3 Algoritmos
33
A heurística construtiva usa um procedimento com uma ideia similar, só que
selecionando os tipos de itens a serem gerados pela ordem em que são dados na lista de
itens e não pelo tamanho. Isto garante que gerando permutações da lista de itens se obtem
diferentes soluções, e assim oferecendo diversidade de soluções iniciais. A figura 2.5
mostra como diferentes padrões de corte são gerados simplesmente permutando a ordem
dos itens.
Figura 2.5: a), b) e c) mostram como permutando a ordem dos
itens são gerados diferentes padrões de corte usando
um processo similar ao FFD.
A heurística construtiva é descrita pelo algoritmo 2.1, e a figura 2.6 mostra como
ela funciona. Esta heurística consiste em três blocos principais:
• Da linha 3 até a 8: para cada tipo de objeto aplica-se o procedimento similar ao
FFD para gerar padrões de corte, incluindo aqueles padrões que não têm sobras na
solução.
• Da linha 10 até a 26: se no bloco anterior nenhum padrão foi incluído na solução,
então cada padrão é melhorado e novamente são incluídos na solução aqueles
padrões sem sobras.
• Da linha 28 até a 33: se nenhum dos blocos anteriores adicionou novos padrões
na solução, então os padrões que não têm perdas de tamanho intermediário são
incluídos na solução. Se todos os padrões têm perdas de tamanho intermediário,
então é incluído na solução aquele com a menor perda.
2.3 Algoritmos
34
Algoritmo 2.1: Heurística Construtiva
Dados: Instância do problema
1 início
2
repita
3
para cada tipo de objeto k faça
4
se há objetos de tipo k no estoque então aplica o processo similar ao FFD para obter o padrão pk
5
6
para cada padrão pk faça
se pk é viável e não tem sobra então adiciona pk na solução, atualiza as demanadas não satisfeitas para os
itens no padrão e elimina um objeto de tipo k do estoque
7
8
9
10
11
12
13
14
se nenhum padrão foi incluído na solução nesta iteração então
para cada padrão pk faça
cria os padrões p̂k e p̄k iguais a pk
cria a varável v igual ao primeiro tipo de item no padrão pk
repita
tira um item de tipo v de p̂k e de p̄k
aplica o processo similar ao FFD para completar o padrão p̄k sem considerar itens de tipo v
se ((a sobra de p̄k é menor que a de pk ) ou (a sobra de pk é méia e a de p̄k um retalho)) e não( a
sobra de pk é retalho e a de p̄k é méia) então
pk ← p̄k
15
16
17
v ← próximo tipo de item em p̂k , se v é o último tipo de item em p̂k , então que seja o primeiro
tipo de item em p̂k
até p̂k não tenha itens ou pk não tenha sobra
18
19
20
para cada padrão pk faça
se pk é viável e não tem sobra então
adiciona pk na solução, atualiza as demandas não satisfeitas para os itens no padrão e elimina
um objeto de tipo k do estoque
21
22
23
se nenhum padrão foi incluído na solução nesta iteração então
repita
seleciona o melhor padrão pk , onde: se há padrões viáveis com sobras pequenas, então o melhor
é aquele viável com a menor sobra; senão, se há padrões viáveis com retalhos, então o melhor é
aquele viável com o menor retalho; senão o melhor padrão é aquele viável com a menor perda
se (pk tem sobra pequena ou retalho) ou (é a primeira iteração do repita) então
adiciona pk na solução, atualiza as demandas não satisfeitas para os itens no padrão e
elimina um objeto de tipo k do estoque
24
25
26
até nenhum padrão seja adicionado na solução
27
até o estoque está vazio ou as demandas de itens estão satisfeitas
28 fim
2.3.2
Algoritmo Baseado no GRASP
A forma geral do GRASP é descrita pelo algoritmo 2.2.
O algoritmo baseado no GRASP aqui proposto considera o problema multiobjetivo e é mostrado pelo algoritmo 2.3.
As condições de parada usadas são o máximo número de iterações e o máximo
número de iterações sem incluir novas soluções no pool. Na continuação definimos conceitos empregados pelo algoritmo, que são: a) qualidade de uma solução e b) vizinhança
de uma solução.
Definição de Qualidade de uma Solução: É empregado o critério de dominância
de Pareto para expressar a qualidade de uma solução. Dizemos que a solução soli domina
a sol j se e somente se soli melhora sol j em pelo menos um dos objetivos e soli não é pior
que sol j em nenhum objetivo.
Assim, definimos para a solução solk os conjuntos Domk =
{soll |soll domina solk } e Domk = {soll |solk domina soll }. Desta forma dizemos que
2.3 Algoritmos
35
Figura 2.6: Exemplo de execução da Heurística Construtiva (os
padrões verdes são os incluídos na solução)
Algoritmo 2.2: Forma geral do GRASP
Dados:
1 início
2
repita
3
calcula uma solução gulosa aleatória inicial
4
faz busca local na solução calculada
5
se a solução obtida melhora a melhor solução até o momento então
atualiza a melhor solução até momento com o valor da nova solução
6
até satisfazer condições de parada
7 fim
2.3 Algoritmos
36
Algoritmo 2.3: Algoritmo baseado no GRASP
Dados: Instância do problema
1 início
2
pool: conjunto de soluções com capacidade limitada, inicialmente vazio
3
repita
4
sol: solução inicial calculada com a heurística construtiva com uma ordem
aleatória dos itens
5
repita
6
se (pool não está cheia) ou (sol é melhor que alguma solução do pool)
então
7
se pool está cheia então
8
remover a pior solução do pool
incluir sol no pool
9
atualiza sol como um dos vizinhos
até satisfazer condições internas de parada
até satisfazer condições de parada
tirar do pool todas as soluções dominadas
10
11
12
13
14
fim
a solução soli é melhor que a sol j se e somente se:
• soli ∈ Dom j , ou
• sol j ∈
/ Domi e |Domi | < |Dom j |, ou
• sol j ∈
/ Domi e |Domi | = |Dom j | e soli é melhor que sol j seguindo a definição de
ideal, aceitável e indesejável discutida na seção 2.1, ou
• sol j ∈
/ Domi e |Domi | = |Dom j | e sol j não é melhor que soli seguindo a definição
de ideal, aceitável e indesejável e |Domi | > |Dom j |.
Definição de Vizinhança: Consideramos quatro possíveis movimentos de uma
solução para uma vizinha. A decisão de qual movimento escolher é feita dinamicamente.
• Movimento para criar melhores padrões: usado quando na solução atual existem
padrões com perdas de tamanho intermediário. A ideia é eliminar todos os padrões
com perdas de tamanho intermediário da solução e criar um possível padrão inviável
com todas as demandas não satisfeitas. Se o padrão resultante é inviável, então um
item do primeiro tipo no padrão é removido; se ainda o padrão resultante é inviável,
então um item do segundo tipo é removido e assim sucessivamente até obter um
padrão viável. Se um item do último tipo é removido e ainda o padrão é inviável,
então o processo continua pelos itens do primeiro tipo. Este processo é repetido até
que todas as demandas dos itens sejam satisfeitas. A figura 2.7 mostra um exemplo
deste tipo de movimento.
• Movimento para eliminar retalhos: usado quando o número de retalhos gerados
pela solução atual é maior que uma quantidade desejável (que é calculada como
2.3 Algoritmos
37
Figura 2.7: Este exemplo mostra como o movimento para criar
melhores padrões consegue uma solução com uma
perda de comprimento 1cm e um retalho a partir de
uma solução com três perdas, cada uma de comprimento 1cm (o que é 3cm de perda total) e um retalho.
uma fração do número de perdas pequenas). A ideia é eliminar todos os padrões
que geram sobras, e depois, solucionar para cada objeto j o seguinte problema da
mochila, considerando somente os itens com demandas não satisfeitas:
n
max
∑ sk xk
k=1
n
s.a
∑ sk xk ≤ d j
k=1
xk ≤ b̂k
xk ≥ 0, xk ∈ Z (1 ≤ k ≤ n)
onde: d j é o comprimento do objeto j, sk o comprimento dos itens de tipo k, e b̂k a
demanda não satisfeita de itens de tipo k.
2.3 Algoritmos
38
Após solucionar o problema da mochila, o padrão com menor sobra é incluído na
solução, e assim o processo é repetido até satisfazer todas as demandas.
• Movimento para eliminar perdas pequenas: usado quando o número de perdas
pequenas geradas pela solução atual é maior que uma quantidade desejável (que
é calculada como uma proporção do número de retalhos). A ideia é similar ao
movimento para eliminar retalhos, tendo só diferença no momento de adicionar
um novo padrão na solução; pois se o padrão selecionado tem uma perda pequena e
não foram adicionados padrões com retalhos ou sem sobra, então o menor item do
padrão é removido para assim criar um retalho.
• Movimento para diversificar: usado para gerar novas soluções e tentar evitar ótimos
locais. Neste caso são removidos todos os padrões com sobras da solução atual, e
é aplicada a heurística construtiva ao subproblema com os objetos não usados do
estoque e com as demandas não satisfeitas.
É importante enfatizar que este algoritmo baseado no GRASP retorna um conjunto de soluções não-dominadas. Na próxima subseção introduzimos outra metaheurística, neste caso baseada em algoritmos evolutivos, que também produz um conjunto de
soluções não-dominadas.
2.3.3
Metaheurística Baseada em Algoritmos Evolutivos
A forma geral de um algoritmo evolutivo é descrita pelo algoritmo 2.4.
Algoritmo 2.4: Forma geral de um algoritmo evolutivo
Dados:
1 início
2
Gera uma população inicial de soluções
3
repita
4
calcula um valor de qualidade para cada solução
5
considerando a qualidade, seleciona um subconjunto da população para ser
os pais da próxima população
6
combina os pais selecionados para criar novas soluções
7
aplica um operador de mutação nas novas soluções
8
inclui na próxima população as melhores soluções da população anterior e
das novas criadas nesta iteração
9
até satisfazer as condições de parada
10 fim
A metaheurística baseada em algoritmos evolutivos proposta nesta subseção é
descrita pelo algoritmo 2.5. É usado o mesmo critério de qualidade de uma solução
definido para o algoritmo baseado no GRASP da subseção anterior. Para esta metaheurística foram definidos um operador de combinação e dois de mutação.
2.3 Algoritmos
39
A combinação entre duas soluções (pais) adiciona de forma alternada, em uma
nova solução, aqueles padrões de corte dos pais que não geram sobra. Se não é possível
adicionar mais um padrão na nova solução sem fazê-la inviável, então é aplicado o
primeiro operador de mutação nesta nova solução (que ainda é uma solução parcial).
Dada uma solução parcial, o primeiro operador de mutação soluciona o subproblema com as demandas não satisfeitas e os objetos não usados, aplicando uma estratégia
similar à usada no movimento para eliminar retalhos descrito na subseção anterior.
Dada uma solução viável, o segundo operador de mutação atribui a cada padrão
de corte um valor de rank, baseado no número de itens grandes que este padrão gera.
Onde, um item é considerado grande se é maior ou igual a uma fracção do menor objeto
padrão. Assim, todos os padrões de corte com rank zero ou com sobra são eliminados da
solução e é aplicada uma estratégia similar à usada no movimento para eliminar retalhos
da subseção anterior, seguindo também o objetivo de maximar o rank dos padrões de corte
a serem incluídos na solução.
Algoritmo 2.5: Metaheurística Baseada em Algoritmos Evolutivos
Dados: Instância do problema
1 início
2
poolcap ← capacidade do pool
3
pool: conjunto inicial de soluções geradas pela heurística construtiva usando
ordenamentos aleatórios dos itens
4
repita
5
S ← {}
6
para i = 1 até poolcap faça
7
para j = i + 1 até poolcap faça
8
aplica o operador de combinação nas soluções i e j do pool, e na
solução parcial resultante s aplica o primeiro operador de mutação
9
S ← S ∪ {s}
para cada solução s ∈ S faça
se s é melhor que alguma solução do pool então
remove a pior solução do pool
adiciona s no pool
10
11
12
13
se nenhuma nova solução foi adicionada no pool então
para cada solução s ∈ pool faça
aplica o segundo operador de mutação em s e adiciona a solução
mutada em S
S ← S ∪ pool
pool ← {}
pool ← as poolcap melhores soluções de S
14
15
16
17
18
19
até satisfazer as condições de parada
20
21
fim
2.3 Algoritmos
40
O algoritmo 2.5 consiste em:
• Da linha 5 até 10: a cada par de soluções na população é aplicado o operador de
combinação para gerar uma nova solução parcial, na qual é aplicado o primeiro
operador de mutação para assim obter uma nova solução viável.
• Da linha 11 até 17: cada nova solução é comparada com as soluções na população
e se é melhor que a pior solução da população, então a pior solução da população é
substituída pela nova solução.
• Da linha 18 até 24: se a população não é modificada, então a todas as soluções da
população é aplicado o segundo operador de mutação, e as melhores soluções são
selecionadas para a população.
2.3.4
Processos Paralelos
Nesta subseção são explicadas algumas ideias para os processos paralelos, que
foram implementados sob a plataforma CUDA usando GPUs, para melhorar o desempenho da heurística construtiva, do algoritmo baseado no GRASP e da metaheurística
baseada em algoritmos evolutivos. Um ponto relevante a ter em conta é que quando usamos paralelismo com GPUs, a transferência de dados entre CPU e GPUs pode consumir
tempo computacional razoável.
Assim, decidimos paralelizar os processos que demoram mais tempo e, simultaneamente, não requerem grandes transferências de dados entre diferentes espaços de
memória.
Na heurística construtiva consideramos:
(a) no início os vetores de dados contendo o comprimento dos objetos e dos itens são
copiados da memória da CPU para a memória compartilhada das GPUs;
(b) para cada tipo de objeto é criado um thread, que é responsável por executar o
processo similar ao FFD. Antes disto é preciso copiar os vetores com os dados
das demandas dos itens e do número de objetos no estoque, da memória da CPU
para a das GPUs. Assim, os padrões resultantes são copiados do espaço de memória
das GPUs para o da CPU;
(c) para cada padrão pk é criado um thread que executa o bloco da linha 10 até a 26 do
algoritmo 2.1. Sendo só necessário copiar os padrões resultantes da memória das
GPUs para a da CPU.
No algoritmo baseado no GRASP consideramos:
(a) as considerações anteriores aplicadas na heurística construtiva;
(b) quando se soluciona o problema da mochila clássico para todos os tipos de objetos
(a figura 2.8 descreve o processo):
2.3 Algoritmos
41
– cria dados auxiliares para o problema da mochila, onde a capacidade será o
comprimento do maior tipo de objeto no estoque (max d j ). Primeiramente o
vetor com as demandas dos itens é copiado da memória da CPU para a das
GPUs, depois para cada item i são criados si threads, onde si é o comprimento
do item i. Cada um destes threads executa o algoritmo 2.6;
– Um thread é criado para cada tipo de objeto, onde cada thread é responsável
por encontrar um padrão viável que minimize a sobra. Para isto, uma cópia do
vetor com os objetos disponíveis no estoque é feita da memória da CPU para
a das GPUs, e os padrões resultantes são copiados da memória das GPUs para
a da CPU.
A metaheurística baseada em algoritmos evolutivos usa processos paralelos
similares aos discutidos anteriormente. Além disso, quando o segundo operador de
mutação cria os dados para solucionar o problema da mochila, um vetor com os ranks
dos padrões de cortes é calculado por cada thread.
Algoritmo 2.6: Processo para construir os dados auxiliares para o problema da
mochila.
Dados:
L1 ∈ Nmax{d j +1} : vetor com os valores entre 0 e max d j que podem ser obtidos por
combinações lineares dos comprimentos dos itens, satisfazendo as restrições de
demandas. L1i é o tipo de item que chega no valor i (se o valor não pode ser obtido
por combinação linear dos comprimentos dos itens, então L1i = 0)
L2 ∈ Nmax{d j +1} : o vetor, em cada possição i, tem o número de itens de tipo L1i
necessários para obter o valor i na combinação linear
k ∈ N: tipo de item atual
bk ∈ N: demanda não satisfeita de tipo de item atual
sk ∈ N: comprimento do tipo de item atual
p ∈ N, 0 ≤ p < sk
1 início
2
se bk > 0 então
3
para i = p até (max d j ) − sk com incremento sk faça
4
se L1i ≥ 1 e L1i+sk = 0 e (L1i 6= k or L2i < bk ) então
5
L1i+sk ← k
6
L2i+sk ← 1
7
se L1i = k então L2i+sk ← L2i + 1
8
fim
2.4 Testes Computacionais
2.4
42
Testes Computacionais
Nesta seção apresentamos experimentos computacionais sobre três tipos de
instâncias: instâncias numéricas ([13]), instâncias práticas ([1]) e intâncias aleatórias ([5]).
A tabela 2.1 mostra os significados dos labels que aparecem nas tabelas com os
resultados dos experimentos.
Label
Obj.Cut
To.Length
Total Loss
Total Ret.
OSScrap
ONSScrap
ORetail
Solution
RGRL 1
RGRL 2
RGRL 3
Const. H.
GRASP BA
Evol. BA
Var.Numb.
Const.Numb.
RUB
Init.Sol.
Init.GAP
Last.Sol.
Nod.Numb.
Iter.
Stop.Crit
Time
Significado
número de objetos cortados
comprimento total de material cortado
comprimento total das sobras
comprimento total dos retalhos
número de padrões que geram perda pequena
número de padrões que geram perdas de tamanho intermediário
número de padrões que geram retalhos
classificação das soluções onde: ID é ideal,
AC é aceitável, e UD é indesejável
algoritmo ideal RGRL 1 em [5]
algoritmo ideal RGRL 2 em [5]
algoritmo ideal RGRL 3 em [5]
heurística construtiva
algoritmo baseado no GRASP
metaheurística baseada em algoritmos evolutivos
número de variáveis
número de restrições
número de retalhos
valor da solução inicial inteira
gap inicial
valor da última solução inteira
número de nós na árvore de enumeração
número de iterações
critério de parada, onde OPT é por otimalidade e
OME é por out of memory exception
tempo de execução em segundos
Tabela 2.1: Labels e seus significados.
2.4.1
Instâncias
Instâncias Numéricas
Foram testadas três instâncias numéricas:
• Instância numérica 1: 20 tipos de objetos com comprimentos entre 2200 e 6000
cm, tendo só um objeto de cada tipo no estoque. A tabela 2.2 contém os dados de
comprimentos e demandas dos itens.
2.4 Testes Computacionais
43
Figura 2.8: Nas tabelas, as filas Valores, Itens e Número, respectivamente, representam os valores que podem ser obtidos como combinações lineares dos itens, o tipo de
item que chega no valor, e o número de itens desse
tipo necessários para chegar nesse valor. Quando adicionamos um padrão de corte na solução, o vermelho
indica o tamanho do objeto que será cortado e os itens
do padrão estão em verde.
Item Comprimento (cm) Demanda
1
235
4
2
200
51
3
347
42
4
471
16
5
274
37
Tabela 2.2: Comprimentos e demandas dos itens da instância
numérica 1
2.4 Testes Computacionais
44
• Instância numérica 2: 20 tipos de objetos com comprimentos 2100 e 5000 cm,
tendo só um objeto de cada tipo no estoque. A tabela 2.3 contém os dados de
comprimentos e demandas dos itens.
Item Comprimento (cm) Demanda
1
549
39
2
433
27
3
207
43
4
308
30
5
583
2
Tabela 2.3: Comprimentos e demandas dos itens da instância
numérica 2
• Instância numérica 3: 90 tipos de objetos com comprimentos entre 3000 e 9000
cm, tendo só um objeto de cada tipo no estoque. A tabela 2.4 contém os dados de
comprimentos e demandas dos itens.
Item Comprimento (cm) Demanda
1
569
34
2
718
26
3
520
25
4
540
12
5
492
30
6
547
2
7
632
6
8
430
36
9
750
7
10
387
20
11
804
3
12
389
32
13
835
18
14
684
39
15
687
10
Tabela 2.4: Comprimentos e demandas dos itens da instância
numérica 3
Instâncias Práticas
Foram testadas duas intâncias práticas:
• Instância prática 1: 10 objetos de um único tipo no estoque cada um com
comprimento 3000 cm. A tabela 2.5 contém os dados de comprimentos e demandas
dos itens.
2.4 Testes Computacionais
45
Item Comprimento (cm) Demanda
1
250
2
2
273
2
3
285
4
4
525
4
5
1380
4
Tabela 2.5: Comprimentos e demandas dos itens da instância
prática 1
• Instância prática 2: 10 objetos de um único tipo no estoque cada um com
comprimento 6000 cm. A tabela 2.6 contém os dados de comprimentos e demandas
dos itens.
Item Comprimento (cm) Demanda
1
370
5
2
905
5
3
910
5
4
930
5
Tabela 2.6: Comprimentos e demandas dos itens da instância
prática 2
Instâncias Aleatórias
Foram testadas 320 instâncias aleatórias, agrupadas em 16 classes de 20 instâncias cada uma. A tabela 2.7 dá a descripção de cada classe de instâncias, representando:
No. Obj. Type, o número de diferentes tipos de objetos; No. Itm. Type, o número de diferentes tipos de itens; e Items, os tipos de itens. Existem dois tipos de itens: pequeno que
são itens menores que 25% do tamanho do menor objeto padrão, e tamanho médio, de
comprimentos aleatórios, que podem ser maiores que 25% do tamanho do menor objeto
padrão.
2.4.2
Discussões sobre os Modelos Matemáticos
A qualidade dos modelos matemáticos é analizada considerando instâncias
numéricas e práticas. Para obter a fronteira de Pareto para uma instância dada, são solucionados vários modelos mono-objetivos fixando os diferentes valores possíveis para o
máximo número de retalhos. Todos os modelos foram resolvidos usando o ILOG CPLEX
9.0 em um PC Intel Core 2 Duo, 2.8GHz e 3.25GB de RAM sob o sistema operacional
Microsoft Windows XP Professional.
2.4 Testes Computacionais
46
Classe No. Obj. Type No. Itm. Type
1
5
10
2
5
10
3
5
20
4
5
20
5
5
40
6
5
40
7
7
10
8
7
10
9
7
20
10
7
20
11
7
40
12
7
40
13
9
10
14
9
10
15
9
20
16
9
20
Items
pequeno
tamanho médio
pequeno
tamanho médio
pequeno
tamanho médio
pequeno
tamanho médio
pequeno
tamanho médio
pequeno
tamanho médio
pequeno
tamanho médio
pequeno
tamanho médio
Tabela 2.7: Instâncias aleatórias
Para gerar as colunas do modelo 4 foi usado um algoritmo de enumeração dos
padrões para cada tipo de objeto, e os tempos de execuções deste algoritmo, para as
instâncias testadas, foram desprezíveis (menos de um milésimo de um segundo).
Discussões sobre as Instâncias Numéricas
É importante notar que para as instâncias numéricas os modelos 2 e 3 são o
mesmo. A tabela 2.8 e as tabelas 2.9, 2.10, 2.11 mostram os resultados obtidos pelo
CPLEX para as instâncias numéricas 1 e 2. Nestas tabelas pode-se ver que o modelo
4 foi melhor que os modelos 1, 2 e 3. Com o modelo 4 o CPLEX encontrou soluções
ótimas usando menos nós na árvore de enumeração, menos iterações e menos tempo
computacional do que com os outros modelos. Além disto, usando os modelos 1, 2 e
3 o CPLEX parou antes de encontrar soluções ótimas por Out of Memory Exception.
Quando comparamos os resultados obtidos pelo CPLEX usando os modelos,
observamos que com o modelo 4:
• obteve soluções ótimas para todas as instâncias numéricas;
• provou otimalidade das soluções em quase todos os testes com as intâncias numéricas;
1
• precisou menos que 10
do tempo de execução usado com os outros modelos;
1
• usou menos que 10
do número de nós na árvore de enumeração usado com os outros
modelos;
2.4 Testes Computacionais
Var.Numb.
Const.Numb.
RUB
Init.Sol.
Init.GAP
Last.Sol.
Nod.Numb.
Iter.
Stop.Crit.
Time
47
Modelo 1
200
246
0
1
812
666
100
100
412
56
12311549 13982753
246490262 51903397
OME
OME
81131.97 99449.89
Modelo 2 e Modelo 3
160
66
0
1
1612
706
100
100
212
2
299588
2816951
63764569 72973808
OME
OME
54980.63 224907.99
Modelo 4
228928
26
0
1
212
128
100
100
12*
0*
159119
14800
326807
68008
OME
OPT
851.56 5239.51
Tabela 2.8: Resultados do CPLEX com a instância numérica 1. O
* indica que a solução é ótima.
Var.Numb.
Const.Numb.
RUB
Init.Sol.
Init.GAP
Last.Sol.
Nod.Numb.
Iter.
Stop.Crit.
Time
0
1523
100
763
13319148
133503248
OME
13213.92
1
1144
100
412
16888927
274466473
OME
20635.11
Modelo 1
200
246
2
1044
100
588
13788840
127304689
OME
15711.78
3
747
100
263
14090112
166485902
OME
34251.25
4
1319
100
335
13225677
129522082
OME
56088.31
Tabela 2.9: Resultados do CPLEX para o modelo 1 com a instância numérica 2.
Var.Numb.
Const.Numb.
RUB
Init.Sol.
Init.GAP
Last.Sol.
Nod.Numb.
Iter.
Stop.Crit.
Time
0
6359
100
639
11246014
113908074
OME
12484.94
Modelo 2 e Modelo 3
160
66
1
2
3
2480
2704
2988
100
100
100
322
99
11
31677069
21057922
32281347
172418711 121279869 221740224
OME
OME
OME
233656.75
79663.91
32032.25
4
1256
100
46
28203188
186045954
OME
30844.71
Tabela 2.10: Resultados do CPLEX para os modelos 2 e 3 com a
instância numérica 2.
2.4 Testes Computacionais
48
Var.Numb.
Const.Numb.
RUB
Init.Sol.
Init.GAP
Last.Sol.
Nod.Numb.
Iter.
Stop.Crit.
Time
0
183
98
31*
561368
3012034
OME
1793.03
Modelo 4
44389
26
1
2
92
2*
97.2
61.96
3*
2*
9
8
229
226
OPT
OPT
210.8 183.02
3
1*
100
1*
57
778
OPT
60.67
4
1
100
0*
260
5025
OPT
111.02
Tabela 2.11: Resultados do CPLEX para o modelo 4 com a instância numérica 2. O * indica que a solução é ótima.
Discussões sobre as Instâncias Práticas
A tabela 2.12 e as tabelas 2.13, 2.14 mostram os resultados obtidos pelo CPLEX
para as instâncias práticas 1 e 2. Destas tabelas tem-se que o CPLEX usando o modelo
4 obteve soluções ótimas em menos tempo que com os outros modelos. De fato, para
estas intâncias e com o modelo 4 o CPLEX alcançou soluções ótimas na raíz da árvore de
enumeração, provando a otimalidade em poucas iterações.
Assim quando comparamos os resultados obtidos, observamos que com o modelo 4:
• o GAP foi menor, sendo zero em quase todos os testes com as instâncias práticas;
• obteve soluções ótimas na raíz da árvore de enumeração para todas as intâncias
práticas;
• provou otimalidade de todas as soluções obtidas com as instâncias práticas;
• precisou de menos tempo de execução que o usado com os outros modelos;
• usou menos nós na árvore de enumeração que com os outros modelos.
Var.Numb.
Const.Numb.
RUB
Init.Sol.
Init.GAP
Last.Sol.
Nod.Numb.
Iter.
Stop.Crit.
Time
Modelo 1
100
126
1
2
574
244
100
100
240*
0*
24639
30
116008
179
OPT OPT
143.5 0.92
Modelo 2
80
36
1
2
574
264
100
100
240*
0*
64134
135
239880
509
OPT OPT
35.49 1.05
Modelo 3
80
45
1
2
529
70
100
100
240*
0*
331
69
1385
354
OPT OPT
1.13
1
Modelo 4
257
7
1
2
240*
0*
0
0
240*
0*
1
0
26
10
OPT OPT
0.75 0.31
Tabela 2.12: Resultados do CPLEX com a instância prática 1. O *
indica que a solução é ótima.
2.4 Testes Computacionais
Var.Numb.
Const.Numb.
RUB
Init.Sol.
Init.GAP
Last.Sol.
Nod.Numb.
Iter.
Stop.Crit.
Time
49
1
435
100
250*
316596
923668
OPT
203.74
Modelo 1
90
125
2
110
100
70*
2200604
7593572
OPT
1872.75
3
0*
0
0*
0
14
OPT
0.75
1
3875
100
250*
270638
576347
OPT
149.39
Modelo 2
70
35
2
2034
100
70*
805423
2231684
OPT
82.53
3
0*
0
0*
0
12
OPT
0.74
Tabela 2.13: Resultados do CPLEX para os modelos 1 e 2 com a
instância prática 2. O * indica que a solução é ótima.
Var.Numb.
Const.Numb.
RUB
Init.Sol.
Init.GAP
Last.Sol.
Nod.Numb.
Iter.
Stop.Crit.
Time
1
6060
100
250*
1888
6872
OPT
1.88
Model 3
70
44
2
3
190 5615
100
100
70*
0*
5072
18
16508
151
OPT OPT
3.91 1.13
1
250*
18.46
250*
10
75
OPT
0.81
Model 4
343
6
2
3
70*
0*
16.67
0
70*
0*
0
0
26
27
OPT OPT
0.83 0.70
Tabela 2.14: Resultados do CPLEX para os modelos 3 e 4 com a
instância prática 2. O * indica que a solução é ótima.
2.4.3
Discussões sobre os Algoritmos
Para comparar os resultados obtidos pelas nossas propostas com os resultados de
[5], foi usado o critério de qualidade definido em [5], com ε1 = 0.03, ε2 = 0.1, β = 0.005,
θ = 0.05 e δ = min si , onde si é o comprimento do item i.
As nossas implementações usam o compilador GNU C 4.3.3 e os experimentos
foram testados em um PC Intel Core 2 Duo, 2.4GHz and 2GB of RAM sob Ubuntu
9.04. Os processos em paralelo usam uma placa NVIDIA GeForce GTS 250. Os números
pseudo-aleatórios usados nas implementações foram gerados pela função random padrão
do GNU C 4.3.3, com as sementes dadas na tabela 2.15.
49 7
56
42 5
83 13 75
23 17
Tabela 2.15: Sementes para a geração de números pseudoaleatórios
2.4 Testes Computacionais
50
Discussões sobre as Instâncias Numéricas
As tabelas 2.16, 2.17 e 2.18 mostram os resultados obtidos pelas heurísticas para
as instâncias numéricas 1, 2 e 3.
Destas tabelas pode-se ver que em alguns casos os algoritmos RGRL 1, RGRL 2
e RGRL 3 usaram menos objetos que os nossos, porém o comprimento total de material
cortado por RGRL 1, RGRL 2 e RGRL 3 foi maior que o feito pelas nossas heurísticas. Isto é
devido a que RGRL 1, RGRL 2 e RGRL 3 selecionaram maiores objetos do estoque dos que
os selecionados pelas nossas propostas.
Também temos que o GRASP BA e o Evol. BA deram um conjunto de soluções
não-dominadas, o que permite ao usuário selecionar a estratégia de corte que considere
mais adequada. Notemos que o desempenho das nossas metaheurísticas parece ser ideal,
segundo a definição proposta em [5]. Inclusive, para a intância numérica 1 o GRASP BA e
o Evol. BA obtiveram todas as soluções da fronteira de Pareto, e para a intância numérica
2 quase todas as soluções que o Evol. BA gerou são ótimos de Pareto, enquanto para esta
instância nenhum outro algoritmo conseguiu uma solução ótima de Pareto.
Obj.Cut.
Tot.Length
Total Loss
Total Ret.
OSScrap
ONSScrap
ORetail
Solution
RGRL 1
10
45245
0
1857
0
0
1
ID*
RGRL 2
10
45245
0
1857
0
0
1
ID*
RGRL 3
10
46507
0
3119
0
0
2
AC
Const. H.
12
44400
21
991
5
0
1
AC
11
43400
12
0
2
0
0
ID
GRASP BA
12
11
43400 43600
12
0
0
212
1
0
0
0
0
1
ID*
ID*
Evol. BA
11
10
43400 43600
12
0
0
212
1
0
0
0
0
1
ID*
ID*
Tabela 2.16: Soluções para a instância numérica 1. O * indica que
a solução é um ótimo de Pareto.
Obj.Cut.
Tot.Length
Total Loss
Total Ret.
OSScrap
ONSScrap
ORetail
Solution
RGRL 1
15
57554
6
2367
4
0
2
AC
RGRL 2
16
58159
3
2972
4
0
3
UND
RGRL 3
14
56395
7
1207
5
0
2
AC
Const. H.
16
57450
71
2198
12
0
3
UND
16
55488
10
297
6
0
1
AC
GRASP BA
16
16
58528 55792
7
17
3340
594
4
5
0
0
3
2
UND
AC
17
58500
1
3318
1
0
9
UND
15
55820
12
627
2
0
2
AC
Evol. BA
15
14
55212 55392
31
3
1365
208
6
3
0
0
0
1
AC*
AC*
Tabela 2.17: Soluções para a instância numérica 2. O * indica que
a solução é um ótimo de Pareto.
Discussões sobre Instâncias Práticas
As soluções para as instâncias práticas não são classificadas como ideal,
aceitável ou indesejável porque foram cortados poucos objetos e os valores de ε1 e ε2
2.4 Testes Computacionais
Obj.Cut.
Tot.Length
Total Loss
Total Ret.
OSScrap
ONSScrap
ORetail
Solution
RGRL 1
22
172114
0
3098
0
0
1
ID
51
RGRL 2
22
172114
0
3098
0
0
1
ID
RGRL 3
22
170989
0
1943
0
0
1
ID
Const. H.
30
169628
8
574
4
0
1
ID
GRASP BA
27
26
169468 169052
0
6
422
0
0
1
0
0
1
0
ID
ID
Evol. BA
27
27
169468 169048
0
2
422
0
0
1
0
0
1
0
ID
ID
Tabela 2.18: Soluções para a instância numérica 3.
não são apropriados.
Para estas intâncias práticas os desempenhos do GRASP BA e o Evol. BA
foram melhores do que o do resto dos algoritmos. A tabela 2.19 mostra que o GRASP
BA obteve todas as soluções da fronteira de Pareto para a instância prática 1 e o
Evol. BA deu uma solução não dominada, enquanto o resto dos algoritmos geraram
soluções dominadas para a mesma instância. A tabela 2.20 mostra que nossos algoritmos
conseguiram soluções ótimas de Pareto para a instância prática 2, enquanto os algoritmos
em [5] não conseguiram.
Obj.Cut.
Tot.Length
Total Loss
Total Ret.
OSScrap
ONSScrap
ORetail
Solution
RGRL 1
5
15000
0
5194
0
0
3
-
RGRL 2
5
15000
0
5194
0
0
3
-
RGRL 3
5
15000
4
5190
1
0
3
-
Const. H.
5
15000
14
5180
1
0
4
-
GRASP BA
4
4
12000 12000
0
240
2194
1954
0
0
0
1
2
1
*
*
Evol. BA
4
12000
0
2194
0
0
2
*
Tabela 2.19: Soluções para a instância prática 1. O * indica que a
solução é um ótimo de Pareto.
2.4.4
Discussões sobre Instâncias Aleatórias
As tabelas 2.21 e 2.22 apresentam os resultados dos nossos algoritmos e os
propostos em [5] para as instâncias aleatórias, nos quais os nossos algoritmos:
•
•
•
•
usaram menos objetos padrões;
usaram mais objetos não padrões (retalhos que estavam no estoque);
geraram menos retalhos;
usaram menos tempo computacional;
2.4 Testes Computacionais
Obj.Cut.
Tot.Length
Total Loss
Total Ret.
OSScrap
ONSScrap
ORetail
Solution
RGRL 1
3
18000
150
2275
0
1
2
-
52
RGRL 2
3
18000
150
2275
0
1
2
-
RGRL 3
3
18000
150
2275
0
1
2
-
Const. H.
3
18000
0
2425
0
0
3
*
GRASP BA
3
3
18000 18000
0
250
2425
2175
0
0
0
2
3
1
*
*
Evol. BA
3
18000
0
2425
0
0
3
*
Tabela 2.20: Soluções para a instância prática 2. O * indica que a
solução é um ótimo de Pareto.
• em particular, a metaheurística baseada em algoritmos evolutivos gerou a menor
perda de material. Enquanto a heurística construtiva e o algoritmo baseado no
GRASP geraram mais perda de material que as propostas de [5].
A figura 2.9 mostra a relação de dominância entre nossos algoritmos e os
propostos em [5].
Obj.Cut.
Tot.Length
Total Loss
Total Ret.
OSScrap
ONSScrap
ORetail
Solution
Time/Parallel Time
RGRL 1
106.9
111957.6
11.5
587.4
3.2
0.1
2.6
ID
22.55
RGRL 2
106.9
111923.5
11.8
552.8
3.2
0.1
2.6
ID
22.74
RGRL 3
106.9
111979.4
12.5
601.9
3.6
0.1
2.8
ID
81.85
Const. H.
129.6
112511.8
484.8
668.3
109.2
18.2
2.2
UND
0.003 / 0.003
GRASP BA
119.9
112033
41.2
632.9
5.2
1
2
AC
0.95 / 0.57
Evol. BA
117.6
112053.3
9.4
685
3.4
0.03
2.5
ID
1.64 / 0.7
Tabela 2.21: Resultados com instâncias aleatórias.
Comparação com os Resultados de [6]
Em [6] foi proposta uma heurística (denominada RSHP) e foram reportados os
resultados computacionais com as mesmas instâncias aleatórias de [5]. Os autores não
deram resultados sobre outras instâncias da literatura. A tabela 2.23 mostra os resultados
dos nossos algoritmos e os reportados em [6].
As soluções geradas pela heurística RSHP apresentam menos retalhos, porém
usam menos objetos não-padrões do que os usados pela nossa heurística construtiva.
Assim, o número total de retalhos no estoque final da heurística construtiva é menor. Por
outro lado, a perda de material gerada pela nossa metaheurística baseada em algoritmos
evolutivos é menor que a gerada pelo algoritmo RSHP. A figura 2.10 mostra a relação de
dominância entre o RSHP e nossas propostas.
2.4 Testes Computacionais
Stand.Cut.
NonStand.Cut.
Stand.Length
NonStand.Length
Stand. Loss
NonStand. Loss
Stand.Ret.
NonStand.Ret.
53
RGRL 1
102.6
4.3
110932.2
1025.4
6.2
5.3
383.5
195.7
RGRL 2
102.5
4.4
110881.9
1041.6
6.6
5.3
342
210.9
RGRL 3
102.6
4.5
110926.9
1052.5
7
5.1
383.8
217.5
Const. H.
102.6
27
105718.1
6793.7
296.7
188.1
648.3
20
GRASP BA
103.8
16.1
107786
4247
34.2
7
592.2
40.7
Tabela 2.22: Resultados com instâncias aleatórias.
Figura 2.9: Os valores obtidos por RGRL 1, RGRL 2 e RGRL 3 foram
dominados, enquanto os valores obtidos por Const. H.,
GRASP BA e Evol. BA foram não-dominados
Tot.Length
Stand.Cut.
NonStand.Cut.
Total Loss
Total Ret.
ORetail
Time/Parallel Time
RSHP
111672
101.5
23.6
9.8
303.2
1.2
1.56
Const. H.
112511.8
102.6
27
484.8
668.3
2.2
0.003 / 0.003
GRASP BA
112033
103.8
16.1
41.2
632.9
2
0.95 / 0.57
Tabela 2.23: Comparação com [6]
Evol. BA
112053.3
103.6
15.2
9.4
685
2.5
1.64 / 0.7
Evol. BA
103.6
15.2
107872.6
4180.7
5.7
3.7
579
106
2.4 Testes Computacionais
Figura 2.10: Os resultados do GRASP BA foram dominados, enquanto os do Const. H., RSHP e Evol. BA foram nãodominados
54
CAPÍTULO 3
Problema de Emparelhamento Estável
Existem muitos problemas em otimização combinatória em que há necessidade
de emparelhamento com preferências. Uma subclasse destes problemas é referida como
emparelhamento estável e foi introduzida por D. Gale and L.S. Shapley em College
admissions and the stability of marriage (1962), com os problemas do casamento estável
(stable marriage) e o dos companheiros estáveis (roommates stable matching).
Em [23] é dada a seguinte definição formal do problema do casamento estável:
Uma instância do problema consiste de um conjunto de 2n pessoas, sendo n homens
e n mulheres. Cada pessoa tem uma lista de preferência sobre os membros do sexo
oposto; assim, se um homem m prefere uma mulher w1 mais do que uma mulher w2 , então
escrevemos w1 m w2 (uma notação similar é usada para a preferência das mulheres).
Desta forma uma assignação (ou emparelhamento) M é um conjunto de pares disjuntos
homem-mulher, e se um homem m é associado com uma mulher w, escrevemos M(m) = w
e M(w) = m. E um casamento estável é uma assignação sem blocking pairs, onde um
blocking pair para M é um par homem-mulher (m, w) tal que: M(m) 6= w, w m M(m) e
m w M(w).
Gale e Shapley propuseram um algoritmo de tempo polinomial para encontrar
casamentos estáveis para as instâncias do problema. Isto foi feito mostrando que para
qualquer instância do problema existe pelo menos um emparelhamento estável. Uma variante do problema do casamento estável é o problema dos companheiros estáveis, e para
este problema nem sempre existe um emparelhamento estável. O problema dos companheiros estáveis tem recebido atenção na literatura. Como resultado vários pesquisadores
criaram algoritmos eficientes que determinam se um emparelhamento estável existe ou
dizem que não é possível encontrá-lo para certas classes de instâncias ([2, 9, 18, 19, 21]).
Mas, como em muitos casos pode não existir uma assignação estável para as instâncias do
problema, seria interessante encontrar, por exemplo, um emparelhamento que minimiza
o número de blocking pairs. Assim, uma definição para o problema dos companheiros
estáveis, dada em [23], é:
56
Uma instância do problema dos companheiros estáveis consiste de n = 2N (N ∈ N)
pessoas, onde cada uma delas tem uma lista de preferências sobre as n − 1 restantes.
O objetivo é encontrar um emparelhamento que minimize o número de blocking pairs.
Matematicamente isto pode ser escrito como:
min
∑
zm,w
(m,w)∈M
s.a :
∀(m, w) : se pm (M(m)) ≤ pm (w) ou pw (M(w)) ≤ pw (m),
então zm,w = 0 senão zm,w = 1
onde: pr (t) é a preferência da pessoa r pela pessoa t
3.0.5
Variantes
As principais formas que o problema dos companheiros estáveis têm sido visto
na literatura são:
• Determinar se existe um emparelhamento estável para uma instância do problema.
Esta variante é um problema de decisão que pertence a classe NP-completo e tem
sido tratada em subcasos, em alguns deles é possível encontrar soluções em tempo
polinomial:
– Para instâncias onde as preferências são estritas (isto é, nenhuma pessoa tem
igual preferência por outras duas), o problema dos companheiros estáveis pode
ser solucionado em tempo polinomial. (Ver referências [19, 21])
– Para instâncias que permitem empates nas listas preferências, são analizadas
diferentes definições de estabilidade:
∗ Estabilidade fraca. Um emparelhamento M tem estabilidade fraca se
não existem dois participantes x e y, onde cada um deles prefere estritamente o outro ao invés do companheiro em M. Esta definição é equivalente à de estabilidade e é provado que este problema é NP-completo.
(Ver referências [9, 21])
∗ Super-estabilidade. Um emparelhamento M é super-estável se não existem dois participantes x e y, onde cada um deles prefere ou tem a mesma
preferência pelo outro que pelo companheiro em M. Em [21] esta variante
foi resolvida dando um algoritmo de tempo polinomial.
– Companheiros estáveis geométricos. Considera instâncias obtidas de uma
representação geométrica das listas de preferências, onde um participante é
representado por um ponto do espaço mêtrico e as preferências são dadas pelas
3.1 Novos Modelos Matemáticos para o Problema dos Companheiros Estáveis
57
distâncias dele aos outros participantes. Para instâncias deste tipo existem
algoritmos de tempo polinomial. (Ver referência [2])
• Determinar se dada uma instância do problema ela é bi-estável. Esta variante foi
tratada em [32], demonstrando que existem algoritmos de tempo polinomial para
resolvê-la.
Bi-estabilidade. Dada uma instância do problema dos companheiros estáveis, uma
nova instância é obtida invertendo as listas de preferências. Um emparelhamento é
bi-estável se é estável tanto para a instância original quanto para a instância com
as listas de preferências invertidas. Este conceito foi introduzido em [34].
• Determinar se uma instância do problema é estável para quartos triplos. Neste
caso se considera que a assignação não é um conjunto de pares de pessoas, mas sim
um conjunto de trios. Em [25] foi demonstrado que esta variante pertence a classe
NP-completo.
Neste capítulo, na seção 3.1 apresentamos um modelo quadrático e um linear
para o problema dos companheiros estáveis. Na seção 3.2 propomos uma metaheurística
Busca Tabu, que é melhorada com processos em paralelo usando GPUs. Na seção
3.3 damos um algoritmo Branch-and-Bound para solucionar o problema. A seção 3.5
apresenta os testes computacionais feitos sobre instâncias geradas aleatoriamente.
3.1
Novos Modelos Matemáticos para o Problema dos
Companheiros Estáveis
Nas duas subseções que seguem são apresentados um modelo em programação
quadrática e um em programação linear inteira para o problema dos companheiros
estáveis.
3.1.1
Novo Modelo Quadrático
A forma geral de um modelo de otimização quadrático com variáveis binárias
(quadratic binary program (QBP)) é:
min / max
s.a :
f (x) = xQx
xAi x ≤ ai
(1 ≤ i ≤ m)
xAx = a; B1 x = b1 ; B2 x ≤ b2
onde :
Q, A, Ai ∈ Rn×n ; a, ai ∈ R; B1 ∈ Rm1 ×n ; b1 ∈ Rm1 ;
B2 ∈ Rm2 ×n ; b2 ∈ Rm2 ; x ∈ {0, 1}n e f : {0, 1}n → R
3.1 Novos Modelos Matemáticos para o Problema dos Companheiros Estáveis
58
Para modelar o problema dos companheiros estáveis como um QBP considere as
variáveis binárias xi, j para 1 ≤ i, j ≤ n:
(
xi, j =
1
0
se a pessoa i é associada com a j
c/c
Como xi, j = x j,i e xi,i = 0, tem-se que as variáveis xi, j só tem significado quando
1 ≤ j < i ≤ n. Assim um modelo matemático para este problema pode ser:
n i−1
min
∑ ∑ zi, j
i=2 j=1
s.a :
i−1
n
∑ xi,k pi(k) + ∑
se
k=1
j−1
ou
xk,i pi (k) − pi ( j) ≤ 0
(3-1)
k=i+1
n
∑ x j,k p j (k) + ∑
k=1
xk, j p j (k) − p j (i) ≤ 0
k= j+1
então zi, j = 0 senão zi, j = 1 (1 ≤ j < i ≤ n)
i−1
n
∑ xi, j + ∑
j=1
x j,i = 1 (1 ≤ i ≤ n)
(3-2)
j=i+1
xi, j , zi, j ∈ {0, 1}
(1 ≤ j < i ≤ n)
(3-3)
Onde o objetivo é minimizar o número de blocking pairs. As restrições (31) garantem que zi, j = 1 se e somente se os participantes i e j formam um blocking
pair, enquanto as restrições (3-2) garantem que cada participante tem exatamente um
companheiro.
Introduzindo as variáveis binárias y1i, j e y2i, j , onde zi, j = (1 − y1i, j )(1 − y2i, j ), as
restrições (3-1) podem ser transformadas em:
i−1
y1i, j
xk,i pi (k) − pi ( j)
∑ xi,k pi(k) + ∑
k=1
j−1
y2i, j
!
n
n
∑ x j,k p j (k) + ∑
k=1
≤0
k=i+1
!
xk, j p j (k) − p j (i)
≤ 0.
k= j+1
Assim um QBP para o problema dos companheiros estáveis é:
3.1 Novos Modelos Matemáticos para o Problema dos Companheiros Estáveis
59
n i−1
min
∑ ∑ zi, j
i=2 j=1
s.a :
i−1
y1i, j
!
n
y2i, j
(1 ≤ j < i ≤ n)
(3-4)
!
n
xk, j p j (k) − p j (i)
∑ x j,k p j (k) + ∑
k=1
≤0
(1 ≤ j < i ≤ n) (3-5)
k= j+1
i−1
n
∑ xi, j +
x j,i = 1
j=i+1
zi, j = (1 − y1i, j )(1 − y2i, j )
xi, j , y1i, j , y2i, j , zi, j ∈ {0, 1}
j=1
≤0
k=i+1
j−1
3.1.2
xk,i pi (k) − pi ( j)
∑ xi,k pi(k) + ∑
k=1
∑
(1 ≤ i ≤ n)
(3-6)
(1 ≤ j < i ≤ n)
(3-7)
(1 ≤ j < i ≤ n)
(3-8)
Novo Modelo Linear Inteiro
A forma geral de um modelo de otimização linear com variáveis binárias (linear
binary program (LBP)) é:
min / max
s.a :
onde :
f (x) = cx
A1 x = b1 ; A2 x ≤ b2
c ∈ Rn ; A1 ∈ Rm1 ×n ; A2 ∈ Rm2 ×n ; b1 ∈ Rm1 ; b2 ∈ Rm2 ;
x ∈ {0, 1}n e f : {0, 1}n → R
Note que no QBP proposto na subseção anterior as restrições (3-6) já estão na
forma de LBP, enquanto as restrições (3-4) e (3-5) podem ser escritas como:
i−1
n
∑ xi,k pi(k) + ∑
k=1
j−1
xk,i pi (k) − Ly1i, j ≤ pi ( j) (1 ≤ j < i ≤ n)
k=i+1
n
∑ x j,k p j (k) + ∑
k=1
onde
xk, j p j (k) − Ly2i, j ≤ p j (i) (1 ≤ j < i ≤ n)
k= j+1
L = max{mi, j } (1 ≤ j < i ≤ n).
As restrições (3-7) podem ser transformadas em:
y1i, j + y2i, j − zi, j ≤ 1 (1 ≤ j < i ≤ n)
(Observe que as variáveis yrij do QBP são iguais a 1−yrij do LBP, onde: r ∈ {1, 2}
3.2 Busca Tabu para o Problema dos Companheiros Estáveis
60
e 1 ≤ j < i ≤ n)
Desta forma, aplicando as modificações acima no QBP proposto anteriormente,
obtemos um LBP para o problema dos companheiros estáveis:
n i−1
min
∑ ∑ zi, j
i=2 j=1
s.a :
y1i, j + y2i, j − zi, j ≤ 1
i−1
(1 ≤ j < i ≤ n)
n
∑ xi,k pi(k) +
k=1
j−1
∑
xk,i pi (k) − Ly1i, j ≤ pi ( j) (1 ≤ j < i ≤ n)
k=i+1
n
∑ x j,k p j (k) + ∑
k=1
i−1
xk, j p j (k) − Ly2i, j ≤ p j (i) (1 ≤ j < i ≤ n)
k= j+1
n
∑ xi, j + ∑
x j,i = 1
j=i+1
1
2
xi, j , yi, j , yi, j , zi, j
(1 ≤ i ≤ n)
j=1
3.2
∈ {0, 1}, (1 ≤ j < i ≤ n)
Busca Tabu para o Problema dos Companheiros Estáveis
3.2.1
Forma Geral da Busca Tabu
A Busca Tabu é uma metaheurística, proposta por Fred Glover em 1986, que
está baseada na ideia de busca local. Para aplicar esta metaheurística a um problema é
necessário ter uma definição de vizinhança V (x) para cada solução x e também uma lista
limitada que armazena os movimentos que são considerados tabu. O algoritmo 3.1 mostra
a forma geral da Busca Tabu.
3.2.2
Busca Tabu para o Problema dos Companheiros Estáveis
Nesta proposta definimos a vizinhança de uma solução x como a troca de
parceiros em duas associações da solução:
V (x) = {x̄|∀s ∈ {1, 2} ∃ks , ls : x̄ks ,ls 6= xks ,ls e ∀(i, j) 6= (ks , ls ) x̄i, j = xi, j }
Se a solução x̄ é selecionada de V (x) trocando as associações (k1 , l1 ) e (k2 , l2 )
de x, resulta em (k1 , l2 ) e (k2 , l1 ) em x̄. Então, definimos como movimento tabu qualquer
movimento que coloque juntos k1 com l1 ou k2 com l2 . A capacidade da lista tabu usada
3.3 Branch-and-Bound para o Problema dos Companheiros Estáveis
61
Algoritmo 3.1: Forma geral da Busca Tabu.
Dados: Instância do problema
1 início
2
gere uma solução inicial x
3
x∗ ← x
4
/*crie a lista tabu*/
5
T SList ← {}
6
repita
7
/*obtenha o melhor vizinho sem usar movimentos da lista tabu*/
x ← minx̄∈V (x)\T SList F(x̄)
8
9
/*atualize a lista tabu*/
10
Insera em T SList o último movimento
11
se F(x) < F(x∗ ) então x∗ ← x /*atualize a melhor solução encontrada*/
12
até satisfazer as condições de parada
13 fim
é no máximo 20 e depende do tamanho da instância. O algoritmo 3.2 ilustra a ideia da
nossa proposta, que é baseada na Busca Tabu em [3].
3.3
Branch-and-Bound para o Problema dos Companheiros Estáveis
3.3.1
Forma Geral do Branch-and-Bound
Branch-and-Bound (B&B) são esquemas enumerativos que seguem uma estratégia de divisão e conquista dividindo um problema de otimização em um conjunto de
subproblemas, de forma que a solução do problema original possa ser obtida através da
solução dos subproblemas. As divisões são feitas sempre observando que os subproblemas
devem ser mais fáceis de serem resolvidos que o problema original (e tentando que sejam
disjuntos). Também busca-se descartar subproblemas por enumeração implícita. Para isto
são calculados limites para cada subproblema, geralmente fazendo alguma relaxação do
subproblema (Relaxação Linear, Relaxação Lagrangeana, ou alguma outra). Assim, se o
limite do subproblema não melhora a melhor solução obtida até o momento no algoritmo,
este subproblema não precisa ser solucionado. Em geral, a decomposição em subproblemas é vista recursivamente, o que permite uma representação gráfica do processo em
forma de árvore de enumeração onde a raiz é o problema original, cada nó interno é um
subproblema do nó pai e as folhas são soluções. Uma definição geral do B&B é dada pelo
algoritmo 3.3.
3.3 Branch-and-Bound para o Problema dos Companheiros Estáveis
62
Algoritmo 3.2: Busca Tabu para o Problema dos Companheiros Estáveis.
Dados: Instância do problema dos companheiros estáveis
1 início
2
Gere uma solução inicial x associando o participante i com o i + 1, para cada
i = 1, 3, ..., 2k + 1, ...
3
x∗ ← x
4
/*crie a lista tabu*/
5
T SList ← {}
6
repita
7
/*se há um vizinho de x que é obtido por um movimento que não é tabu e
que melhora a melhor solução até o momento, faça busca local neste
vizinho*/
8
se ∃x̄ ∈ V (x) \ T SList e F(x̄) < F(x∗ ) então
9
/*busca local no vizinho de x*/
10
repita
11
x∗ ← x̄
x̄ ← minx∈V (x̄) F(x)
12
13
até F(x̄) ≥ F(x∗ )
14
x ← x∗
senão
/*atribua a x o melhor vizinho que é obtido por um movimento que não
é tabu*/
x ← minx̄∈V (x)\T SList F(x̄)
15
16
17
/*atualize a lista tabu*/
Insera em T SList o último movimento
até atingir um máximo de iterações
18
19
20
21
fim
3.3.2
Branch-and-Bound para o Problema dos Companheiros Estáveis
Para solucionar o problema dos companheiros estáveis usando Branch-andBound, deve ser definida a decomposição de um problema em subproblemas. Para
isto escolhe-se um candidato livre (que não tenha ainda companheiro) e associando-o
com cada um dos outros candidatos livres cria-se os diferentes subproblemas disjuntos.
A figura 3.1 mostra a árvore de enumeração completa para uma instância com seis
candidatos.
Dessa forma é garantido que o problema de cada nó é a união dos subproblemas
dos filhos que, além disso, são mutuamente independentes.
Como o objetivo é minimizar o número de blocking pairs, para cada subproblema
é preciso definir uma função que calcule um limite inferior. Geralmente é usada uma
relaxação linear, mas nos testes feitos a relaxação linear dos modelos propostos gerou
3.3 Branch-and-Bound para o Problema dos Companheiros Estáveis
63
Algoritmo 3.3: Forma Geral do Branch-and-Bound
Dados: Instância do problema
1 início
2
S ← {problema original}
3
z ← +∞
4
calcule uma relaxação do problema original
5
repita
6
escolha um problema P ∈ S
7
S ← S − {P}
8
se o valor da relaxação de P não é pior que z então
9
se a solução da relaxação de P é inteira então
10
z ← valor da relaxação de P
senão
expanda P em k subproblemas menores: P1 , ..., Pk
para i = 1...k faça
calcule a relaxação de Pi
se o valor da relaxação de Pi não é pior que z então
S ← S ∪ {Pi }
11
12
13
14
15
16
até S = φ
17
18
19
fim
Retorne z
limitantes muito ruins. Portanto, é usada uma função combinatória para obter os limitantes
inferiores, que é mais simples de executar e dá uma boa noção do menor número de
blocking pairs que terá o subproblema. Assim, os candidatos x e y são considerados um
blocking pair pela função que calcula o limite (o que é, aumentar em uma unidade o valor
do limite), se:
• x e y não estão livres e cada um prefere ao outro do que ao candidato com quem
foram associados.
• x não é livre e y é livre, e x prefere a y ao invés do canditado com quem foi associado,
e para todo candidato z que seja livre, y prefere x do que z.
Para calcular este limitante é necessário analisar todos os possíveis pares (sendo
pares) e ver se formam blocking pairs (que tem um custo O(n)). O que implica um
esforço computacional de O(n3 ). Porém esse processo pode ser feito em O(n2 ) dividindoo em duas fases de O(n2 ) cada uma, mas a diferença entre um subproblema e o do pai é
que tem um par de candidatos a mais que não são livres. Portanto, usando essa informação
a segunda fase pode ser calculada em O(n). O algoritmo 3.4 mostra como calcular o limite
inferior de um nó, usando o valor do limite do nó pai.
O(n2 )
3.3 Branch-and-Bound para o Problema dos Companheiros Estáveis
64
Figura 3.1: Os valores dentro dos vértices indicam o candidato
livre que foi selecionado para gerar os subproblemas
desse nó, enquanto os valores das arestas são os candidatos livres que foram associados com o selecionado
para gerar o subproblema. As folhas mostram o último
par de candidatos emparelhados e é apressentada a
solução associada à folha.
A seleção do nó que irá se expandir é feita dando prioridade à altura do nó na
árvore de busca, se há dois nós com igual altura então é selecionado aquele com menor
limite inferior. O algoritmo 3.5 mostra esta ideia.
3.3.3
Estratégias para Melhorar o Desempenho do Branch-andBound
Para um melhor desempenho do Branch-and-Bound foram usadas as seguintes
estratégias:
Solução Inicial. É bem sabido que uma boa solução inicial geralmente garante
um melhor desempenho do Branch-and-Bound, permitindo que sejam cortados mais nós e
evitando assim analisar subproblemas onde não há ótimos. Para calcular uma boa solução
inicial é usada uma busca local que aumenta a vizinhança se não encontra uma melhor
solução na vizinhança atual, o algoritmo 3.6 mostra a ideia desta busca local.
A solução inicial da busca local anterior é gerada por um processo similar ao
proposto em [21] para obter emparelhamentos super-estáveis. Os algoritmos 3.7 e 3.8
mostram as fases um e dois deste processo.
Após aplicar a segunda fase teremos um emparelhamento que se não é superestável terá participantes sem companheiros. Portanto, para gerar uma solução viável é
aplicado, sobre a solução da segunda fase, um processo guloso descrito pelo algoritmo
3.9.
As vizinhanças V1 e V2 usadas pelo algoritmo 3.6 são definidas como:
3.3 Branch-and-Bound para o Problema dos Companheiros Estáveis
65
Algoritmo 3.4: Algoritmo para calcular o limite inferior de um nó a partir do limite
inferior do pai. Note que para este algoritmo ser O(n), deve ser pré-calculada uma
estrutura que permita saber para cada candidato livre quais dos restantes candidatos
livres ele prefere; o processo para calcular isto tem um custo computacional de
O(n2 ).
Dados: lb ← limite inferior do pai
[x, y] ← candidatos associados para gerar o subproblema
1 início
2
para cada candidato z tal que z 6= x e z 6= y faça
3
/*Analise se z forma um blocking pair com x e/ou y*/ se z não é livre então
4
/*Analise se z forma um blocking pair com x e/ou y considerado no nó
pai*/ se z prefere x ao invés do candidato com quem foi associado e x
prefere z ao invés de y e existe um candidato livre t que x prefere ao
invés de z ou x é indiferente entre t e z então lb ← lb + 1
5
se z prefere y ao invés do candidato com quem foi associado e y prefere
z ao invés de x e existe um candidato livre t que y prefere ao invés de z
ou y é indiferente entre t e z então lb ← lb + 1
6
senão
7
se x prefere z ao invés de y e não há um candidato livre t que z prefere
ao invés de x ou z seja indiferente entre t e x então lb ← lb + 1
8
se y prefere z ao invés de x e não há um candidato livre t que z prefere
ao invés de y ou z seja indiferente entre t e y então lb ← lb + 1
9
fim
Algoritmo 3.5: Processo de seleção do nó a ser explorado
Dados: L: lista de nós
1 início
2
node ← primeiro nó em L
3
para cada nó no em L faça
4
se Height(no) > Height(node) or
(Height(no) = Height(node) e lb(no) < lb(node)) então node ← no
5
fim
3.3 Branch-and-Bound para o Problema dos Companheiros Estáveis
Algoritmo 3.6: Busca local aumentando a vizinhança
Dados: Instância do problema dos companheiros estáveis
1 início
2
s ← solução inicial, calculada por um algoritmo guloso baseado na proposta de
[21]
3
repita
4
t ← melhor solução em V1 (s)
5
se t melhora s então s ← t
6
senão
7
t ← melhor solução em V2 (s)
8
se t melhora s então s ← t
até não seja melhorada a solução s
9
10
fim
Algoritmo 3.7: Primeira fase do processo para obter uma solução inicial para a
busca local
Dados: listas dos participantes
1 início
2
repita
3
p ← um participante livre que não tem lista vazia
4
para cada participante q na frente da lista de p faça
5
associe p com q
6
para cada sucessor estrito r de p na lista de q faça
7
se r está associado com q então quebre associação
8
elimine o par {q, r}/*elimine q da lista de r e r da lista de q*/
se Há dois ou mais participantes associados a q então
quebre todas as associações com q
para cada r empatado com p na lista de q (incluindo o próprio p)
faça
elimine o par {q, r}
9
10
11
12
até as listas de todos os participantes livres estejam vazias
13
14
fim
66
3.4 Melhorando as Implementações com Programação Paralela em GPUs
67
Algoritmo 3.8: Segunda fase do processo para obter uma solução inicial para a
busca local
Dados: Instância do problema dos companheiros estáveis
1 início
2
T ← tabela com lista s de preferências resultante ao aplicar a primeira fase na
tabela de preferências dos dados
3
repita
4
x ← um participante com mais de um elemento na sua lista em T
5
y ← um participante que tem a x na frente da lista de preferência em T
6
z ← o participante que está na frente da lista de x em T
7
Tx ← tabela resultante ao eliminar todos os pares {z, w} de T , onde w
empata ou sucede a x na lista de z
8
Tx ← tabela resultante ao aplicar a primeira fase em Tx
9
se Tx tem o mesmo número de listas vazias que T então T ← Tx
10
senão
11
Ty ← tabela resultante ao eliminar todos os pares {x, w} de T , onde w
empata ou sucede a y na lista de x
12
T ← tabela resultante ao aplicar a primeira fase em Ty
até todas as listas em T tenham no máximo um elemento ou T não mude o
valor
13
14
fim
• V1 (x) = {y|y é um emparelhamento ∩ ∃i, j : x(i) = y( j) ∩ x( j) = y(i) ∩ ∀k 6∈
{i, j, x(i), x( j)} : x(k) = y(k)}
• V2 (x) = {y|y é um emparelhamento ∩ ∃i, j, k : x(i) = y( j) ∩ x( j) = y(k) ∩ x(k) =
y(i) ∩ ∀l 6∈ {i, j, k, x(i), x( j), x(k)} : x(l) = y(l)}
Caminho da Melhor Solução. Dado que em muitos casos uma boa solução é
parecida a uma ótima, outra estratégia usada é seguir o caminho da melhor solução obtida
até o momento na árvore de busca tentando encontrar antes o valor ótimo. Para aplicar esta
ideia é só necessário uma simples modificação no método de selecionar o nó, o algoritmo
3.10 mostra esta ideia.
3.4
Melhorando as Implementações com Programação
Paralela em GPUs
Nesta seção apresentam-se as ideias principais dos processos em paralelo usando
GPUs, que foram usados para melhorar o desempenho dos algoritmos.
Na Busca Tabu consideramos:
(a) no início do processo é copiada a matriz de preferências da memória da CPU para
a memória compartilhada das GPUs;
3.4 Melhorando as Implementações com Programação Paralela em GPUs
68
Algoritmo 3.9: Processo guloso para obter uma solução inicial viável para a busca
local
Dados: solução parcial
tabelas de preferências
1 início
2
para cada candidato x livre faça
3
y ← o candidato livre que x prefere
4
associe x com y na solução
5
fim
Algoritmo 3.10: Método modificado de seleção do nó a ser explorado
Dados: L: lista de nós
best: melhor solução até o momento
1 início
2
node ← primeiro nó em L
3
para cada nó no em L faça
4
if Height(no) > Height(node) ou (Height(no) = Height(node) e (best ∈
subproblem(no) ou (best 6∈ subproblem(node) e lb(no) < lb(node))))
then node ← no;
5 fim
(b) em cada iteração:
(i) o maior tempo computacional é dado pela avaliação da função objetivo na
vizinhança da solução atual, assim para cada vizinho é criado um thread que
calcula o valor da função objetivo. Isto requer copiar o vetor da solução atual
do espaço de memória da CPU para o das GPUs;
(ii) para selecionar o melhor vizinho dos O(n2 ) que existem, são criados n threads
cada um para selecionar o melhor vizinho de uma subvizinhança de O(n),
para isto não é necessário transferência de dados pois já estão na memória das
GPUs.
(iii) copiar da memória das GPUs para a da CPU os n vizinhos que foram
selecionados como melhores pelos threads em [(ii)].
Na busca local foram consideradas as ideias da Busca Tabu para melhorar o
desempenho da mesma com paralelismo.
No Branch-and-Bound consideramos:
(a) no início de processo é copiada a matriz de preferências da memória da CPU para
a memória compartilhada das GPUs;
(b) em cada iteração:
3.5 Experimentos Computacionais
69
(i) o maior tempo computacional é dado pelo cálculo do limite inferior de cada
novo nó, assim para cada candidato livre é criado um thread que procura o
candidato que ele prefere. Isto requer copiar o vetor com a informação de
quais candidatos estão livres do espaço de memória da CPU para o das GPUs;
(ii) é criado um thread para cada um dos novos nós que calcula em O(n) o
limitante inferior dos subproblemas. Copiando da memória das GPUs para
a da CPU um vetor com os valores dos limitantes.
3.5
Experimentos Computacionais
Não foram encontradas na literatura instâncias para o problema dos companheiros estáveis, por esta razão foram geradas 100 instâncias aleatórias divididas em dez
classes, cada classe com dez instâncias.
Para analisar o desempenho das variantes do Branch-and-Bound propostas comparamos com as soluções do ILOG CPLEX 9.0 usando o nosso LBP. As implementações
das variantes do Branch-and-Bound usam o compilar C++ Builder 6 da Borland, e os
testes foram feitos em um processador Intel Core 2 Duo com 2.8GHz e 4 GB de RAM
sob Windows Vista. Somente usamos o LBP porque o CPLEX foi projetado para solucionar em primeiro lugar problemas de otimização linear, portanto os algoritmos e teoria
que usa, em geral, dão vantagem aos modelos lineares. De fato, com o QBP o CPLEX
demorou horas sem encontrar boas soluções, o que indica que demoraria ainda mais para
encontrar soluções ótimas.
A tabela 3.1 mostra os resultados obtidos pelo CPLEX e o Branch-and-Bound
proposto para as cinco primeiras classes de instâncias. Não são apresentados resultados
para as maiores classes, porque tanto o CPLEX quanto as variantes do Branch-and-Bound
consumiram muito tempo sem chegar a soluções ótimas. As colunas Solução, Tempo e
Nós, representam, respectivamente, os valores de: solução obtida, tempo de execução em
segundos e número de nós na árvore de enumeração do CPLEX, o Branch-and-Bound e
o Branch-and-Bound com a estrategia de seguir o caminho da melhor solução.
Na tabela 3.1 se pode ver que, nas primeiras quatro classes, as nossas propostas
usam mais nós na árvore de enumeração do que o CPLEX; porém essa diferença diminui
à medida que aumenta o tamanho das instâncias, o que se reflete no fato de que para a
quinta classe (que tem as maiores instâncias) o número de nós requeridos por uma das
nossas propostas é menor que o do CPLEX. Por outro lado, o tempo de execução do
CPLEX é maior em todos os testes que os dos nossos algoritmos; e no caso da quinta
classe, após dias de execução, o CPLEX não conseguiu soluções ótimas para todas as
instâncias, enquanto os nossos algoritmos conseguiram em questão de horas. Também é
3.5 Experimentos Computacionais
Classe
1
2
3
4
5
Solução
0*
0.1 *
0.2 *
0*
0.3
70
CPLEX
Tempo
Nós
0.8
0
1
1.6
3
186
19.7
752
104750 4414040
Solução
0*
0.1*
0.2*
0*
0.2*
B&B
Tempo
0
0
1.8
13.9
7310
Nós
3
15
1567
5259
4760523
B&Bcaminho
Solução Tempo
Nós
0*
0
3
0.1*
0
15
0.2*
1
1034
0*
3
1175
0.2*
1015 1057894
Tabela 3.1: Soluções do CPLEX e das variantes do Branch-andBound. O (*) indica que todas as soluções da classe
foram ótimas.
evidente que, para estas instâncias, a estratégia de seguir o caminho da melhor solução
melhora o desempenho do Branch-and-Bound.
A implementação da Busca Tabu usou o compilador GNU C++ e os experimentos foram feitos em um PC Intel Core 2 Duo, 2.4GHz e 2GB de RAM sob Ubuntu 9.04 e
os testes em paralelo usaram uma placa NVIDIA GeForce GTS 250.
A tabela 3.2 mostra a média dos resultados para cada classe de instâncias, onde as
colunas Candidatos, Pares, Ótimo, Solução da TS, Tempo Sequencial e Tempos Paralelo
representam, respectivamente, os valores de: número de pessoas nas instâncias da classe,
número de possíveis pares, valor da solução ótima, valor da solução da Busca Tabu, e
tempos de execução em segundos para a implementação sequencial e a que usa processos
em paralelo.
Classe
1
2
3
4
5
6
7
8
9
10
Candidatos
10
20
30
40
50
60
70
80
90
100
Pares
45
190
435
780
1225
1770
2415
3160
4005
4950
Ótimo
0
0.1
0.2
0
0.2
-
Solução da TS
0*
0.1 *
0.2 *
0.1
0.3
1.4
3.2
3.6
6
20.2
Tempo Sequencial
0
1
6.8
13.8
116
834
1035
1571
2073
2787
Tempo Paralelo
0
1
5.1
6.4
61.6
120
229
430
503
641
Tabela 3.2: Soluções da Busca Tabu. O (*) indica que todas as
soluções da classe foram ótimas.
Na tabela 3.2 pode-se ver que os resultados obtidos pela Busca Tabu parecem ser
muito bons, dado que as soluções apresentam poucos blocking pairs e em vários casos
foram atingidos os valores ótimos.
Por outro lado, é notável que com o uso dos processos paralelos em GPUs
aumenta a velocidade de execução dos algoritmos. Neste caso vemos como à medida que
3.5 Experimentos Computacionais
71
aumenta o tamanho das instâncias o tempo de execução da implementação sequencial vai
sendo cada vez maior que o da implementação que usa paralelismo. Isto mostra que o
uso de processos em paralelo com GPUs para problemas de otimização pode melhorar
consideravelmente o desempenho dos algoritmos.
CAPÍTULO 4
Problema da Mochila Compartimentada
O problema da mochila compartimentada pode ser visto como uma generalização
do problema clássico da mochila (que tem somente um compartimento), onde se considera
um conjunto de itens agrupados em diferentes classes a serem alocados em uma mochila
e itens de classes diferentes devem estar em compartimentos diferentes da mochila.
Este problema foi modelado em [15], onde considerava a inclusão de no máximo um
compartimento para cada classe de itens, que é um caso particular do problema que foi
modelado por [14, 28, 30].
Em [28, 30] foram propostas diferentes heurísticas gulosas para solucionar esse
problema. Em [14] foram consideradas duas abordagens para o problema, uma restrita
e outra irrestrita, esta última considera uma quantidade ilimitada de itens. Em [17] foi
proposto um método baseado em geração de colunas.
A maioria dos modelos matemáticos para o problema da mochila compartimentada eram quadráticos, mas em [35] foi apresentada uma modelagem linear inteira para o
problema. Em [27] é proposta uma heurística que combina as ideias descritas em [28, 30]
e também foi implementada uma outra heurística que usa geração de colunas.
Este capítulo é organizado como segue. Na seção 4.1 é discutida uma modelagem
quadrática para o problema da mochila compartimentada. Na seção 4.2 se mostra como,
modificando o modelo quadrático, é obtido um modelo linear inteiro para o problema.
A seção 4.3 apresenta uma heurística gulosa e um algoritmo baseado no GRASP que
usa path-relinking. A seção 4.4 mostra os testes computacionais com instâncias geradas
aleatoriamente.
4.1
Modelo Quadrático do Problema da Mochila Compartimentada
Na continuação apresentamos o modelo que corresponde a um problema não
linear inteiro e foi tomado de [27].
4.1 Modelo Quadrático do Problema da Mochila Compartimentada
73
Dados:
•
•
•
•
•
•
•
•
•
•
•
•
L: capacidade da mochila;
N = {1, ..., n}: define o cojunto de tipos de itens;
li : peso do item i, i = 1, ..., n;
vi : valor utilidade do item tipo i, i = 1, ..., n;
σi : número máximo de itens tipo i permitido na mochila, i = 1, ..., n;
K: número total de classes;
Ak : conjunto dos itens pertencentes à classe k, k = 1, ..., K, N = A1 ∪ A2 ∪ ... ∪
Ak e Ai ∩ A j = φ para i 6= j;
ck : custo pela inclusão de um compartimento para itens da classe k, k = 1, ..., K;
k : capacidade mínima do compartimento para itens da classe k, k = 1, ..., K;
Lmin
k : capacidade máxima do compartimento para itens da classe k, k = 1, ..., K;
Lmax
Sk : perda na mochila devido à inclusão de um compartimento para itens da classe
k, k = 1, ..., K;
Nk : número total de possíveis compartimentos da classe k, k = 1, ..., K.
Variáveis:
• aisk : número de itens do tipo i da classe k no compartimento s, i = 1, ..., n, k =
1, ..., K e s = 1, ..., Nk ;
• βsk : número de vezes que o compartimento s para itens da classe k é repetido na
mochila, k = 1, ..., K e s = 1, ..., Nk .
Para evitar situações triviais, supomos que para k = 1, ..., K:
k ;
• ∑i∈Ak σi li > Lmax
k
• li < Lmax,
i∈Ak ;
k
k
• Lmin < Lmax ≤ L.
O modelo em programação quadrática é o seguinte:
K
max
∑ ∑ ∑ viaisk − ck
k=1 s=1
K
s.a :
!
Nk
!
Nk
∑ ∑ ∑ liaisk + Sk
k=1 s=1
K
βsk
i∈Ak
βsk ≤ L
i∈Ak
Nk
∑ ∑ aisk βsk ≤ σi,
k=1 s=1
k
Lmin
≤
i ∈ Ak
k
,
∑ liaisk + Sk ≤ Lmax
k = 1, ..., K, s = 1, ..., Nk
i∈Ak
aisk ≥ 0, inteiro,
i = 1, ..., n, k = 1, ..., K, s = 1, ...Nk
βsk ≥ 0, inteiro,
k = 1, ..., K, s = 1, ...Nk .
4.1 Modelo Quadrático do Problema da Mochila Compartimentada
4.1.1
74
Observações
No modelo quadrático são propostos os seguintes tipos de restrições:
k
Lmin
≤
k
,
∑ liaisk + Sk ≤ Lmax
k = 1, ..., K, s = 1, ..., Nk
i∈Ak
Mas o termo Sk não precisa estar nelas, pois indica a perda pela inclusão de um
compartimento para a classe k, e estas restrições impedem que um compartimento da
k , dado que as restrições dizem que o máximo
classe k tenha o máximo peso possível Lmax
k − S . Logo as restrições podem ser re-escritas como:
seria Lmax
k
k
Lmin
≤
k
,
∑ liaisk ≤ Lmax
k = 1, ..., K, s = 1, ..., Nk
i∈Ak
Também podemos ver que as variáveis βsk podem ser consideradas binárias, onde
βsk = 1 se o compartimento s da classe k é aberto na mochila e βsk = 0 caso contrário.
Sendo então Nk o máximo número de compartimentos que pode ter a classe k.
Outra observação é que nas restrições:
k
Lmin
≤
k
,
∑ liaisk ≤ Lmax
k = 1, ..., K, s = 1, ..., Nk
i∈Ak
Quando o compartimento s na classe k não é aberto, ela ainda exige que tenha
itens neste compartimento. Logo uma modificação seria:
k
βsk Lmin
≤ βsk
k
,
∑ liaisk ≤ βsk Lmax
k = 1, ..., K, s = 1, ..., Nk
i∈Ak
Levando em consideração estas observações, as restrições da forma:
K Nk
∑ ∑ aisk βsk ≤ σi, i ∈ Ak
k=1
ficam na forma:
K Nk
∑ ∑ aisk ≤ σi,
k=1
Assim, o modelo que consideramos é:
K
min
!
Nk
∑ ∑ ∑ viaisk − ck
k=1 s=1
i∈Ak
βsk
i ∈ Ak
4.1 Modelo Quadrático do Problema da Mochila Compartimentada
K
s.a :
75
!
Nk
∑ ∑ ∑ liaisk + Sk
k=1 s=1 i∈Ak
k
βsk Lmin
≤ βsk
βsk ≤ L
k
,
∑ liaisk ≤ βsk Lmax
k = 1, ..., K, s = 1, ..., Nk
i∈Ak
K
Nk
∑ ∑ aisk ≤ σi,
i ∈ Ak
aisk ≥ 0, inteiro,
i = 1, ..., n, k = 1, ..., K, s = 1, ..., Nk
k=1 s=1
βsk ∈ {0, 1},
4.1.2
k = 1, ..., K, s = 1, ..., Nk
Exemplo
Considere o exemplo exposto em [27]: tem-se uma mochila com tamanho igual
a 28mm e as informações dos itens que podem compor a mochila são dadas na tabela 4.1:
Classe 1
item
1 2 3
utilidade
7 8 4
largura (mm) 3 4 6
Classe 2
4 5 6
3 5 7
5 2 4
Classe 3
7 8 9
6 2 4
5 3 4
Tabela 4.1: Dados dos itens do exemplo
As classes são: A1 = {1, 2, 3}, A2 = {4, 5, 6} e A3 = {7, 8, 9}; os tamanhos
mínimo (Lmin ) e máximo (Lmax ), respectivamente, para os compartimentos da classe 1
são dados por 5 e 9, para a classe 2 são 5 e 10, e para a classe 3 são 3 e 10. A inclusão de
compartimentos com itens da classe 2 na mochila ocasiona perda de S2 = 4mm (2mm em
cada lateral), para a classe 1 e 3 não há perdas, S1 = S3 = 0.
Um possível padrão compartimentado é mostrado na Figura 4.1. Neste padrão
foram incluídos: dois itens do tipo 2 da classe 1; um item do tipo 5 e um do tipo 6 da
classe 2; dois itens do tipo 7 da classe 3. Sendo então o valor total de utilidade obtido de
40. Esta é uma possível solução, mas não é ótima.
Figura 4.1: Padrão compartimentado não ótimo
Na Figura 4.2 é mostrada uma solução ótima. Nesta solução foram feitos quatro
compartimentos da classe 1: o primeiro compartimento tem um item do tipo 1 e um item
do tipo 2, o segundo e o terceiro compartimentos têm, cada um deles, dois itens do tipo 1,
e o quarto compartimento tem três itens do tipo 1; sendo que a utilidade obtida neste caso
é de 64, que é bem maior que 40.
4.2 Modelo Linear Inteiro para o Problema da Mochila Compartimentada
76
Figura 4.2: Padrão compartimentado ótimo
4.2
Modelo Linear Inteiro para o Problema da Mochila
Compartimentada
Analisando o modelo quadrático se nota que a função objetivo é quadrática
devido ao produto das variáveis aisk com as βsk . Mas, temos que o objetivo é maximizar
a soma das utilidades dos itens incluídos menos a soma dos custos dos compartimentos
usados na solução:
K
max ∑
!
Nk
− ck βsk
∑ ∑ viaisk
k=1 s=1
i∈Ak
Sendo só necessário ter alguma restrição que garanta:
(
βsk =
0 se ∃i ∈ Ak tq aisk > 0
1 se ∀i ∈ Ak , aisk = 0
Ou seja, se um item é incluído, então tem que ser dentro de um compartimento da mesma
classe dele, e se um compartimento é aberto, então ele tem que ter pelo menos um item.
Uma restrição que garante isto é:
aisk = βsk aisk ,
i = 1, ..., n, k = 1, ..., K, s = 1, ...Nk
Com isto a restrição quadrática:
K
!
Nk
∑ ∑ ∑ liaisk + Sk
k=1 s=1
βsk ≤ L
i∈Ak
se torna:
K
!
Nk
∑ ∑ ∑ liaisk
k=1 s=1
+ Sk βsk ≤ L
i∈Ak
E as restrições da forma:
k
Lmin
βsk ≤ βsk
k
,
∑ liaisk ≤ βsk Lmax
i∈Ak
k = 1, ..., K, s = 1, ..., Nk
4.2 Modelo Linear Inteiro para o Problema da Mochila Compartimentada
77
se tornam:
k
Lmin
βsk ≤
k
,
∑ liaisk ≤ βsk Lmax
k = 1, ..., K, s = 1, ..., Nk
i∈Ak
Assim, é obtido o seguinte modelo para o problema da mochila compartimentada:
K
max
− ck βsk
∑ ∑ ∑ viaisk
k=1 s=1
K
s.a :
!
Nk
i∈Ak
!
Nk
li aisk
k=1 s=1 i∈Ak
k
Lmin
βsk ≤
li aisk
i∈Ak
∑∑ ∑
∑
aisk ≥ 0, inteiro,
K
+ Sk βsk ≤ L
k
≤ βsk Lmax
,
k = 1, ..., K, s = 1, ..., Nk
i = 1, ..., n, k = 1, ..., K, s = 1, ...Nk
Nk
∑ ∑ aisk ≤ σi,
i = 1, ..., n
k=1 s=1
aisk = βsk aisk ,
bsk ∈ {0, 1},
i = 1, ..., n, k = 1, ..., K, s = 1, ...Nk
k = 1, ..., K, s = 1, ...Nk
O modelo é “quase” linear inteiro, sendo somente quadráticas as restrições:
aisk = βsk aisk ,
i = 1, ..., n, k = 1, ..., K, s = 1, ...Nk
O objetivo destas restrições é garantir:
(
βsk =
0
1
se ∃i ∈ Ak tal que aisk > 0
se ∀i ∈ Ak , aisk = 0
Mas isto é garantido pelas restrições do tipo:
k
Lmin
βsk ≤
k
,
∑ liaisk ≤ βsk Lmax
k = 1, ..., K, s = 1, ..., Nk
i∈Ak
Elas também garantem que cada compartimento aberto esteja nos limites estabelecidos para ele. Assim, são desnecessárias as restrições quadráticas e é obtido o seguinte
modelo linear inteiro.
K
max
!
Nk
∑ ∑ ∑ viaisk
k=1 s=1
i∈Ak
− ck βsk
4.2 Modelo Linear Inteiro para o Problema da Mochila Compartimentada
K
s.a :
!
Nk
li aisk
k=1 s=1 i∈Ak
k
Lmin
βsk ≤
li aisk
i∈Ak
∑∑ ∑
∑
K
78
+ Sk βsk ≤ L
k
≤ βsk Lmax
,
k = 1, ..., K, s = 1, ..., Nk
Nk
∑ ∑ aisk ≤ σi,
i = 1, ..., n
aisk ≥ 0, inteiro,
i = 1, ..., n, k = 1, ..., K, s = 1, ...Nk
k=1 s=1
bsk ∈ {0, 1},
k = 1, ..., K, s = 1, ...Nk
O modelo linear obtido acima é parecido ao proposto em [35]:
K
max
Nk
∑ ∑ ∑ viaisk
k=1 s=1 i∈Ak
K
s.a :
Nk
li aisk ≤ L
k=1 s=1 i∈Ak
k
k
Lmin
βsk ≤
li aisk ≤ βsk Lmax
,
i∈Ak
(4-1)
∑∑∑
∑
K
k = 1, ..., K, s = 1, ..., Nk
(4-2)
Nk
∑ ∑ aisk ≤ σi,
i = 1, ..., n
(4-3)
k=1 s=1
K Nk
∑ ∑ βsk ≤ F1
(4-4)
∑ aisk ≤ F2, k = 1, ..., K, s = 1, ...Nk
∑ liaisk ≥ ∑ liai(s+1)k , k = 1, ..., K, s = 1, ..., Nk
(4-5)
k=1 s=1
i∈Ak
i∈Ak
(4-6)
i∈Ak
aisk ≥ 0, inteiro,
bsk ∈ {0, 1},
i = 1, ..., n, k = 1, ..., K, s = 1, ...Nk
k = 1, ..., K, s = 1, ...Nk
onde F1 e F2 , são constantes para limitar, respectivamente, o número de compartimentos
da mochila e o número de itens em um compartimento.
Note-se que as diferenças entre o modelo linear obtido e o apresentado em [35]
são pequenas:
• Tanto na função objetivo quanto nas restrições 4-1, o modelo descrito em [35]
desconsidera os custos e as perdas de espaço por inclusão de compartimentos na
mochila.
• As restrições 4-2 e 4-4 são exatamente as mesmas em ambos os modelos.
• O modelo dado em [35] considera as restrições 4-4 e 4-5 que expressam, respectivamente, limitantes para o número de compartimentos e o número de itens em um
4.3 Algoritmos
79
compartimento.
• As restrições 4-6 do modelo proposto em [35] fazem uma ordenação dos compartimentos para eliminar soluções simétricas.
4.3
Algoritmos
Nesta seção são apresentadas propostas algorítmicas para tentar solucionar o
problema da mochila compartimentada. A primeira delas é uma heurística gulosa baseada
na solução do problema clássico da mochila, enquanto a segunda é uma metaheurística
baseada no GRASP que ao invés de busca local usa path-relinking.
4.3.1
Heurística Gulosa
A heurística gulosa que propomos primeiramente soluciona para cada classe
de itens o problema clássico da mochila, com capacidades entre o tamanho mínimo e
máximo de cada compartimento. Depois adiciona na mochila o compartimento de maior
valor em proporção com o espaço ocupado por ele, e atualiza os dados para esta classe de
itens, solucionando novamente o problema clássico da mochila desta classe. O processo
é repetido até que não seja possível incluir mais compartimentos ou a inclusão deles não
produza ganhos. O algoritmo 4.1 mostra a ideia deste procedimento.
Algoritmo 4.1: Heurística Gulosa para o problema da Mochila Compartimentada
Dados: Instância do problema da mochila compartimentada
1 início
2
para cada classe de itens k faça
k e Lk
3
Solucione o problema clássico da mochila para os valores entre Lmin
max
repita
Valor(Compk )
Ck ← compartimento Compk que maximiza Tamanho(Comp
, onde k é a
k)
classe do compartimento e Valor(Compk ) > 0
se foi selecionado um compartimento Ck então
Adicione-o na mochila
Atualize as demandas da classe k e as soluções desta classe do
k e Lk
problema clássico da mochila para os valores entre Lmin
max
4
5
6
7
8
até não adicionar um novo compartimento na solução
9
10
fim
4.3.2
GRASP usando Path-Relinking
A forma geral do GRASP foi mostrada no capítulo 2, enquanto o algoritmo 4.2
mostra a forma geral do path-relinking. O path-relinking é uma heurística onde dadas
4.4 Experimentos Computacionais
80
duas soluções x1 e x2 , ela faz movimentos de x1 para x2 passando por diferentes soluções
que têm características de ambas as soluções x1 e x2 .
Algoritmo 4.2: Forma geral do Path-relinking
Dados: xdest : solução destino
xorig : solução origem
1 início
2
xmelhor ← xorig
3
repita
4
xorig ← vizinho de xorig que minimiza a diferença simétrica entre xorig e
xdest
5
se xorig é melhor que xmelhor então
6
xmelhor ← xorig
até xorig = xdest
retorne xmelhor
7
8
9
fim
Nossa proposta é utilizar o path-relinking nas iterações do GRASP ao invés de
usar uma busca local. O algoritmo 4.3 descreve esta ideia.
4.4
4.4.1
Experimentos Computacionais
Instâncias
As propostas algorítmicas foram testadas sobre instâncias aleatórias geradas
como descrito em [27, 31]. Como as instâncias de [27, 31] não estavam disponíveis
não foram comparados os nossos algoritmos com os da literatura. Foram fixados para
todas as intâncias: a capacidade da mochila, os tamanhos mínimo e máximo para cada
compartimento, e a perda de espaço na mochila quando um compartimento é incluído. A
tabela 4.2 mostra os valores para estes parâmetros.
Os parâmetros gerados aleatoriamente foram: o tamanho e o valor dos itens, e o
custo pela inclusão de um compartimento. A tabela 4.3 mostra os intervalos dos valores
destes parâmetros.
Foram geradas 200 instâncias agrupadas em 10 classes de 20 instâncias cada
uma. A descrição destas classes é dada na tabela 4.4.
4.4.2
Resultados Computacionais
As implementações usaram o compilador GNU C++ e todos os experimentos
foram feitos em um PC Intel Core 2 Duo, 2.4GHz e 2GB de RAM sob Ubuntu 9.04.
Para comparar as soluções obtidas com as dos modelos, o modelo linear foi solucionado
4.4 Experimentos Computacionais
Algoritmo 4.3: Algoritmos baseado no GRASP e no Path-relinking
Dados: Instância do problema da mochila compartimentada
1 início
2
xmelhor ← solução obtida aplicando a heurística gulosa descrita na seção
anterior
3
repita
4
x ← solução obtida aplicando a heurística gulosa descrita na seção anterior,
só que adicionando o melhor compartimento com uma probabilidade p
5
/*ideia similar ao path-relinking*/
6
repita
7
/*se x melhora a melhor solução, então atualize a melhor solução*/
8
se x melhora xmelhor então
9
x̄ ← x
10
x ← xmelhor
11
xmelhor ← x̄
k ← classe de itens onde é maior a diferença entre as utilidades dos
compartimentos entre xmelhor e x
x ← elimine os compartimentos da classe k em x e, se necessário, os
piores compartimentos de outras classes para alocar em x os
compartimentos da classe k de xmelhor
até x = xmelhor
até satisfazer as condições de parada
retorne xmelhor
12
13
14
15
16
17
fim
Parâmetro
Valor
Capacidade da Mochila
1200mm
Capacidade Mínima de um Compartimento 154mm
Capacidade Máxima de um Compartimento 456mm
Perda por Incluir um Compartimento
4mm
Tabela 4.2: Parâmetros fixos para todas as intâncias
Parâmetro
Valor Mínimo Valor Máximo
Tamanho de um Item
20mm
444mm
Valor de Utilidade de um Item
20
888
Custo de um Compartimento
1
100
Tabela 4.3: Parâmetros aleatórios para todas as intâncias
81
4.4 Experimentos Computacionais
Classe
1
2
3
4
5
6
7
8
9
10
82
Número de Classes de Itens
entre 3 e 10
entre 3 e 10
entre 11 e 20
entre 11 e 20
entre 11 e 20
entre 11 e 20
entre 11 e 20
entre 11 e 20
entre 11 e 20
entre 11 e 20
Número de Itens
entre 7 e 15
entre 7 e 15
entre 1 e 6
entre 1 e 6
entre 1 e 6
entre 1 e 6
entre 7 e 15
entre 7 e 15
entre 7 e 15
entre 7 e 15
Número de Itens Livres
entre 8 e 20
entre 8 e 20
entre 1 e 7
entre 1 e 7
entre 8 e 20
entre 8 e 20
entre 1 e 7
entre 1 e 7
entre 8 e 20
entre 8 e 20
Demanda dos Itens
entre 1 e 3
entre 4 e 15
entre 1 e 3
entre 4 e 15
entre 1 e 3
entre 4 e 15
entre 1 e 3
entre 4 e 15
entre 1 e 3
entre 4 e 15
Tabela 4.4: Descrição das classes de instâncias
utilizando o pacote GLPK (GNU Linear Programming Kit) que tem implementada uma
série de algoritmos que, de forma exata, soluciona problemas lineares inteiros.
A tabela 4.5 mostra a média dos resultados obtidos, dando um tempo limite de
600 segundos (10 minutos) ao processamento de cada instância pelo GLPK. A coluna
GAP é referente ao dado pelo GLPK para a solução encontrada pelo software, enquanto
as colunas Solução e Tempo, referem-se a média das soluções encontradas e dos tempos
de execução em segundos.
Classe
1
2
3
4
5
6
7
8
9
10
GAP
1.37
3.43
1.57
0.94
1.95
2.15
1.71
1.23
1.78
1.33
GLPK
Solução
2243
2211
2164
2216
2242
2267
2230
2268
2261
2300
Tempo
541
497
359
192
589
529
460
441
498
539
Heurística Gulosa
Solução Tempo
2271
0
2291
0
2177
0
2200
0
2291
0
2276
0
2228
0
2237
0
2264
0
2287
0
GRASP & Path-relinking
Solução
Tempo
2275
0
2291
0
2292
0
2221
0
2291
0
2315
0
2263
0
2298
0
2305
0
2341
0
Tabela 4.5: Soluções para o Problema da Mochila Compartimentada
A tabela 4.5 mostra como os resultados obtidos pelos nossos algoritmos são
melhores que os conseguidos pelo GLPK para as mesmas instâncias, sendo que o GRASP
usando path-relinking obtem as melhores soluções. Comparando estas soluções com as
do GLPK e o GAP dado por este software, podemos concluir que em geral as respostas
do GRASP são ótimas ou quase ótimas.
CAPÍTULO 5
Conclusões
Esta dissertação mostra resultados, teóricos e empíricos, gerados para três problemas de relativo interesse da comunidade de pesquisadores da área de otimização
combinatória. Vários dos resultados aqui mostrados são originais.
Para o problema de corte uni-dimensional de objetos com retalhos mostramos
dois novos modelos matemáticos, sendo que um deles superou, em todos os testes feitos,
os modelos existentes na literatura. Também projetamos uma heurística construtiva, um
algoritmo baseado no GRASP e uma matehaurística baseada em algoritmos evolutivos.
Os algoritmos propostos foram implementados e ainda melhorados usando processos em
paralelo com GPUs. Em todas as instâncias testadas, nossas propostas obtiveram soluções
de alta qualidade, principalmente a metaheurística baseada em algoritmos evolutivos.
Valendo ressaltar que os nossos algoritmos foram rápidos.
Para o problema dos companheiros estáveis, uma variante NP-difícil da classe
de problemas de emparelhamento estável, mostramos uma modelagem quadrática e outra
em programação linear inteira. Também projetamos uma Busca Tabu e versões de um
Branch-and-Bound, sendo seus desempenhos melhorados usando processos em paralelo
com GPUs. É importante destacar que os experimentos computacionais geraram bons
resultados para todas as instâncias testadas.
Para o problema da mochila compartimentada discutimos diferentes modelagens.
Tal como os outros dois primeiros problemas discutidos nesta dissertação, o problema
da mochila compartimentada é de difícil solução e tem numerosas aplicações. Para este
problema propomos uma nova heurística gulosa para solucioná-lo baseada em soluções
do problema clássico da mochila, e uma metaheurística baseada no GRASP que ao invés
de busca local usa path-relinking. Foram bons os resultados obtidos nos experimentos
computacionais, sendo particularmente muito boas as soluções obtidas pelo GRASP com
path-relinking.
Referências Bibliográficas
[1] A BUABARA , A.; M ORABITO, R. Cutting optimization of structural tubes to build
agricultural light aircrafts. Annals of Operation Research, 169:149–165, 2008.
[2] A RKIN , E. M.; B AE , S. W.; E FRAT, A.; O KAMOTO, K.; M ITCHELL , J. S.; P OLISHCHUK ,
V. Geometric stable roommates. Information Processing Letters, 109:219–222,
2009.
[3] B EASLEY, J. E. Heuristic Algorithms for the Unconstrained Binary Quadratic
Programming Problem. 1998.
[4] B ENNELL , J.; D OWSLAND, K. A tabu threasolding implementation for the irregular stock cutting problem. International Journal of Production Research, 37:4259–
4275, 1999.
[5] C HERRI , A.; A RENALES , M.; YANASSE , H. The one-dimensional cutting stock
problem with usable leftover - A heuirstic approach.
European Journal of
Operational Research, 196:897–908, 2009.
[6] C UI , Y.; YANG , Y. A Heuristic for the one-dimensional cutting stock problem
with usable leftover. European journal of operation research, 204:245–250, 2010.
[7] D IXIT, N.; K ERIVEN , R.; PARAGIOS , N.
GPU-Cuts: Combinatorial optimisa-
tion, graphic processing units and adaptative object extraction.
Centre
d’Enseignement et de Recherche en Technologies de l’Information et Systèmes,
2005.
[8] F EO, T. A.; R ESENDE , M. G. Greedy Randomized Adaptive Search Procedures.
Journal of Global Optimization, p. 109–133, 1995.
[9] F LEINER , T.; I RVING , R. W.; M ANLOVE , D. F. Efficient algorithms for generalized Stable Marriage and Roommates problems. Theoretical Computer Science,
381:162–176, 2007.
[10] G OLDBERG , D. E. Genetic Algorithms in Search, Optimization and Machine
Learning. Addison-Wesley, Berkeley, 1989.
Referências Bibliográficas
85
[11] G RADISAR , M.; J ESENCO, J.; R ESINOVIC, G.
Optimization of roll cutting in
clothing industry. Computers and Operational Research, 10:945–953, 1997.
[12] G RADISAR , M.; K LJAJIC, M.; R ESINOVIC, G.; J ESENCO, J. A sequential heuristic procedure for one-dimensional cutting. European Journal of Operational Research, 114:557–568, 1999.
[13] G RADISAR , M.; T RKMAN , P. A combined approach to the solution to the general
one-dimensional cutting stock problem. Computers and Operational Research,
32:1793–1807, 2005.
[14] H OTO, R.
O problema da mochila compartimentada aplicado no corte de
bobinas de aço. Tese de Doutorado, COPPE/UFRJ, 2001.
[15] H OTO, R.; A RENALES , M. N.; M ACULAN , N. O PROBLEMA DA MOCHILA COMPARTIMENTADA. Relatório Técnico, Universidade Estadual de Londrina, 1999.
[16] H OTO, R.; F ENATO, A.; YANNASSE , H.; M ACULAN , N. UMA NOVA ABORDAGEM
PARA O PROBLEMA DA MOCHILA COMPARTIMENTADA. XXXVIII SIMPÓSIO
BRASILEIRO DE PESQUISA OPERACIONAL, 2006.
[17] H OTO, R.; M ARQUES , F.; A RENALES , M. Uma proposta para resolver Mochilas
Compartimentadas Restritas por meio de Geração de Colunas. VII ON PCE –
Oficina Nacional de problemas de Corte e Empacotamento, 2003.
[18] I NARRA , E.; L ARREA , C.; M OLIS , E. The Stability of the Roommate Problem
Revisited. 2007.
[19] I RVING , R. W. An Efficient Algorithm for the Stable Roommates Problem. Journal
of Algorithms, 6:577–595, 1985.
[20] I RVING , R. W. The cycle roommates problem: a hard case of kidney exchange.
Information Processing Letters, 103:1–4, 2007.
[21] I RVING , R. W.; M ANLOVE , D. F.
The Stable Roommates Problem with Ties.
Journal of Algorithms, 43:85–105, 2002.
[22] I RVING , R. W.; S COTT, S. The stable fixtures problem - A many-to-many extension of stable roommates. Discrete Applied Mathematics, 155:2118–2129, 2007.
[23] I WAMA , K.; M IYAZAKI , S.
A Survey of the Stable Marriage Problem and Its
Variants. Proceedings of the International Conference on Informatics Education and
Research for Knowledge-Circulating Society, p. 131–136, 2008.
Referências Bibliográficas
86
[24] J ANIAK , A.; J ANIAK , W.; L ICHTENSTEIN , M. Tabu search on GPU. Journal of
Universal Computer Science, 14:2416–2427, 2008.
[25] K AZUO IWAMA, S. M.; OKAMOTO, K. Stable Roommates Problem with Triple
Rooms. 10th Korea–Japan Joint Workshop on Algorithms and Computation, p. 105–
112, 2007.
[26] KOCHENBERGER , G. A.; G LOVER , F.; A LIDAEE , B AHRAM ; R EGO, C. A Unified
Modeling and Solution Framework For Combinatorial Optimization Problems.
OR Spectrum, 26:237–250, 2002.
[27] L EÃO, A. A. D. S. Geração de Colunas para Problemas de Corte em Duas Fases.
Dissetação de Mestrado, ICMC/USP, 2009.
[28] M ARQUES , F. P.
O Problema da Mochila Compartimentada.
Dissetação de
Mestrado, ICMC/USP, 2000.
[29] M ARQUES , F. P. O Problema da Mochila Compartimentada e Aplicações. Dissetação de Doutorado, ICMC/USP, 2004.
[30] M ARQUES , F. P.; A RENALES , M. N. O Problema da mochila compartimentada e
aplicações. Pesquisa Operacional, 22, 2002.
[31] M ARQUES , F. P.; A RENALES , M. N. The compartmentalised knapsack problem.
Computers and Operations Research, 34:2109–2129, 2007.
[32] S ETHURAMAN , J.; T EO, C. A Polynomial-time Algorithm for the Bistable Roommates Problem. Journal of Computer and System Sciences, 63:486–497, 2001.
[33] V ELASCO, A.; DE PAULA , G.; V IEIRA , E. Um algoritmo baseado na GRASP para
o problema de corte bidimensional guilhotinado e restrito. Gestão da Produção,
Operações e Sistemas, 3:129–141, 2009.
[34] W EEMS , B. Bistable versions of the marriage and roommates problems. Journal
of Computer and System Sciences, 59:504–520, 1999.
[35] YANASSE , H.; H OTO, R.; S POLADOR , F.; A RENALES , M. Um modelo linear para
o problema da mochila compartimentada. IX ON PCE – Oficina Nacional de
problemas de Corte e Empacotamento, 2005.
APÊNDICE A
Funções para Trabalhar com Vetores Inteiros
na Memória das GPUs
Código
A.1
Funções para Trabalhar com Vetores
Inteiros na Memória das GPUs
1
#include <cutil_inline.h>
2
3
4
5
6
7
//Function that shows how to separate memory in the GPUs memory space
void Separate_GPU_Integer_Array(int** gpu_pointer, int size)
{
cutilSafeCall(cudaMalloc(gpu_pointer, size * sizeof(int)));
}
8
9
10
11
12
13
14
//Function that shows how to release the memory used in the GPUs memory
//space
void Release_GPU_Integer_Array(int* gpu_pointer)
{
cutilSafeCall(cudaFree(gpu_pointer));
}
15
16
17
18
19
20
21
22
23
//Functions that shows how to copy data from GPUs memory space to CPUs
//memory space
void Copy_Integer_Array_From_GPU_to_CPU(int* gpu_pointer
, int* cpu_pointer, int size)
{
cutilSafeCall(cudaMemcpy(cpu_pointer, gpu_pointer
, size * sizeof(int), cudaMemcpyDeviceToHost));
}
24
25
26
27
28
29
30
31
32
//Functions that shows how to copy data from CPUs memory space to GPUs
//memory space
void Copy_Integer_Array_From_CPU_to_GPU(int* cpu_pointer
, int* gpu_pointer, int size)
{
cutilSafeCall(cudaMemcpy(cpu_pointer, gpu_pointer
, size * sizeof(int), cudaMemcpyHostToDevice));
}
APÊNDICE B
Código dos Kernels Correspondêntes às
Implementações Parallelas das Heurísticas
Código B.1 Kernels da Heurística Construtiva para
o Problema de Corte com Retalhos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//Kernel for similar process to FFD, it is applied in parallel for each
//type of object
/*Parameters of the function:
object_size: array with the information of the sizes of the objects
object_number: array with the information of number of objects in stock
object_count: number of types of objects
piece_size: array with information of sizes of the items
piece_demand: array with information of the items demand
piece_count: number of type of items
patterns_pk: array with the result patterns created by the process*/
__global__ void Similar_FFD(int* object_size, int* object_number
, int object_count, int* piece_size
, int* piece_demand, int piece_count
, int* patterns_pk)
{
int i, count;
//gets type of the current object
int object_type = threadIdx.x;
//gets possition in vector of patterns, for current object
int pos = object_type * (piece_Count + 1);
//verify if the object type is valid and if there are objects
//of that type in stock
if(object_type >= 0 && object_type < object_count
&& object_number[object_type] > 0)
{
patterns_pk[pos + piece_count] = object_size[object_type];
for(i = 0; i < piece_count; i++)
{
count = patterns_pk[pos + piece_count]/ piece_size[i];
if(count > piece_demand[i])
count = piece_demand[i];
patterns_pk[pos + i] = count;
patterns_pk[pos + piece_count] -= count * piece_size[i];
}
}
36
37
}
Apêndice B
89
Código B.2 Kernels do Algoritmo Baseado em GRASP
para o Problema de Corte com Retalhos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//Kernel for process that calculates de data to solve the Knapsack problem
//via dynamic programming, it is applied for each type of item and executes
//a thread for each value between zero and the size of the item
/*
Parameters of the function:
table_items_type: in each position i has the type of item that reach the
value i in a linear combination
table_items_number: in each position i has the number of items of type
table_items_type[i] used to reach the value i in a linear combination
table_size: maximum size of the tables (capacity of the knapsack)
item_size: size of the current type of item
item_demand: demand of the current type of item
item_type: current type of item
*/
__global__ void Dynamic_Knapsack_Preparation(int* table_items_type
, int* table_items_number, int table_size
, int item_size, int item_demand, int item_type)
{
int i;
//gets value between 0 and the size of the current item
int position = threadIdx.x;
//if the demand of the item is zero, it is not used
if(item_demand > 0)
{
for(i = position; i < table_size - item_size; i += item_size)
if(table_items_type[i + item_size] < 0
&& table_items_type[i] >= 0
&& (table_items_type[i] != item_type
|| table_items_number[i] < item_demand))
{
table_items_type[i + item_size] = item_type;
table_items_number[i + item_size] = 1;
if(table_items_type[i] == item_type)
table_items_number[i + item_size]
+= table_items_number[i];
}
}
}
Apêndice B
90
Código B.3 Kernels do Algoritmo Baseado em GRASP
para o Problema de Corte com Retalhos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//Kernel for process that calculates in parallel for each object the
//solution of the Knapsack problem via dynamic programming
/*
Parameters of the function:
leftovers: array which has at each position i the leftover associtaed
to the solution of the Knapsack problem of object i
table_items_type: in each position i has the type of item that reach
the value i in a linear combination
object_size: array with object sizes
object_number: array with the number of object of each type in stock
object_count: number of type of objects
upper_value: value large enough
*/
__global__ void Dynamic_Knapsack_Solution(int* leftovers, int* table_items_type
, int* object_size, int* object_number
, int object_count, int upper_value
, int object_type)
{
int i;
//gets type of the current object
int object_type = threadIdx.x;
//the value of obect_type must be valid and there must be objects
//of that type in stock
if(object_type >= 0 && object_type < object_count
&& object_number[object_type] > 0)
{
i = object_size[object_type];
while(i > 0 && table_items_type[i] < 0)
i--;
leftovers[object_type] = object_size[object_type] - i;
if(i == 0)
leftovers[object_type] = upper_value;
}
}
Apêndice B
91
Código
B.4
Kernel do Algoritmo Baseado em
Processos Evolutivos para o Problema de Corte
com Retalhos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//Kernel for process that calculates in parallel for each type of object
//the rank value of the solution of the Knapsack problem calculated via
//dynamic programming
/*
Parameters of the function:
rank: array of rank values
table_items_type: in each position i has the type of item that reach the
value i in a linear combination
table_items_number: in each position i has the number of items of type
table_items_type[i] used to reach the value i in a linear combination
object_size: array with object sizes
object_number: array with the number of object of each type in stock
piece_size: array of sizes of type of items
object_count: number of type of objects
less_standard: minimum size of a standard object
fraction: used to determine if the item is a small item or a large item
*/
__global__ void Dynamic_Knapsack_Ranking(int* rank, int* table_items_type
, int* table_items_number, int* object_size
, int* object_number, int* piece_size, int object_count
, int less_standard, float fraction)
{
int i;
//gets type of the current object
int object_type = threadIdx.x;
//the value of obect_type must be valid and there must be objects
//of that type in stock
if(object_type >= 0 && object_type < object_count
&& object_number[object_type] > 0)
{
rank[object_type] = 0;
i = object_size[object_type];
while(i > 0 && table_items_type[i] < 0)
i--;
while(i > 0)
{
if(piece_size[table_items_type[i]]
>= (fraction * less_standard))
rank[object_type] += table_items_number[i];
i -= piece_size[table_items_type[i]] * table_items_number[i];
}
}
}
APÊNDICE C
Código para Executar os Kernels
Código C.1 Código para Executar os Kernels
1
#include <cutil_inline.h>
2
3
4
5
//Notice that for calling the kernels the arrays of memory must be in
//the GPUs memory space, and the results, if necessary are copied to the
//CPUs memomry space
6
7
//Calling kernels of Constructive Heuristic for Cut Problem
8
9
10
11
12
13
14
15
16
void Call_Similar_FFD(int* object_size, int* object_number, int object_count
, int* piece_size, int* piece_demand, int piece_count
, int* patterns_pk)
{
Similar_FFD<<<0, object_count>>>(object_size, object_number
, object_count, piece_size, piece_demand, piece_count
, patterns_pk);
}
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void Call_Improve_FFD(int* object_size, int* object_number, int object_count
, int* piece_size, int* piece_demand, int piece_count
, int* patterns_pk, int* patterns_pk_bar
, int* patterns_pk_hat, int delta, float beta
, float ganma, int less_standard)
{
Improve_FFD<<<0, object_count>>>(object_size, object_number
, object_count, piece_size, piece_demand, piece_count
, patterns_pk, patterns_pk_bar, patterns_pk_hat, delta
, beta, ganma, less_standard);
}
Apêndice C
93
Código C.2 Código para Executar os Kernels
1
#include <cutil_inline.h>
2
3
4
5
//Notice that for calling the kernels the arrays of memory must be in
//the GPUs memory space, and the results, if necessary are copied to the
//CPUs memomry space
6
7
//Calling kernels of GRASP Based Algorithm for Cut Problem
8
9
10
11
12
13
14
15
16
17
//This process must be called for each type of item
void Call_Dynamic_Knapsack_Preparation(int* table_items_type
, int* table_items_number, int table_size, int item_size
, int item_demand, int item_type)
{
Dynamic_Knapsack_Preparation<<<0, item_size>>>(table_items_type
, table_items_number, table_size, item_size
, item_demand, item_type);
}
18
19
20
21
22
23
24
25
26
27
28
//This process is called for each type of item after call the dynamic
//preparation process
void Call_Dynamic_Knapsack_Solution(int* leftovers, int* table_items_type
, int* object_size, int* object_number, int object_count
, int upper_value, int object_type)
{
Dynamic_Knapsack_Solution<<<0, object_count>>>(leftovers
, table_items_type, object_size, object_number, object_count
, upper_value, object_type);
}
29
30
//Calling kernel of Evolutive Based Algorithm for Cut Problem
31
32
33
34
35
36
37
38
39
40
41
42
43
//This process is called after the Dynamic_Knapsack_Preparation process
//for each type of item
void Call_Dynamic_Knapsack_Ranking(int* rank, int* table_items_type
, int* table_items_number, int* object_size
, int* object_number, int* piece_size, int object_count
, int less_standard, float fraction)
{
Dynamic_Knapsack_Ranking<<<0, object_count>>>(rank, table_items_type
, table_items_number, object_size, object_number, piece_size
, object_count, less_standard, fraction);
}
Apêndice C
94
Código C.3 Código para Executar os Kernels
1
#include <cutil_inline.h>
2
3
4
5
//Notice that for calling the kernels the arrays of memory must be in
//the GPUs memory space, and the results, if necessary are copied to the
//CPUs memomry space
6
7
8
//Calling kernells of Tabu Search for Stable Roommates Problem
9
10
11
12
13
14
15
void Call_Objective_Value(int* neighbors_value, int* x, int n, int* m
, int current_value, int* tabu_list, int local)
{
Objective_Value<<<0, n * n>>>(neighbors_value, x, n, m
, current_value, tabu_list, local);
}
16
17
18
19
20
21
22
23
//This process is called after the process Objective_Value
void Call_Best_Neighbors(int* neighbors, int* values, int* objective_values
, int n, int* tabu_list, int local)
{
Best_Neighbors<<<0, n>>>(neighbors, values, objective_values, n
, tabu_list, local);
}
24
25
26
27
28
void Call_Update_Tabu_List(int* tabu_list, int p1, int p2, int val, int n)
{
Update_Tabu_List<<<0, n * n>>>(tabu_list, p1, p2, val, n);
}
Download

Modelos Matemáticos e Algoritmos para Problemas