Implementazione dell'algoritmo GSAT - Come selezionare quale letterale capovolgere?


20

L'algoritmo GSAT è, per la maggior parte, semplice: ottieni una formula in forma congiuntiva normale e capovolgi i letterali delle clausole fino a trovare una soluzione che soddisfi la formula o raggiungi il limite max_tries / max_flips e non trovi alcuna soluzione.

Sto implementando il seguente algoritmo:

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

Ho problemi a interpretare la seguente riga:

V <- the variable whose flip yield the most important raise in the number of satisfied clauses;

Il numero massimo di clausole soddisfatte non è quello che stiamo cercando? Mi sembra che stiamo cercando di utilizzare la soluzione o approssimazioni per trovare la soluzione.

Ho pensato ad alcuni modi per farlo, ma sarebbe bello sentire altri punti di vista (Il presupposto è che una volta che la variabile viene capovolta una volta selezionata.):

  • Genera uno spazio degli stati con tutti i possibili capovolgimenti e cerca nello spazio un valore letterale che dia la migliore approssimazione allo stato obiettivo.
  • Seleziona in modo casuale la variabile che capovolgerò partendo dai valori letterali più comuni.
  • Scegli un valore letterale casuale.

Risposte:


12

Il numero massimo di clausole soddisfatte non è quello che stiamo cercando?

Sì, stiamo cercando un incarico che soddisfi il numero massimo di clausole (che è tutte preferibilmente). E a tal fine ci chiediamo "Quale singola variabile ci avvicina a questo obiettivo quando lo si lancia?" e poi capovolgilo.

Mi sembra che stiamo cercando di utilizzare la soluzione o approssimazioni per trovare la soluzione.

Usando la soluzione sarebbe se chiedessimo "Quale combinazione di più lanci darebbe il miglior risultato?" o semplicemente "Quale incarico sarebbe il migliore?". Tuttavia non è quello che stiamo facendo, stiamo solo guardando un passo avanti. L'uso di un'approssimazione della soluzione sembra una descrizione accurata. Tuttavia non c'è niente di sbagliato in questo. Ecco come funzionano strategie avide.

Genera uno spazio degli stati con tutti i possibili capovolgimenti e cerca nello spazio un valore letterale che dia la migliore approssimazione allo stato obiettivo.

Giusto.

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.