Mathematica 186 (goloso) e 224 (tutte le combinazioni)
Soluzione golosa
t=MorphologicalTransform;n@w_:=Flatten@w~Count~1
p_~w~q_:=n[p~t~Max]==n[q~t~Max]
g@m_:=Module[{l=m~Position~1,r,d=m},While[l!={},If[w[m,r=ReplacePart[d,#-> 0]&
[l[[1]]]],d=r];l=Rest@l];n@m-n@d]
Questo spegne le luci superflue una per una. Se la copertura della luce non diminuisce quando la luce si spegne, quella luce può essere eliminata. L'approccio avido è molto veloce e può gestire facilmente matrici di 15x15 e molto più grandi (vedi sotto). Restituisce una singola soluzione, ma non si sa se sia ottimale o meno. Entrambi gli approcci, nelle versioni golfate, restituiscono il numero di luci non utilizzate. Anche gli approcci non golfizzati mostrano le griglie, come di seguito.
Prima:

Dopo:

Soluzioni ottimali che utilizzano tutte le combinazioni di luci (224 caratteri)
Grazie a @ Clément.
Versione non golfata con tutte le combinazioni di luci
fLa funzione di trasformazione morfologica utilizzata nelle sameCoverageQprelibatezze (valore = 1 anziché zero) il quadrato 3 x3 in cui risiede ogni luce. Quando una luce si trova vicino al bordo della fattoria, solo i quadrati (meno di 9) all'interno dei bordi di la fattoria viene contata. Non c'è eccesso di conto; un quadrato illuminato da più di una lampada viene semplicemente acceso. Il programma spegne ogni luce e verifica se la copertura complessiva dell'illuminazione nella fattoria è ridotta. In caso contrario, la luce viene eliminata.
nOnes[w_]:=Count[Flatten@w,1]
sameCoverageQ[m1_,m2_]:=nOnes[MorphologicalTransform[m1,Max]]==
nOnes[MorphologicalTransform[m2,Max]]
(*draws a grid with light bulbs *)
h[m_]:=Grid[m/.{1-> Style[\[LightBulb],24],0-> ""},Frame-> All,ItemSize->{1,1.5}]
c[m1_]:=GatherBy[Cases[{nOnes[MorphologicalTransform[ReplacePart[Array[0&,Dimensions[m1]],
#/.{{j_Integer,k_}:> {j,k}-> 1}],Max]],#,Length@#}&/@(Rest@Subsets[Position[m1,1]]),
{nOnes[MorphologicalTransform[m1,Max]],_,_}],Last][[1,All,2]]
nOnes[matrix]conta il numero di celle contrassegnate. È usato per contare le luci e anche per contare le celle illuminate
sameCoverageQ[mat1, mat2] verifica se le celle illuminate in mat1 corrispondono al numero di celle illuminate in mat2.MorphologicalTransform [[mat] prende una matrice di luci e restituisce una matrice` delle celle che illuminano.
c[m1]prende tutte le combinazioni di luci da M1 e le verifica per la copertura. Tra quelli che hanno la massima copertura, seleziona quelli che hanno il minor numero di lampadine. Ognuna di queste è una soluzione ottimale.
Esempio 1:
Una configurazione 6x6
(*all the lights *)
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0}
h[m]

Tutte le soluzioni ottimali.
(*subsets of lights that provide full coverage *)
h/@(ReplacePart[Array[0&,Dimensions[m]],#/.{{j_Integer,k_}:> {j,k}-> 1}]&/@(c[m]))

Versione golfizzata che utilizza tutte le combinazioni di luci.
Questa versione calcola il numero di luci non utilizzate. Non visualizza le griglie.
c restituisce il numero di luci non utilizzate.
n@w_:=Flatten@w~Count~1;t=MorphologicalTransform;
c@r_:=n@m-GatherBy[Cases[{n@t[ReplacePart[Array[0 &,Dimensions[r]],#
/.{{j_Integer,k_}:> {j,k}-> 1}],Max],#,Length@#}&/@(Rest@Subsets[r~Position~1]),
{n[r~t~Max],_,_}],Last][[1,1,3]]
n[matrix]conta il numero di celle contrassegnate. È usato per contare le luci e anche per contare le celle illuminate
s[mat1, mat2] verifica se le celle illuminate in mat1 sono uguali al numero di celle illuminate in mat2.t [[mat] prende una matrice di luci e restituisce una matrice` delle celle che si accendono.
c[j]prende tutte le combinazioni di luci da j e le verifica per la copertura. Tra quelli che hanno la massima copertura, seleziona quelli che hanno il minor numero di lampadine. Ognuna di queste è una soluzione ottimale.
Esempio 2
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0};
m//Grid

È possibile salvare due luci pur avendo la stessa copertura luminosa. centimetro]
2