• Nenhum resultado encontrado

O BerkMin se destacou nos testes de [Andrade, 2008] e, como dito anteriormente, o trabalho envolve, também, implementar as heurísticas do BerkMin, testá-las de forma modular e disponibilizá-las.

O resolvedor BerkMin, assim como o Chaff, utiliza a estrutura de dados Two- Watched Literals para BCP; e o conceito de redução da contribuição de cláusulas anti- gas no processo de decisão (mas não através da divisão dos contadores). Do GRASP, o BerkMin utiliza os procedimentos de análise de conflitos e backtracking não cronoló- gico. O trabalho do BerkMin é encontrado em dois artigos [Goldberg & Novikov, 2002], [Goldberg & Novikov, 2007]. Utiliza também reinício, que corresponde a desfazer to- dos os assinalamentos e reiniciar a busca do zero, levando em consideração as cláusulas aprendidas.

Um diferencial que se observa no artigo [Goldberg & Novikov, 2007] são os testes comparativos entre o tempo de uso ou não das novas heurísticas propostas. Quando a heurística proposta não é aplicada utiliza-se uma heurística baseada na do Chaff ou na do GRASP. Nesse artigo também foram feitos testes com todas as heurísticas propostas habilitadas contra o zChaff. Os testes em [Goldberg & Novikov, 2002] são feitos entre o BerkMin e o Chaff. Em [Goldberg & Novikov, 2007], os resultados são melhores quando todas as heurísticas são ativadas e, em [Goldberg & Novikov, 2002], o BerkMin é melhor que o Chaff em quase todos os casos.

3.5.1

Novas Heurísticas

As heurísticas de decisão do BerkMin são baseadas em duas observações. Primeiro, um grande número de fórmulas na FNC de problemas reais são fáceis para resolvedores

3.5. BerkMin 37

como Chaff. Logo, essas instâncias possuem um pequeno subconjunto de variáveis que conseguem deduzir cláusulas pequenas, já que o BCP é mais rápido neste tipo de cláusulas. Segundo, o conjunto de variáveis que fazem parte das cláusulas de conflito podem mudar rapidamente. Os autores demonstram isto com uma porta AND. A Figura 3.6 mostra essa porta. Se uma entrada da porta AND é zero, então as cláusulas relativas as outras entradas não são relevantes, já que o resultado é sempre zero. Se a entrada passa a ser um, então as cláusulas das outras entradas passam a influenciar na busca da satisfabilidade. Na Figura 3.6, a mudança de valor da entrada para 1, modifica as cláusulas de conflito geradas, uma vez que a porção rachurada passa a ser relevante. Essas observações levaram a duas conclusões: o processo de decisão deve ser sensível o suficiente para permitir uma boa escolha de variáveis e deve dinamicamente mudar de um conjunto de variáveis para outro. A mudança dinâmica é feita em Chaff com a divisão dos contadores de cada literal. As mudanças que foram feitas pelo BerkMin estão descritas na Enumeração 3.6.

Enumeração 3.6 Novas heurísticas desenvolvidas pelo BerkMin

[Goldberg & Novikov, 2002].

1. A sensibilidade da escolha da variável de decisão foi aumentada. 2. A mobilidade da escolha da variável de decisão foi aumentada.

3. Uma nova heurística de exame de qual valor será atribuído foi proposta. A heurística é chamada de Simetrização da Base.

4. Um novo procedimento de controle da base de cláusulas aprendidas foi introdu- zido.

3.5.1.1 Sensibilidade da Escolha da Variável

Tanto o BerkMin quanto o Chaff possuem o conceito de atividade da variável (var_activity). Porém, enquanto o Chaff incrementa a atividade da variável para cada ocorrência na cláusula de conflito final, o BerkMin incrementa o contador para todas as cláusulas que foram utilizadas durante a resolução do conflito. A divisão dos contadores é feita utilizando o fator 4 ao invés de 2 para o Chaff.

3.5.1.2 Mobilidade da Escolha da Variável

Essa seção aborda a escolha da variável de decisão. No BerkMin, as cláusulas de conflito são organizadas como uma pilha. Chama-se de cláusula corrente do topo aquela mais próxima do topo ainda não satisfeita. A próxima variável de decisão é escolhida entre as variáveis livres da cláusula corrente do topo. Tal variável é escolhida pelo maior valor de atividade. Se não há cláusula corrente do topo, então a variável, não atribuída, de maior atividade é escolhida.

3.5.1.3 Simetrização da Base

Após escolhida a variável deve-se decidir seu valor. Essa seção aborda a escolha do literal.

Para cada literal l, existe um contador de atividade denominado lit_activity, que mostra quantas cláusulas de conflito foram geradas que continham o literal l. Este contador nunca é dividido, ao contrário de var_activity. O valor é escolhido da seguinte forma: suponha que a variável escolhida foi v; o literal v, ou v que possuir o maior contador é escolhido. Se v for escolhido, então v = 1, senão v = 0. Com isso, há uma tendência de equiparação dos contadores, uma vez que a escolha de v = 1, implica que se a variável v aparecer na cláusula de conflito, então o literal é v. Por outro lado, a escolha de v = 0 implica que se v aparecer será com o literal v.

O método de escolha do valor do literal, descrito anteriormente, é utilizado apenas se houver cláusulas de conflito não satisfeitas. Se não houver, então estamos satisfa- zendo cláusulas da base inicial. Nesse caso, uma heurística denominada nb_two(l), onde l é um literal, é utilizada. Essa heurística calcula aproximadamente quantas cláusulas binárias estão na vizinhança de l. Primeiro, conta-se o número de cláusulas binárias com l. Para cada cláusula binária que contém l, conta-se o número de cláusulas binárias de v, onde v é o outro literal da cláusula binária. A soma desses contadores é nb_two. O literal com maior nb_two é escolhido.

Documentos relacionados