Supportare le strutture dati per la ricerca locale SAT


20

WalkSAT e GSAT sono algoritmi di ricerca locale ben noti e semplici per risolvere il problema di soddisfacibilità booleana. Lo pseudocodice per l'algoritmo GSAT viene copiato dalla domanda Implementazione dell'algoritmo GSAT - Come selezionare quale letterale capovolgere? e presentato di seguito.

procedure GSAT(A,Max_Tries,Max_Flips)
  A: is a CNF formula
  for i:=1 to Max_Tries do
    S <- instantiation of variables
    for j:=1 to Max_Iter do
      if A satisfiable by S then
        return S
      endif
      V <- the variable whose flip yield the most important raise in the number of satisfied clauses;
      S <- S with V flipped;
    endfor
  endfor
  return the best instantiation found
end GSAT

Qui capovolgiamo la variabile che massimizza il numero di clausole soddisfatte. Come viene fatto in modo efficiente? Il metodo ingenuo è quello di capovolgere ogni variabile, e per ogni passaggio attraverso tutte le clausole e calcolare quante di esse vengono soddisfatte. Anche se una clausola potesse essere interrogata per soddisfacibilità in tempo costante, il metodo ingenuo verrebbe comunque eseguito in tempo , dove V è il numero di variabili e C il numero di clausole. Sono sicuro che possiamo fare di meglio, da qui la domanda:O(VC)VC

Molti algoritmi di ricerca locali capovolgono l'assegnazione della variabile che massimizza il numero di clausole soddisfatte. In pratica, con quali strutture di dati questa operazione è supportata in modo efficiente?

Questo è qualcosa che sento come se i libri di testo spesso omettessero. Un esempio è persino il famoso libro di Russell & Norvig .


Bene, questi ragazzi lo costruiscono in hardware. Apparentemente , gli approcci probabilistici ed euristici sono più popolari; ciò suggerirebbe che in effetti non si può scegliere rapidamente la variabile "migliore" (è solo avida, dopotutto) o che questa scelta non va bene in generale.
Raffaello

@Raphael Forse hai ragione sul fatto che non si può scegliere molto velocemente, ma non oserei dire "la scelta non va bene in generale". Forse ho frainteso il tuo punto, ma sono abbastanza sicuro che la scelta della variabile "giusta" abbia un impatto enorme. Grazie, approfondirò un po 'di più. Penso che uno degli autori delle diapositive che hai collegato (Hoos) abbia un libro sull'argomento.
Juho,

Quello "giusto" sarebbe ottimale, ma c'è motivo di credere che quello che massimizza ora sia quello giusto? Dopotutto, il problema non è risolvibile da (canonico) goloso.
Raffaello

Risposte:


9

La struttura di dati necessaria è un elenco di occorrenze , un elenco per ogni variabile contenente le clausole in cui si trova la variabile. Questi elenchi vengono creati una volta, quando il CNF viene letto per la prima volta. Vengono utilizzati nei passaggi 3 e 5 seguenti per evitare di scansionare l'intera formula CNF per contare le clausole soddisfatte.

Un algoritmo migliore di lanciare ogni variabile è:

  1. Crea un elenco delle sole variabili presenti nelle clausole non soddisfatte.
  2. X
  3. X
  4. X
  5. X
  6. X
  7. X
  8. Ripetere i passaggi 2-7 per il resto delle variabili rilevate nel passaggio 1.
  9. Capovolgi la variabile con il numero più alto registrato nel passaggio 7.

Un riferimento per la struttura dei dati (spesso noto anche come elenco di adiacenza) è ad esempio Lynce e Marques-Silva, Efficient Data Structures for Backtracking SAT solvers, 2004.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.