Si consideri il seguente problema:Inferenza sottoinsieme NP-completa?
ci sono n monete numerati da 1 a N.
Non potete vederli, ma sono dati M fatti su di loro nella forma:
struct Fact
{
set<int> positions
int num_heads
}
positions
identifica un sottoinsieme delle monete e num_heads
è il numero di monete in quel sottoinsieme che sono teste.
Dato questi fatti M è necessario calcolare il numero massimo di teste che potrebbero esserci.
Questo problema è NP-completo? Se sì, qual è la riduzione? Se no, qual è una soluzione temporale polinomiale?
Ad esempio:
N = 5
M = 3
fact1 = { {1, 2}, 1 } // Either coin 1 or coin 2 is a head
fact2 = { {4}, 0 } // Coin 4 is a tail
fact3 = { {2, 4, 5}, 2 } // Out of coins 2, 4 and 5, two are heads
Una configurazione con il maggior numero di teste che corrisponde ai fatti è:
T H H T H
Quindi la risposta è 3 teste.
Forse non ho pensato abbastanza a lungo o abbastanza difficile sul tuo problema presentato qui, ma sei sicuro - come prima cosa - che questo problema è persino decidibile? –
@ B.VB. È certamente decidibile: un semplice algoritmo esponenziale è quello di enumerare tutti i possibili incarichi 2^N e confrontarli con i fatti di M, tenendo traccia della soluzione con il maggior numero di teste. Questo è il tempo O (N M 2^N). – Dougal
Sembra che ci dovrebbe essere una riduzione con SAT, ma non riesco a farlo funzionare. Sono sicuro all'80% che sia in NP, però. – Dougal