Vamos separar as desigualdades (5.7) e (5.8) da seguinte forma. Dada uma solução x∗, começamos construindo os grafos Asg e Bs (veja a seção 5.1.2). Após atribuir peso x∗p
para cada vértice vA
sg(p) e vsB(p), nós procuramos por uma clique de peso máximo em
ambos grafos. Uma desigualdade violada existe se, e somente se, a clique de peso máximo encontrada possuir peso total maior que 1. Os algoritmos 4 e 5 descrevem as rotinas de separação para (5.7) e (5.8), respectivamente. Usamos o resolvedor Cliquer [32] para encontrar as cliques de peso máximo. Como este é um problema N P-difícil [24], reduzi- mos o tamanho dos dois grafos considerando apenas os vértices das rotas simples p com
x∗p ≥ 0,01. Os subgrafos de Asg e Bs obtidos desta forma são denotados por ˜Asg e ˜Bs,
respectivamente. Além disso, como o resolvedor Cliquer lida apenas com pesos inteiros, o peso dos vértices vAsg˜(p) e vBs˜(p) é convertido para100x∗p, e já que encontrar uma clique de peso máximo pode tomar muito tempo, paramos a execução do resolvedor no momento em que uma clique com peso maior ou igual a 101 é encontrada. As desigualdades mais fortes em (5.7) e (5.8) são aquelas associadas a cliques maximais em Asg e Bs, respecti-
vamente. Portanto, após obter uma clique C em um dos subgrafos, nós inspecionamos o grafo original em busca de vértices ausentes em C que são adjacentes a todos os vértices de C. Se tal vértice existir, ele é incluído em C e o procedimento continua considerando a clique C atualizada e os vértices que ainda não foram verificados. Depois de percorrer todos os vértices, a desigualdade violada é adicionada à formulação. (Veja as linhas 8-12 no algoritmo 4, e as linhas 7-11 no algoritmo 5.) Por fim, cabe ressaltar que a complexi- dade de tempo dos algoritmos 4 e 5 é exponencial visto que eles envolvem a resolução do problema da clique de peso máximo.
Algoritmo 4 Rotina de separação das desigualdades (5.7).
1: procedimento Sep-Clique-Sec-Adj(solução x∗)
2: para todo s ∈ S, s 6= |S| faça
3: para todo g ∈ Gs∩ Gs+1 faça
4: Construa o grafo ˜Asg para as rotas p ∈ Psg∪ P(s+1)g com x∗p ≥ 0,01;
5: Atribua peso 100x∗p para cada vértice vsgA˜(p) de ˜Asg;
6: Execute o resolvedor Cliquer no grafo ponderado ˜Asg;
7: se uma clique C com peso maior ou igual a 101 foi encontrada então
8: para todo p ∈ Psg∪ P(s+1)g faça
9: se vsgA(p) /∈ C e vA
sg(p) é adjacente, em Asg, a todos os vértices de C então
10: Adicione vsgA(p) em C;
11: fim se
12: fim para
13: Adicione na formulação a desigualdade (5.7) para C;
14: fim se
15: fim para
16: fim para
Algoritmo 5 Rotina de separação das desigualdades (5.8).
1: procedimento Sep-Clique-Sec-Igl(solução x∗)
2: para todo s ∈ S faça
3: Construa o grafo ˜Bs para as rotas p ∈ Ps com x∗p ≥ 0,01;
4: Atribua peso 100x∗p para cada vértice vsB˜(p) de ˜Bs;
5: Execute o resolvedor Cliquer no grafo ponderado ˜Bs;
6: se uma clique C com peso maior ou igual a 101 foi encontrada então 7: para todo p ∈ Ps faça
8: se vB
s (p) /∈ C e vsB(p) é adjacente, em Bs, a todos os vértices de C então
9: Adicione vB
s(p) em C;
10: fim se
11: fim para
12: Adicione na formulação a desigualdade (5.8) para C;
13: fim se
14: fim para
15: fim procedimento
5.3
Resultados computacionais
Realizamos experimentos computacionais para mostrar a relevância das desigualdades propostas na seção 5.1.2, avaliar o impacto do parâmetro w (tamanho das sequências de viagens dos árbitros) nos limitantes inferiores produzidos pela relaxação da nossa formula- ção, e comparar o desempenho do nosso algoritmo branch-and-cut (descrito na seção 5.3.3) com os outros métodos da literatura.
Nossa implementação foi feita em C++ usando a biblioteca em C (Callable Library) do pacote ILOG CPLEX versão 12.6.1, e compilada com o GCC 4.6.3. Todos os expe- rimentos foram conduzidos em uma máquina equipada com um processador Intel Xeon X3430 2,40GHz e 8GB de memória RAM, executando o sistema operacional Linux Ubuntu 12.04.3.
Utilizamos em nossos experimentos as instâncias do benchmark do TUP [44] (veja a descrição desse benchmark na página 14). As instâncias com menos de 14 times foram desconsideradas pois elas são facilmente resolvidas pelos métodos atuais da literatura. Consideramos os valores de q1 e q2 usualmente adotados na literatura e também incluímos
q1 = q2 = 5 para as instâncias com 26, 28, 30 e 32 times, que foram utilizados em [51].
Antes de continuar, existem dois aspectos importantes a serem destacados. O primeiro aspecto é referente às variáveis do modelo. Embora o número de variáveis em nossa for- mulação cresça exponencialmente em função de w, optamos por enumerar todas a priori e adicioná-las no modelo durante o início da execução através do algoritmo 6, ao invés de recorrer a um método de geração de colunas. A tabela 5.1 apresenta o número de variáveis na formulação para todas as instâncias e valores de w entre 2 e 10 (considerados nos experimentos). As instâncias com letras em seus nomes foram omitidas nesta tabela porque possuem os mesmos torneios que as instâncias originais correspondentes e, logo, resultam nas mesmas quantidades de variáveis. Os valores ausentes para um par instância
e w correspondem a modelos com mais de 5 milhões de variáveis, os quais vamos descon- siderar em nossos experimentos. Como, dependendo do caso, a enumeração poderia levar muito tempo, ela foi interrompida sempre que esta quantidade limite foi atingida e por isso nenhum valor foi reportado. O tempo gasto na enumeração das variáveis está incluído nos tempos de execução reportados nas próximas seções e não excede 15 segundos. Algoritmo 6 Enumeração das variáveis da formulação.
1: procedimento Enum-Vars 2: para todo s ∈ S faça
3: Enum-Vars-Rec(s, (), 0); . Gera todas as viagens em Ps
4: fim para
5: fim procedimento
6:
7: procedimento Enum-Vars-Rec(seção s, rota simples p, inteiro `); . Adiciona jogos no fim da rota simples p de tamanho ` até que ela atinja o tamanho da seção s
8: se ` = w ou (s − 1)(w − 1) + 1 + ` > 4n − 2 então
9: Adiciona a variável xp na formulação;
10: senão
11: para todo jogo g na rodada (s − 1)(w − 1) + 1 + ` faça
12: Faça p0 igual a p com g adicionado no fim;
13: se p0 é uma rota simples factível então
14: Enum-Vars-Rec(s, p0, ` + 1); 15: fim se 16: fim para 17: fim se 18: fim procedimento Inst. q1 q2 Parâmetro w 2 3 4 5 6 7 8 9 10 14 7 3 875 1463 3124 6707 14480 26097 43858 92909 157212 14 6 3 875 1463 3124 6707 14480 30345 56849 140195 272418 14 5 3 875 1463 3124 6707 16354 37921 79866 224807 465183 16 8 4 1397 2961 5654 10844 18305 29823 37045 57076 97664 16 8 2 1397 3679 11624 38436 117394 331902 844815 2378813 7202046 16 7 3 1397 2961 7368 19089 43920 98326 204509 512763 1327904 16 7 2 1397 3679 11624 38436 117394 331902 973859 3031348 10546030 18 9 4 2081 5384 13994 34561 81585 171573 345990 621342 1211598 20 10 5 2962 9069 28332 72276 172373 393620 818194 1492658 2417177 22 11 5 4063 14405 53264 171979 535731 1497634 4036925 24 12 6 5407 21810 97332 368098 1167827 3219784 26 13 6 7009 31677 158375 717269 2615617 26 5 5 7009 31677 158375 717269 3329528 28 14 7 8909 44638 248893 1318194 28 5 5 8909 44638 248893 1318194 30 15 7 11124 61206 391728 2282757 30 5 5 11124 61206 391728 2282757 32 16 8 13673 81972 568954 3777946 32 5 5 13673 81972 568954 3777946
O segundo aspecto relevante é com relação a forma como nós comparamos os nossos tempos de execução com aqueles apresentados em [42, 43, 51, 56], visto que os experimen- tos destas referências foram conduzidos em ambientes computacionais diferentes do nosso. Em vez de tentar estabelecer uma relação de velocidade confiável entre dois CPUs distintos (o que é uma tarefa extremamente difícil), para o propósito de avaliar nossos resultados é suficiente saber que a máquina que utilizamos é mais lenta que todas as outras, o que pode ser verificado, por exemplo, no seguinte web site: www.cpubenchmark.net (acessado em julho de 2015). Portanto, quando dizemos que “encontramos um limitante inferior melhor e X vezes mais rápido que [referência]”, isso significa que o verdadeiro speed-up é ainda maior que X. Se a relaxação exata entre as CPUs fosse utilizada em nossas comparações, as conclusões só poderiam se tornar ainda mais favoráveis para nosso método. Com estas observações em mente, nós continuamos com as análises dos resultados.