Mathematica 186 (codicioso) y 224 (todas las combinaciones)
Solución codiciosa
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]
Esto apaga las luces superfluas una por una. Si la cobertura de la luz no disminuye cuando la luz se apaga, esa luz se puede eliminar. El enfoque codicioso es muy rápido y puede manejar fácilmente matrices de 15x15 y mucho más grandes (ver más abajo). Devuelve una solución única, pero no se sabe si eso es óptimo o no. Ambos enfoques, en las versiones de golf, devuelven el número de luces no utilizadas. Los enfoques sin golf también muestran las cuadrículas, como se muestra a continuación.
Antes de:

Después:

Soluciones óptimas que utilizan todas las combinaciones de luces (224 caracteres)
Gracias a @ Clément.
Versión sin golf con todas las combinaciones de luces.
La función de transformación morfológica utilizada en los sameCoverageQtratamientos como iluminado (valor = 1 en lugar de cero) del cuadrado de 3 x3 en el que reside cada luz. Cuando una luz está cerca del borde de la granja, solo los cuadrados (menos de 9) dentro de los bordes de se cuenta la granja. No se cuenta demasiado; simplemente se enciende un cuadrado iluminado por más de una lámpara. El programa apaga cada luz y comprueba si se reduce la cobertura de iluminación general en la granja. Si no es así, esa luz se elimina.
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]cuenta el número de celdas marcadas. Se usa para contar las luces y también para contar las celdas encendidas
sameCoverageQ[mat1, mat2] prueba si las celdas encendidas en mat1 son iguales al número de celdas encendidas en mat2.MorphologicalTransform [[mat] toma una matriz de luces y devuelve una matriz` de las celdas que encienden.
c[m1]toma todas las combinaciones de luces de m1 y las prueba para su cobertura. Entre los que tienen la máxima cobertura, selecciona los que tienen menos bombillas. Cada uno de estos es una solución óptima.
Ejemplo 1:
Una configuración de 6x6
(*all the lights *)
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0}
h[m]

Todas las soluciones óptimas.
(*subsets of lights that provide full coverage *)
h/@(ReplacePart[Array[0&,Dimensions[m]],#/.{{j_Integer,k_}:> {j,k}-> 1}]&/@(c[m]))

Versión de golf con todas las combinaciones de luces.
Esta versión calcula el número de luces no utilizadas. No muestra las cuadrículas.
c Devuelve el número de luces no utilizadas.
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]cuenta el número de celdas marcadas. Se usa para contar las luces y también para contar las celdas encendidas
s[mat1, mat2] prueba si las celdas encendidas en mat1 son iguales al número de celdas encendidas en mat2.t [[mat] toma una matriz de luces y devuelve una matriz` de las celdas que encienden.
c[j]toma todas las combinaciones de luces de j y las prueba para su cobertura. Entre los que tienen la máxima cobertura, selecciona los que tienen menos bombillas. Cada uno de estos es una solución óptima.
Ejemplo 2
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0};
m//Grid

Se pueden guardar dos luces con la misma cobertura de iluminación. cm]
2