Escolar Documentos
Profissional Documentos
Cultura Documentos
Algoritmos e Modelos
Matemáticos para o Problema da
k-Partição de Números
Belo Horizonte
Fevereiro de 2017
CENTRO FEDERAL DE EDUCAÇÃO
TECNOLÓGICA DE MINAS GERAIS
Diretoria de Pesquisa e Pós-Graduação
Programa de Pós-Graduação em
Modelagem Matemática e Computacional
Algoritmos e Modelos
Matemáticos para o Problema da
k-Partição de Números
Belo Horizonte
Fevereiro de 2017
Faria, Alexandre Frias
F224a Algoritmos e modelos matemáticos para o problema da k-partição
de números. / Alexandre Frias Faria. – – Belo Horizonte, 2017.
x, 67 f. : il.
Bibliografia
CDD 519.6
ii
Resumo
iii
Abstract
This dissertation presents a mathematical formulation and algorithms for the op-
timization version of the Multi-Way Number Partitioning Problem. The problem
consists in distributing the elements of a given set into k disjoint subsets such that
the sum of each subset elements fits in the shortest interval. The proposed mathema-
tical formulation is based on two similar problems in the literature. The multiplicity
of solutions of the integer programming model are eliminated by reducing the num-
ber of variables to a minimum. The NP-completeness of the problem studied is
shown. Heuristic, approximate and exact algorithms of the literature for related
problems are studied. The ILS meta-heuristic (Iterated Local Search) is applied
to the solution generated by an approximate algorithm. The strategy is to apply
greedy method in all phases of the algorithm, both in initialization and in the choice
of ILS movements. It is proposed to improve the exact Branch-and-Bound methods
present in the literature. This modification refines the limitations of the method
using the relaxation of the proposed mathematical model and ILS. A search crite-
rion is inserted so that the most promising nodes have priority. The results show
the solution of ILS overcoming the solutions of constructive heuristics listed in the
literature. The quality of the solution ILS is certified by exact methods, one of the
literature and another with the improvements proposed in this work. The modi-
fications of the exact algorithm are shown to be effective in comparing the ration
between solution achieved and number of nodes exploited in the two versions.
iv
Lista de Figuras
v
Lista de Tabelas
vi
Lista de Algoritmos
vii
Sumário
1 Introdução 1
1.1 Definições Iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Problema da Partição de Números . . . . . . . . . . . . . . . . . . . . 2
1.3 Problema da k-Partição de Números . . . . . . . . . . . . . . . . . . 3
1.4 Problema Multidimensional da Partição de Números . . . . . . . . . . 4
1.5 Problema Multidimensional da k-Partição de Números . . . . . . . . 5
1.6 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.7 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.8 Justificativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.9 Organização da Dissertação . . . . . . . . . . . . . . . . . . . . . . . 8
2 Caracterização do Problema 9
2.1 Definição do Problema da k-Partição de Números . . . . . . . . . . . 9
2.2 Formulação Matemática . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Solução via Algoritmo Ingênuo . . . . . . . . . . . . . . . . . . . . . . 15
2.4 Revisão Bibliográfica . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4.1 Uma Visão Histórica . . . . . . . . . . . . . . . . . . . . . . . 17
2.4.2 Panorama das Publicações mais Relevantes . . . . . . . . . . . 18
4 Fundamentação Teórica 27
4.1 Algoritmo Longest Processing Time first (LPT) . . . . . . . . . . . . 27
4.2 Algoritmo 0/1-Interchange . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3 Problema da Mochila e Soma dos Subconjuntos . . . . . . . . . . . . 29
4.4 Iterated Local Search (ILS) . . . . . . . . . . . . . . . . . . . . . . . . 31
4.5 Heurística de Karmarkar-Karp para k ≥ 2 . . . . . . . . . . . . . . . 31
4.6 Método de Branch and Bound . . . . . . . . . . . . . . . . . . . . . 34
4.7 Complete Greedy Algorithm (CGA) . . . . . . . . . . . . . . . . . . . 36
viii
5.2.1 Movimento e Vizinhança . . . . . . . . . . . . . . . . . . . . . 44
5.2.2 Estratégia de Realocação . . . . . . . . . . . . . . . . . . . . . 44
5.2.3 Critérios de Parada . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2.4 Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.3 Intensificação do LPT . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.4 Algoritmos Exatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.5 Algoritmo Híbrido CGA+ILS . . . . . . . . . . . . . . . . . . . . . . 48
5.5.1 Limite Inferior para a Relaxação . . . . . . . . . . . . . . . . . 49
5.5.2 Limite Superior para a Relaxação . . . . . . . . . . . . . . . . 50
5.5.3 Prioridade de Busca na Árvore . . . . . . . . . . . . . . . . . 50
5.5.4 Estrutura Geral do Algoritmo CGA+ILS . . . . . . . . . . . . 51
6 Resultados Computacionais 53
6.1 Algoritmos Heurísticos . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.2 Algoritmos Exatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
7 Conclusão 61
7.1 Considerações Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.2 Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Referências 64
ix
Capítulo 1
Introdução
Definição 1.1.1 Uma função k.kp : Rn → R+ é uma norma de Rn se, para quais-
quer x, y ∈ Rn e a ∈ R:
• kxkp ≥ 0
1
1.2 Problema da Partição de Números 2
• kxkp = 0 ⇔ x = ~0
Definição 1.1.5 Seja um conjunto de índices In = {1, 2, ..., n}, uma sequência de
vetores V = {vi ∈ Zm + : i ∈ In } e um inteiro k. O objetivo é encontrar uma k-
partição de In de modo que os valores das somas dos elementos vi de cada parte
fiquem contidos dentro da menor bola possível.
Exemplo 1.2.1 A sequência V = {87, 6, 5, 45, 34, 2, 24, 12, 7, 6, 54, 34} pode ser par-
ticionada em:
O valor da função objetivo dessa partição é 160 − 156 = 4, mas a partição ótima
é:
{87, 34, 24, 6, 5, 2}, {54, 45, 34, 12, 7, 6}
| P {z } | P {z }
i∈A1 vi =158 i∈A2 vi =158
O valor da função objetivo dessa partição é 109 − 102 = 7, mas a partição ótima é:
{87, 12, 6} , {45, 34, 2, 24}, {5, 7, 6, 54, 34}
P
| {z } | P {z } | P {z }
i∈A1 vi =105 i∈A2 vi =105 i∈A3 vi =106
com valor de função objetivo 106 − 105 = 1. Observe que as partes possuem dimen-
sões (número de elementos) diferentes.
1.4 Problema Multidimensional da Partição de Números 4
V = {(8, 3, 6, 3), (8, 3, 12, 3), (8, 3, 0, 3), (17, 5, 10, 5), (10, 5, 10, 5),
(10, 5, 10, 3), (8, 3, 6, 1), (5, 3, 6, 3)}
1.5 Problema Multidimensional da k-Partição de Números 5
{vi : i ∈ A1 } = {(17, 5, 10, 5), (8, 3, 0, 3), (10, 5, 10, 5), (10, 5, 10, 3)},
| P
{z }
i∈A1 vi =(45,18,30,16)
{vi : i ∈ A2 } = {(8, 3, 6, 3), (8, 3, 12, 3), (8, 3, 6, 1), (5, 3, 6, 3)}
| P
{z }
i∈A2 vi =(29,12,30,10)
{vi : i ∈ A2 } = {(8, 3, 6, 3), (8, 3, 12, 3), (8, 3, 0, 3), (8, 3, 6, 1), (5, 3, 6, 3)}
| P
{z }
i∈A2 vi =(37,15,30,13)
{vi : i ∈ A1 } = {(17, 5, 10, 5), (10, 5, 10, 5), (10, 5, 10, 3)},
| P
{z }
i∈A1 vi =(37,15,30,13)
{vi : i ∈ A3 } = {(8, 3, 6, 3), (8, 3, 12, 3), (8, 3, 6, 1), (5, 3, 6, 3)}
| P
{z }
i∈A3 vi =(29,12,30,10)
1.6 Problema Multidimensional da k-Partição de Números 6
max {|(45, 18, 30, 16) − (29, 12, 30, 10)|, |(37, 15, 30, 13) − (29, 12, 30, 10)|,
|(45, 18, 30, 16) − (37, 15, 30, 13)|}
= max {|(16, 6, 0, 6)|, |(8, 3, 0, 3)|, |(8, 3, 0, 3)|} = 16
{vi : i ∈ A1 } = {(17, 5, 10, 5), (10, 5, 10, 5), (10, 5, 10, 3)},
| P
{z }
i∈A1 vi =(37,15,30,13)
{vi : i ∈ A3 } = {(8, 3, 6, 3), (8, 3, 12, 3), (8, 3, 0, 3), (8, 3, 6, 1), (5, 3, 6, 3)}
| P
{z }
i∈A3 vi =(37,15,30,13)
e com valor de função objetivo igual a 0, pois todas as partes têm igual soma. Sendo
assim, o diâmetro desse conjunto é a maior coordenada de 3 vetores nulos.
A expressão (1.6) pode ser utilizada como a função objetivo de qualquer um dos
problemas enunciados acima, seja do Problema apresentado na Seção 1.2, seja do
Problema apresentado na Seção 1.5 atual, sem qualquer inconsistência.
O trabalho de Pop e Matei (2013) adapta um outro modelo para o MDMWNPP,
a partir da formulação matemática apresentada em Kojić (2010) para o MDTWNPP
mostrada na Subseção 1.4.X
Seja vi ∈ Zm + e Sj = vi . A função objetivo é a maior diferença entre duas
i∈Aj
coordenadas de Sj 0 e Sj , para j 0 6= j, na forma:
X X
f ({A1 , A2 , ..., Ak }) = max max vil − min vil (1.7)
l j 0 j
i∈Aj 0 i∈Aj
MDMWNPP
MWNPP MDTWNPP
TWNPP
1.6 Objetivos
O objetivo geral deste trabalho é o estudo teórico e empírico do Problema da
k-Partição de Números baseado na análise de suas soluções heurísticas e exatas.
Os objetivos específicos do presente trabalho são avaliar a aplicação de algorit-
mos heurísticos com movimentos “gulosos” de troca e realocação, comparando-os
a heurísticas construtivas, testar suas possibilidades de aplicação como limitantes
de algoritmos exatos de enumeração implícita e verificar se as heurísticas propostas
geram limites superiores melhores que as da literatura.
1.7 Metodologia
Para alcançar os objetivos expostos na Seção 1.6, usam-se instâncias geradas
aleatoriamente. A avaliação do desempenho dos algoritmos propostos será com-
posta por análises descritivas, comparações de resultados obtidos por algoritmos da
literatura e estratégias abordadas nos trabalhos correlatos, citados na Seção 2.4 do
Capítulo 2.
Para alcançar esse objetivo, destaca-se a seguinte sequência metodológica:
1.8 Justificativas
O MWNPP é um problema NP-completo facilmente adaptável às classes de pro-
blemas reais de corte e empacotamento. Métodos aplicáveis ao MWNPP podem ser
aproveitados no estudo das soluções de outros problemas NP-completos. O MWNPP
apresenta diversos algoritmos exatos baseados em métodos de enumeração implícita
e programação dinâmica. Embora a complexidade desses algoritmos seja exponen-
cial, na prática, eles são bem mais rápidos que o esperado para instâncias de tamanho
razoável, de até 100 elementos. Esses fatos motivam a investigação de heurísticas
simples e eficientes para aumentar a velocidade de convergência dos métodos de
enumeração implícita aplicados ao MWNPP. Esse tipo de estudo, por um lado, tem
foco em garantir a otimalidade da solução encontrada quando o método exato tem
tempo o suficiente para finalizar sua busca, e por outro lado, reduzir o tempo neces-
sário para sua convergência. Em outras palavras, espera-se que a técnica empregada
apresente uma solução melhor em um período de tempo menor enquanto o método
não convergir.
Caracterização do Problema
9
2.1 Definição do Problema da k-Partição de Números 10
{1, 2, 3}
25
20
15
10
0
0 5 10 15 20 25
variável n
Problema do Empacotamento
Enunciado 2.2.1 Problema do Empacotamento (BPP): Sejam uma sequência de
itens {ai ∈ Z+ : i ∈ In } e pacotes de capacidade C ∈ Z+ , determinar qual é o
2.2 Formulação Matemática 12
Para resolver esse problema, deve-se encontrar uma partição da sequência dada
com o menor número de subconjuntos possível. A soma dos itens de cada um desses
subconjuntos não pode ultrapassar C. A formulação matemática, encontrada em
Ausiello et al. (2003b), está posta da seguinte maneira:
n
X
min yj (2.4)
j=1
Xn
suj. a ai xji ≤ Cyj , ∀j ∈ In (2.5)
i=1
n
X
xji = 1, ∀i ∈ In (2.6)
j=1
yj ∈ {0, 1}, ∀j ∈ In (2.7)
xji ∈ {0, 1}, ∀(j, i) ∈ In × In (2.8)
Para resolver esse problema, deve-se encontrar uma m-partição, partição esta
com exatamente m subconjuntos, da sequência dada. O subconjunto com a maior
soma de tarefas deve ser minimizado. A formulação matemática, também encon-
trada em Ausiello et al. (2003b), é dada por:
min T (2.9)
n
X
suj. a 0< ti xji ≤ T, ∀j ∈ Im (2.10)
i=1
m
X
xji = 1, ∀i ∈ In (2.11)
j=1
T ∈ Z+ (2.12)
xji ∈ {0, 1}, ∀(j, i) ∈ Im × In (2.13)
2.2 Formulação Matemática 13
min t2 − t1 (2.14)
X n
suj. a t1 ≤ vi xji ≤ t2 , ∀j ∈ Ik (2.15)
i=1
k
X
xji = 1, ∀i ∈ In (2.16)
j=1
t1 , t2 ∈ Z+ (2.17)
xji ∈ {0, 1}, ∀(j, i) ∈ Ik × In (2.18)
min t2 − t1 (2.19)
X n
suj. a t1 ≤ vi xji ≤ t2 , ∀j ∈ Ik (2.20)
i=1
k
X
xji = 1, ∀i ∈ In (2.21)
j=1
xji = 0, ∀(i, j) : i + j ≥ n + 2 (2.22)
t1 , t2 ∈ Z+ (2.23)
xji ∈ {0, 1}, ∀(j, i) ∈ Ik × In (2.24)
o tamanho do intervalo que contém todas as k somas dos elementos das partes e o
objetivo de minimização.
A restrição (2.22) é uma forma explícita de explicar uma propriedade do pro-
blema em apenas uma linha, mas deve aparecer de forma implícita no modelo, caso o
objetivo seja usá-lo em algum algoritmo ou em um “solver ” comercial de otimização.
min t2 − t1 (2.25)
n−j+1
X
suj. a t1 ≤ vi xji ≤ t2 , ∀j ∈ Ik (2.26)
i=1
min{n−i+1,k}
X
xji = 1, ∀i ∈ In (2.27)
j=1
t1 , t2 ∈ Z+ (2.28)
xji ∈ {0, 1}, ∀(j, i) : i + j ≤ n + 1 (2.29)
• Ferreira (2001), que apresenta uma nova equação para o valor esperado da
função objetivo do TWNPP.
Trabalhos como Gent e Walsh (1998) e Berretta e Moscato (1999) mostram que
o TWNPP é um problema muito difícil para metaheurísticas de uso geral, como Al-
goritmos Genéticos, Simulated Annealing e outros. Em muitos casos, esses métodos
perdem em tempo e desempenho para a Heurística de Karmarkar-Karp e até mesmo
para um algoritmo guloso como LPT. Textos mais recentes, como Kojić (2010) e Pop
e Matei (2013), usam várias classes de metaheurísticas em versões de maior com-
plexidade da família de Problemas da Partição de Números, como o MDTWNPP
2.4 Revisão Bibliográfica 18
Os artigos em que o item “Problema” está classificado como “Coletânea” são abor-
dagens teóricas sobre problemas NP-completos. Nestes casos, os itens “Objetivo”,
“Método” e “Complexidade” estão marcados com “#”.
Nos artigos em que o item “Método” está marcado com apenas “Est”, não há
nenhum algoritmo proposto, mas, sim, uma análise da dificuldade das instâncias.
O termo “amortizado” significa que o algoritmo faz cortes em suas ramificações
e quase nunca recai no pior caso.
Capítulo 3
Análise de Complexidade do
MWNPP
Este Capítulo tem a finalidade de cobrir uma lacuna teórica acerca do MWNPP,
apresentando uma demonstração de sua NP-completude. Para esta análise, considera-
se o MWNPP em sua versão de decisão mostrada no Enunciado 3.2.2. Esta restrição
não trará grandes perdas de generalidade. Na Seção 3.1, apresentam-se conceitos
preliminares, como definições, proposições e teoremas relacionados ao estudo das
classes de complexidade. A Seção 3.2 usa a aplicação dos conceitos discutidos na
Seção 3.1 ao MWNPP para classificá-lo como um problema NP-completo. A Seção
3.3 apresenta generalizações dentro da família de Problemas de Partição de Números
e uma discussão acerca dos resultados encontrados.
20
3.1 Conceitos Preliminares 21
Prova: Seja M (I) uma função computável em tempo polinomial, que leva uma
instância I do problema A para uma instância do problema B. Então, o Algoritmo
3.1 resolve o problema A em tempo polinomial.
B ≤p A, ∀B ∈ N P. (3.1)
Teorema 3.1.2 Se algum problema NP-difícil tem algoritmo eficiente, então todos
os problemas em NP também têm, isto é, P=NP.
Prova: Considere que A é NP-difícil. Para cada B ∈ N P , existe uma função com-
putável em tempo polinomial MB→A (I) que transforma uma instância I do problema
B para o problema A.
Os Teoremas 3.1.1 e 3.1.2 têm demonstrações muito similares, pois afirmam duas
questões muito parecidas sobre as implicações da redução de um problema ao outro.
(i) A ∈ N P ;
(ii) A é NP-difícil.
Seja I 2 uma sequência cujos índices podem ser 2-particionados em {A1 , A2 }. Tem-se
uma k-partição, dada por {A01 , A02 , ..., A0k }, para os índices da sequência associada à
instância M (I 2 ), sendo:
A01 = A1 (3.3)
A02 = A2 (3.4)
A0j = {j}, ∀j ∈ {3, ..., k} (3.5)
Para provar que a redução funciona, deve-se mostrar que uma resposta SIM para
o problema de decisão MWNPP2_d ocorre se, e somente se, a resposta para o
problema de decisão TWNPP_d é SIM. Em outras palavras:
Para isso, prova-se que f ({A01 , A02 , ..., A0k }) = f ({A1 , A2 }). Se a função M tem
tal propriedade, pode-se construir um algoritmo similar ao Algoritmo 3.1, sendo
B = M W N P P 2_d e A = T W N P P _d. Sem perda de generalidade, considera-se
X X
vi ≥ vi
i∈A1 i∈A2
Sabe-se que
X
Q = vi
i∈I 2
X
= vi
i∈A1 ∪A2
X X
= vi + vi
i∈A1 i∈A2
3.3 Análise da versão de Otimização do MWNPP 24
pois a média de dois números sempre está no intervalo entre esses dois números.
Nesse caso, a parte de maior soma de {A01 , A02 , ..., A0k } é a mesma parte de maior
soma de {A1 , A2 } e a parte de menor soma de {A01 , A02 , ..., A0k } é a mesma parte de
menor soma de {A1 , A2 }, ou seja, A01 = A1 e A0k = A2 . Portanto, ambas as partições
têm o mesmo valor de função objetivo.
Essa redução tem custo O(n) para calcular a soma Q dos elementos da sequência
da instância I 2 . A saída da função é uma instância I k , cuja sequência de inteiros
associada tem dimensão n + k − 2. Sendo k < n, pode-se afirmar, também, que a
redução é polinomial no tamanho da entrada. Assim, tem-se o seguinte corolário.
sendo:
Q Q
M (I) = I ∪ , ..., (3.9)
K1 K1
| {z }
K2 −K1 vezes
A função de redução M da Seção 3.2 também pode ser utlizada para o MWNPP
em sua versão de otimização. Esse fato tem relação direta com a possibilidade de
aplicação de um algoritmo para o MWNPP2_d à versão de otimização do MWNPP.
Pode-se aplicar uma busca binária no MWNPP2_d, apresentado no Enunciado
3.2.2, e encontrar o valor mínimo da função objetivo (1.2).
Suponha que, no Algoritmo 3.2, a função decide(I k , C) retorna 1 se existe uma
partição com valor de função objetivo menor que C e 0, em caso contrário, tendo
um custo computacional O(1).
Usando o Algoritmo 3.2, com custo computacional O(log(C)), determina-se o
valor mínimo da função objetivo, mas não o argumento ótimo associado à este.
Para descobrir a partição associada ao valor mínimo retornado pelo Algoritmo 3.2,
0
deve-se usar o Algoritmo 1, trocando o Oráculo O(I k , I k ) por um outro, na forma:
O MWNPP se encaixa nessa definição, pois suas instâncias podem ser identi-
ficadas em tempo polinomial, como exige o item (i), uma vez que são sequências
de inteiros positivos; esse procedimento de verificação tem custo O(n), sendo n o
tamanho da sequência. As soluções factíveis são verificáveis em tempo polinomial,
como exige o item (ii), pois são k-partições de índices dos elementos da sequência
dada, e esta verificação tem custo O(n2 ). Conforme conclui-se a partir do Teorema
3.2.2, a função objetivo dada pela Expressão (1.2) é computável em O(n). Por fim,
a meta do problema é a minimização dessa função objetivo.
Portanto, conclui-se que o MWNPP, em sua versão de otimização, é um problema
NP-completo segundo a Definição 3.3.1.
Capítulo 4
Fundamentação Teórica
função objetivo encontrado pelo algoritmo LPT para uma instância I k , a razão
entre estes valores é tal que:
LP T (I k ) 4 1
≤ − (4.1)
OP T (I k ) 3 3k
A demonstração desta razão de aproximação se encontra em Ausiello et al. (2003a).
27
4.2 Algoritmo 0/1-Interchange 28
{8, 5, 4} e {7, 6}
cuja maior soma é 17, resultado encontrado pelo (LPT), mas nunca um valor 18,
como a partição abaixo:
{8, 4} e {7, 6, 5}
2
Definição 4.3.1 Seja W ∈ N e um conjunto de itens I = {1, 2, ..., n}, tal que cada
elemento de I indexe um peso wi e um valor pi . Encontre um subconjunto de itens
que maximize o valor da mochila, respeitando sua capacidade W de peso. 2
n
X
max p j xj (4.2)
j=1
Xn
s.a w i xj ≤ W (4.3)
j=1
xj ∈ {0, 1} (4.4)
4.3 Problema da Mochila e Soma dos Subconjuntos 30
Assim, seja M (i, w) o valor da solução ótima para os itens {i, ..., n} e capacidade
W , na forma:
M (i, w) = max{M (i + 1, w), M (i + 1, w − wi ) + pi } (4.7)
4.5 Iterated Local Search (ILS) 31
z = min zj , j ∈ Ik (4.10)
j
O Critério (ii) merece uma atenção especial. Pode-se podar um nó j tal que
LBj > U B, porque a solução associada ao valor U B, ínfimo dos limites superiores,
sempre é factível quanto à integralidade. Mais geralmente, a solução associada à
qualquer U Bj é sempre factível, mas LBj é uma relaxação e, possivelmente, só terá
soluções factíveis nas últimas ramificações da árvore de enumeração ou no Critério
de poda (iii), quando U Bj = LBj .
4.6 Método de Branch and Bound 35
Nós não podados e não ramificados recebem o nome de nós ativos. Os nós ativos
são os únicos que podem gerar um limitante superior menor para o problema. A
otimalidade é detectada pelo algoritmo quando não há mais nós ativos. Sendo assim,
podemos inferir que, quanto melhor forem os limitantes, melhor será o desempenho
de um algoritmo Branch-and-Bound. O Algoritmo 4.8 apresenta um pseudo-código
do método Branch-and-Bound.
Algoritmo 4.8: Método de Branch-and-Bound.
Entrada: lower(), upper(), D, f ()
Saída: z∗
1 início
2 Criar uma fila Q;
3 U B = upper(f, D);
4 LB = lower(f, D);
5 N o = [LB, U B];
6 OP T = true;
7 enquanto |Q| > 0 ou OP T == true faça
8 N oi = remove(Q);
9 se LBi > U B então
10 continue;
11 fim
12 se LBi == U B então
13 se U Bi > U B então
14 U B = U Bi ;
15 fim
16 continue;
17 fim
18 senão
19 {D1 , D2 , ..., Dk } = branch(D);
20 para j = 1 até k faça
21 U Bj = upper(f, Dj );
22 LBj = lower(f, Dj );
23 N oj = [LBj , U Bj ];
24 insere(Q, N oj , prioridade(N oj ));
25 se U Bj > U B então
26 U B = U Bj ;
27 fim
28 fim
29 fim
30 se tempo > limite então
31 OP T = f alse;
32 |Q| = 0;
33 fim
34 fim
35 retorna U B
36 fim
O passo da ramificação da função prioridade mostrado na linha 24 diz respeito
ao processo de escolha da ordem dos nós a serem ramificados. Existem diversas
estratégias de seleção:
dentre outras.
A Busca em largura pode exigir mais memória do que o esperado, porém, é a
mais usada para problemas com árvore de busca k-ária. A Busca em profundidade
se mostra viável, pois sempre exige uma memória limitada polinomialmente. Outra
vantagem é que, a cada nível de profundidade atingido pelos nós resolução da rela-
xação, se aproxima mais da solução inteira. A Busca prioritária tem, como objetivo,
explorar o nó que possui o melhor limitante primeiro.
Estas variações do Método Branch-and-Bound geram algoritmos diversos, como
o mostrado na Seção seguinte.
(x1+x2+x3+x4, 0, 0)
(x1+ x2, 0, 0) (x1+ x2+ x3, 0, 0)
(x1+x2+x3, x4, 0)
Observe que, pela Figura 4.1, o método parece impraticável, pois há 22 nós
para uma instância de dimensão 4 e considerando k = 3, ou seja, uma instância
de pequena dimensão. Mas algumas boas ideias podem melhorar seu desempenho,
conforme discutido a seguir.
Existem alguns nós folhas infactíveis e isso induz a inserir uma regra de poda.
Na prática, esta poda é suprimida pelo corte por limitante, equivalente ao Critério
4.7 Complete Greedy Algorithm (CGA) 37
(14, 7, 5)
(14, 7, 0)
(8, 13, 5)
(8, 13, 0)
(13, 7, 6)
(8, 0, 0)
(8, 7, 11)
(15, 0, 0)
(15, 6, 0)
(15, 6, 5)
Figura 4.2: Exemplo de árvore de busca sem partes vazias para o MWNPP: V =
{8, 7, 6, 5} e k = 3
As entradas do vetor sum presente em cada um desses nós variam de acordo com
o nó que este representa. Como se vê na Figura 4.2, cada nó tem um vetor com
3 entradas. Calculando a diferença entre vetores sumf ilho e sumpai , identifica-se
o último elemento alocado. Por exemplo, no caso (15, 6, 5) − (15, 6, 0) = (0, 0, 5)
significa que o elemento 5 foi adicionado na parte 3. Observa-se essa propriedade
no Algoritmo 4.11.
Para construir o Algoritmo CGA, usa-se um limite inferior proposto em Korf
(1998), baseado no princípio de que, se a parte com soma maior supera P =
1 X
vi , uma (k − 1)-partição perfeita dos demais elementos é a melhor solução
k i∈A
max
que se pode encontrar. Guardada a soma dos elementos da sequência na inicializa-
ção do algoritmo, o custo da função lower(), calculada conforme o Algoritmo 4.9, é
O(k) em qualquer nível da árvore de busca.
De fato, se este limite inferior e se uma solução factível de um nó tiverem o
mesmo valor de função objetivo que o valor LB retornado na função lower(), este
nó será um ótimo local.
Deve-se ressaltar que este limite inferior não é uma solução relaxada do MWNPP,
pois não está associado a qualquer modelo matemático desse problema, como, por
exemplo, o mostrado pelas expressões (2.25)-(2.29). Devido a isso, não é um bom
limitante, à medida que os níveis da árvore de busca se afastam da raiz. Isto pode
4.7 Complete Greedy Algorithm (CGA) 38
(i) incorporar a função ramif ica() ao corpo do código do Branch and Bound; ou
4.7 Complete Greedy Algorithm (CGA) 39
(ii) incorporar os cortes dentro da função ramif ica(), trocando a lista F pela
própria fila Q.
4.3 e 4.4.
Algoritmo 4.12: Algoritmo CGA
Entrada: SolInit(), lower(), upper(), ramif ica(), V, k
Saída: U B
1 início
2 Criar uma fila Q;
3 h = 1;
4 sum1 = v1 ;
5 ub = SolInit();
6 lb = lower(V, sum, k, h + 1);
7 N o = [lb, ub, sum, h];
8 insere(Q, N o);
9 U B = ∞;
10 LB = 0;
11 i = 1;
12 OP T = true;
13 enquanto |Q| > 0 ou OP T == true faça
14 N oi = remove(Q);
15 F = ramif ica(V, k, upper(), loower(), N oi );
16 para N oj ∈ F faça
17 se N oj .lb > U B então
18 continue;
19 fim
20 se N oj .ub == N oj .lb então
21 se N oj .ub > U B então
22 U B = N oj .ub;
23 fim
24 continue;
25 fim
26 senão
27 insere(Q, N oj );
28 se N oj .ub > U B então
29 U B = N oj .ub;
30 fim
31 fim
32 fim
33 se tempo ≥ limite então
34 OP T = f alse;
35 |Q| = 0;
36 fim
37 fim
38 retorna U B
39 fim
LB1=0
UB1=3
1:7 2:7
LB2=7.5 LB2=0
UB2=9 UB2=3
LB1=0
UB1=3
1:7 2:7
LB2=7.5 LB2=0
UB2=9 UB2=3
LPT(11,8,7,4)
LB4*=3
UB4*=3
Figura 4.4: Exemplo de árvore de busca com podas e terminada com o algoritmo
(LPT) a partir do nível n − k − 2.
42
5.2 Adaptação do ILS para a Solução do Problema da k-Partição de Números 43
(i) a parte de maior soma fica menor e a parte de menor soma fica maior; ou
parte de maior soma. Se esse elemento não superar a metade do valor da função
objetivo para partição atual, busca-se um segundo elemento na mesma parte para
completar essa diferença. Caso contrário, busca-se um segundo elemento na parte de
menor soma para retirar o excesso. Caso não exista forma de se fazer uma troca ou
realocação de dois elementos sem a piora da função objetivo, tenta-se a realocação de
um único elemento. O algoritmo para quando não existirem mais trocas de melhora.
As subseções a seguir detalham esta estratégia.
Realocação de um elemento
A ideia principal do método é determinar, dentre todos os elementos da parte de
maior soma, aquele que mais reduz o valor da função objetivo, e realocá-lo na parte
de menor soma. Essa busca gera um subproblema, que consiste em encontrar:
max {ai } (5.2)
ai ∈Amax
!
1 X X
s.a ai ≤ vi − vi (5.3)
2 i∈Amax i∈Amin
5.2.4 Implementação
O ILS deve ser usado no lugar da função part2 () dentro do Algoritmo 5.1, já que
este opera trocas e realocações até o critério de parada. O Algoritmo 5.2 atualiza
suas entradas, realocando um ou dois elementos de X1 para Xk ou trocando dois
5.2 Adaptação do ILS para a Solução do Problema da k-Partição de Números 46
Suponha, sem perda de generalidade, que {X1 , X2 , ..., Xk } seja uma partição com
as partes ordenadas em ordem decrescente por suas somas. Assim, X1 representa a
parte de maior soma e Xk representa a parte de menor soma.
Usa-se o ILS para fazer movimentos entre X1 e Xk , já que este opera trocas
e realocações somente entre as partes de maior e menor soma. O Algoritmo 5.2
atualiza suas entradas, realocando um ou dois elementos de X1 para Xk ou trocando
dois elementos entre essas partes. Após reduzir o custo da função objetivo, ele
retorna ao Algoritmo 5.1 para decidir se deve buscar um novo movimento.
Representa-se a partição por uma min max heap de tabelas hash. Com esta
estrutura de dados, o custo para encontrar a maior e a menor parte após o movimento
do ILS tem complexidade O(log(n)). A função busca-remove(a, S) procura o maior
elemento menor ou igual ao valor a em uma lista encadeada. Por isso, os dados de X1
e Xk são armazenados em uma tabela hash, afim de amortizar o custo dessa busca.
A função hash usada na tabela tem as propriedades de um histograma, mantendo
elementos de um determinado intervalo dentro da mesma posição.
5.4 Intensificação do LPT 47
Seja a sequência V com todos os seu elementos contidos no intervalo (a, b). Para
alocar os elementos de V em uma tabela com tamanho m usa-se a função:
(x − a)
hash(x) = m. (5.8)
(b − a)
Para cada possibilidade, guarda-se o menor valor em uma variável auxiliar aux.
Assim, o Algoritmo Lpt_1 tem complexidade O(n2 ). Esse método garante que a res-
posta do Algoritmo Lpt_1 seja sempre menor ou igual à resposta do Algoritmo LPT.
1X
uma parte com a soma mais próxima de vi , retirá-la de V , decrementar k e
k i∈I
n
fazer isso até V = ∅. Esta ideia está posta no Algoritmo 5.4.
Algoritmo 5.4: kpart(): o algoritmo retorna parte a parte, usando, k vezes,
um algoritmo exato para o Problema da Soma de Subconjuntos.
Entrada: Uma sequência V , inteiro k, subsetsum()
Saída: k-Partição do conjunto V , {A1 , A2 , ..., Ak }
1 início
2 se V = ∅ então
3 break;
4 fim
Ak = subsetsum(V, k1 i∈In vi );
P
5
6 V = V \ Ak ;
7 {A1 , A2 , ..., Ak−1 } = kpart(V, k − 1);
8 retorna {A1 , A2 , ..., Ak };
9 fim
Esta Equação de recorrência 5.9 informa que f (i, sumj ) é o menor valor de todos
os subproblemas f (i − 1, sumj6=l ∪ suml − ai ), supondo que o elemento ai está na
parte l para cada l ∈ {1, ..., k − 1}, ou o subproblema f (i − 1, sumj ) que indica que
elemento ai está na parte k. A solução procurada será f (n, sumj ). Esse método é
inviável caso os elementos de V tenham muitos algarismos.
Seja H(I) uma heurística, R(I) uma relaxação e Opt(I) o ótimo global para o
problema de minimização I. Então, tem-se que:
Logo, uma melhoria em uma relaxação ou em uma heurística usada pode gerar
cortes em uma árvore de busca e acelerar o desempenho de um método de enume-
ração implícita.
Para melhorar o desempenho do CGA, propõe-se uma série de modificações nos
seus principais métodos, com exceção da função ramifica().
Resultados Computacionais
z(A) − z(B)
Gap(A/B) = .100% (6.1)
z(A)
53
6.1 Algoritmos Heurísticos 54
inferior de HKK vs ILS supera em 2, 95% o maior quartil superior de Lpt_1 vs ILS.
K=3
Inst/Alg LPT Lpt_1 ILS KK Gap 0/1 Gap 1/ILS Gap KK/1
inst1 277667604 5937037 1687512 41346336 97,86% 71,58% 85,64%
inst2 33266420 15480040 1044716 1604884656 53,47% 93,25% 99,04%
inst3 130950041 39364611 4079508 2946161439 69,94% 89,64% 98,66%
inst4 42031699 35502732 17237659 58479988 15,53% 51,45% 39,29%
inst5 25191261 7118067 842232 6318269369 71,74% 88,17% 99,89%
inst6 218772576 9603978 3748156 636232165 95,61% 60,97% 98,49%
inst7 129206619 16126140 971246 103818313 87,52% 93,98% 84,47%
inst8 124586508 118159745 4266521 2328744777 5,16% 96,39% 94,93%
inst9 94160686 4227340 986676 74741269 95,51% 76,66% 94,34%
inst10 148223495 119895842 3903241 5698061694 19,11% 96,74% 97,90%
inst11 41115509 1947877 195622 3489497722 95,26% 89,96% 99,94%
inst12 78985609 48162349 19697495 1930925747 39,02% 59,10% 97,51%
inst13 78687824 24772373 605450 6020635525 68,52% 97,56% 99,59%
inst14 53432822 23953655 498615 378777978 55,17% 97,92% 93,68%
inst15 67315512 3972386 501916 16033000 94,10% 87,36% 75,22%
inst16 16378823 7254715 12989 160225313 55,71% 99,82% 95,47%
inst17 25902922 14815589 1012403 3149419117 42,80% 93,17% 99,53%
inst18 88537526 34748915 1781184 5407329606 60,75% 94,87% 99,36%
inst19 78236976 15483485 839650 1750977565 80,21% 94,58% 99,12%
inst20 7879334 634938 44351 3163580778 91,94% 93,01% 99,98%
K=4
Inst/Alg LPT Lpt_1 ILS KK Gap 0/1 Gap 1/ILS Gap KK/1
inst1 122406112 71137211 27098191 1284570205 41,88% 61,91% 94,46%
inst2 447131534 267558610 103757256 2546849966 40,16% 61,22% 89,49%
inst3 87670981 25383442 3529043 4174645695 71,05% 86,10% 99,39%
inst4 255279548 223112333 76068954 603181331 12,60% 65,91% 63,01%
inst5 68540827 28873113 5495161 9416668966 57,87% 80,97% 99,69%
inst6 163368284 131740030 85445183 2645091384 19,36% 35,14% 95,02%
inst7 108654410 20649653 2191613 1825896268 81,00% 89,39% 98,87%
inst8 37173373 11387722 4860900 6791194503 69,37% 57,31% 99,83%
inst9 63897598 21408945 6779057 2384730430 66,49% 68,34% 99,10%
inst10 51519147 46310499 26276183 4364461985 10,11% 43,26% 98,94%
inst11 32449998 16007361 154687 6663918656 50,67% 99,03% 99,76%
inst12 148352240 55565684 35865428 5667277649 62,54% 35,45% 99,02%
inst13 98619586 69540563 13420539 7414857611 29,49% 80,70% 99,06%
inst14 91039351 76185564 28074947 461236599 16,32% 63,15% 83,48%
inst15 63619258 28409584 24758230 2628417671 55,34% 12,85% 98,92%
inst16 23733845 13964928 1236509 2737419471 41,16% 91,15% 99,49%
inst17 75575159 57203876 26758439 5197880087 24,31% 53,22% 98,90%
inst18 56084420 31967817 12018266 6212768244 43,00% 62,41% 99,49%
inst19 45002148 26991187 16414242 4265433595 40,02% 39,19% 99,37%
inst20 21909411 6501610 187551 6475984152 70,33% 97,12% 99,90%
K=5
Inst/Alg LPT Lpt_1 ILS KK Gap 0/1 Gap 1/ILS Gap KK/1
inst1 206448413 107820802 42456197 1339796923 47,77% 60,62% 91,95%
inst2 475570355 374614686 119154711 3412666863 21,23% 68,19% 89,02%
inst3 229590226 37937749 15730554 4336821085 83,48% 58,54% 99,13%
inst4 388564340 170727925 142781164 3122772011 56,06% 16,37% 94,53%
inst5 120270467 64320832 18155495 8643611068 46,52% 71,77% 99,26%
inst6 197777765 145917465 65858801 6430680846 26,22% 54,87% 97,73%
inst7 118818882 54510235 6682085 954421112 54,12% 87,74% 94,29%
inst8 178729820 90690347 72495658 7067196783 49,26% 20,06% 98,72%
inst9 107509840 32264710 18531124 6521820777 69,99% 42,57% 99,51%
inst10 183140948 170472298 49237473 5625413088 6,92% 71,12% 96,97%
inst11 62620330 26391490 11365285 7508244798 57,85% 56,94% 99,65%
inst12 174329379 156454992 95654464 6263240002 10,25% 38,86% 97,50%
inst13 73922250 64052640 61480216 7133551983 13,35% 4,02% 99,10%
inst14 107866991 85294733 62867537 1937028486 20,93% 26,29% 95,60%
inst15 47100982 34905809 21268395 2729821671 25,89% 39,07% 98,72%
inst16 43791832 21086571 3100909 6588625650 51,85% 85,29% 99,68%
inst17 79153253 66484390 37416121 4463460829 16,01% 43,72% 98,51%
inst18 59590511 35161862 28291419 8431894886 40,99% 19,54% 99,58%
inst19 69433290 27982741 2748595 5869626230 59,70% 90,18% 99,52%
inst20 25383590 16796368 4980795 4895060872 33,83% 70,35% 99,66%
K=6
Inst/Alg LPT Lpt_1 ILS KK Gap 0/1 Gap 1/ILS Gap KK/1
inst1 330130131 149128749 106800464 3408735057 54,83% 28,38% 95,63%
inst2 484471029 285078347 148665500 3153114876 41,16% 47,85% 90,96%
inst3 151272212 61719896 36886563 5342568635 59,20% 40,24% 98,84%
inst4 435992281 218937314 89874741 4805673494 49,78% 58,95% 95,44%
inst5 255194773 180000607 57831137 7665955101 29,47% 67,87% 97,65%
inst6 199294002 25538362 16717269 7348838908 87,19% 34,54% 99,65%
inst7 166844782 53207785 44781556 1710733944 68,11% 15,84% 96,89%
inst8 202027224 119249485 65082322 5968101693 40,97% 45,42% 98,00%
inst9 184125469 139023597 15798486 6522418685 24,50% 88,64% 97,87%
inst10 179668093 134896753 13840334 7106364514 24,92% 89,74% 98,10%
inst11 62264721 26486948 20656301 7428669456 57,46% 22,01% 99,64%
inst12 259426183 102492483 79138836 6798570491 60,49% 22,79% 98,49%
inst13 213261381 171954956 100335139 6671863756 19,37% 41,65% 97,42%
inst14 190792175 179858672 75172828 4217015720 5,73% 58,20% 95,73%
inst15 159264611 69743775 26307641 1063440884 56,21% 62,28% 93,44%
inst16 33700662 15527663 12828067 5719228493 53,92% 17,39% 99,73%
inst17 27833906 21804875 18812342 5725885831 21,66% 13,72% 99,62%
inst18 80307181 35332179 9745616 9482468974 56,00% 72,42% 99,63%
inst19 87966387 55419045 24435532 6291892596 37,00% 55,91% 99,12%
inst20 53276421 31323019 4980669 5173001101 41,21% 84,10% 99,39%
Tabela 6.6: Comparação entre quartis do Gap() das instâncias para cada valor de
k.
CGA vs CGA+ILS
Inst/k K=3 K=4 K=5 K=6
inst1 0,00% 0,00% 0,00% 0,00%
inst2 0,00% 0,00% 0,00% 0,00%
inst3 0,00% 0,00% 0,00% 0,00%
inst4 0,00% 0,00% 0,00% 0,00%
inst5 0,00% 0,00% 0,00% 0,00%
inst6 59,95% 60,00% 60,00% 60,00%
inst7 39,92% 39,96% 40,00% 40,00%
inst8 49,96% 50,00% 50,00% 50,00%
inst9 49,83% 49,99% 50,00% 50,00%
inst10 39,96% 40,00% 40,00% 40,00%
inst11 0,00% 9,80% 10,00% 10,00%
inst12 29,99% 30,00% 30,00% 30,00%
inst13 19,84% 20,00% 20,00% 20,00%
inst14 49,87% 50,00% 50,00% 50,00%
inst15 29,79% 29,99% 30,00% 30,00%
inst16 0,00% 9,91% 9,98% 10,00%
inst17 39,85% 39,99% 40,00% 40,00%
inst18 59,91% 59,90% 60,00% 60,00%
inst19 19,57% 19,99% 19,99% 20,00%
inst20 0,00% 9,58% 9,99% 9,99%
CGA
K=3 K=4 K=5 K=6
Inst/ k
z* # nós z* # nós z* # nós z* # nós
inst1 29654 52341140 54701 64212878 101297 87196118 87221 98236577
inst2 12678 43188174 49283 65193460 212794 86706868 90341 98858106
inst3 6785 42873090 11204 74956403 175301 86412524 68774 101324634
Algoritmos Exatos
Tabela 6.8: Menor limite superior histórico e número de nós explorados pelo CGA.
59
6.2
CGA+ILS
K=3 K=4 K=5 K=6
Inst/ k
z* # nós z* # nós z* # nós z* # nós
inst1 29654 513148 54701 629538 101297 854863 87221 963103
inst2 12678 415270 49283 626860 212794 833719 90341 950558
inst3 6785 389755 11204 681421 175301 785568 68774 921133
Algoritmos Exatos
Tabela 6.9: Menor limite superior histórico e número de nós explorados pelo CGA+ILS.
60
Capítulo 7
Conclusão
61
7.2 Considerações Finais 62
• Tamanho máximo atingido pela fila para encontrar a solução exata de uma
instância. Este dado ajuda a decidir se o método deve usar fila comum, fila
de prioridades ou uma pilha;
• Regressão exponencial aplicada aos dados acima para estimar o custo de me-
mória e a complexidade de tempo. Um método Branch and Bound, imple-
mentado com busca em largura ou busca prioritária, ainda tem complexidade
exponencial de tempo e memória. Mesmo que seja impossível descobrir sua
complexidade exata, estes dados auxiliam na estimativa da base da função
exponencial que descreve a complexidade do algoritmo.
Ainda não existe a demonstração de que o algoritmo 5.5 retorna a solução exata
de qualquer subproblema relaxado associado ao nó segundo o modelo matemático
(2.25)-(2.29). Este é um trabalho em andamento.
Outro possível trabalho futuro seria obter a volta direta da redução apresentada
M W N P P ≤p (T W N P P ).
Referências Bibliográficas
Ausiello, G.; Crescenzi, P.; Kann, V.; Gambosi, G.; Spaccamela, A. M. e Protasi, M.
(2003)a. Complexity and Approximation: Combinatorial Optimization Problems and
Their Approximability Properties, Capítulo Sequential Algorithms for Partitioning
Problems, p. 50–60. Springer-Verlag New York, Inc., 1st edição.
Finn, Greg e Horowitz, Ellis. (1979). A linear time approximation algorithm for
multiprocessor scheduling. BIT Numerical Mathematics, v. 19, n. 3, p. 312–320.
Gent, Ian P. e Walsh, Toby. (1995). The number partition phase transition. Technical
Report RR-95-185, Department of Computer Science, University of Strathclyde,
Glasgow, Scotland.
Gent, Ian P. e Walsh, Toby. (1998). Analysis of heuristics for number partitioning.
Computational Intelligence, v. 14, n. 3, p. 430–451.
64
Referências Bibliográficas 65
Graham, Ronald L. (1966). Bounds for certain multiprocessing anomalies. The Bell
System Technical Journal, v. XLV, n. 9, p. 1563–1581.
Hayes, Brian. (2002). Computing science: The easiest hard problem. American
Scientist, v. 90, p. 113–117.
Kojić, Jelena. (2010). Integer linear programming model for multidimensional two-
way number partitioning problem. Computers & Mathematics with Applications, v.
60, n. 8, p. 2302–2308.
Korf, Richard E.; Schreiber, Ethan L. e Moffitt, Michael D. (2014). Optimal se-
quential multi-way number partitioning. International Symposium on Artificial In-
telligence and Mathematics (ISAIM-2014), (2014).
Lima, Elon Lages. (2004). Análise real. IMPA, Rio de Janeiro, Brasil.
Lourenço, Helena R.; Martin, Olivier C. e Stützle, Thomas. (2003). Iterated local
search. Glover, Fred e Kochenberger, Gary A., editors, Handbook of Metaheuristics,
p. 320–353. Springer US, Boston, MA.
Mertens, Stephan. (2006). The easiest hard problem: Number partitioning. Per-
cus, A.G.; Istrate, G. e Moore, C., editors, Computational Complexity and Statistical
Physics, p. 125–139, New York. Oxford University Press.
Michiels, Wil; Korst, Jan; Aarts, Emile e others,. (2003). Performance ratios for the
Karmarkar-Karp differencing method. Electronic Notes in Discrete Mathematics, v.
13, p. 71–75.
Moffitt, Michael D. (2013). Search strategies for optimal multi-way number partiti-
oning. Proceedings of the Twenty-Third international joint conference on Artificial
Intelligence, p. 623–629. AAAI Press, (2013).
Pedroso, João Pedro e Kubo, Mikio. (2010). Heuristics and exact methods for
number partitioning. European Journal of Operational Research, v. 202, n. 1, p.
73–81.
Pop, Petrică C e Matei, Oliviu. (2013). A memetic algorithm approach for solving
the multidimensional multi-way number partitioning problem. Applied Mathematical
Modelling, v. 37, n. 22, p. 9191–9202.