Mathematica 186 (gierig) und 224 (alle Kombinationen)
Gierige Lösung
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]
Dadurch werden überflüssige Lichter nacheinander ausgeschaltet. Wenn die Lichtabdeckung beim Erlöschen des Lichts nicht verringert wird, kann dieses Licht eliminiert werden. Der gierige Ansatz ist sehr schnell und kann problemlos Matrizen von 15x15 und viel größer verarbeiten (siehe unten). Es gibt eine einzelne Lösung zurück, aber es ist nicht bekannt, ob dies optimal ist oder nicht. Beide Ansätze geben in den Golfversionen die Anzahl der nicht verwendeten Lichter zurück. Nicht-Golf-Ansätze zeigen auch die Gitter wie unten an.
Vor:

Nach:

Optimale Lösungen mit allen Lichtkombinationen (224 Zeichen)
Mit Dank an @ Clément.
Ungolfed Version mit allen Lichtkombinationen
fDie morphologische Transformationsfunktion, die in sameCoverageQbehandelt wird, behandelt das 3 x 3-Quadrat, in dem sich jedes Licht befindet, als beleuchtet (Wert = 1 statt Null). Wenn sich ein Licht in der Nähe des Randes der Farm befindet, befinden sich nur die Quadrate (weniger als 9) innerhalb der Grenzen von Die Farm wird gezählt. Es gibt keine Überzählung. Ein Quadrat, das von mehr als einer Lampe beleuchtet wird, wird einfach beleuchtet. Das Programm schaltet jedes Licht aus und prüft, ob die Gesamtbeleuchtung der Farm verringert ist. Ist dies nicht der Fall, wird dieses Licht eliminiert.
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]zählt die Anzahl der markierten Zellen. Es wird verwendet, um die Lichter und auch die beleuchteten Zellen zu zählen
sameCoverageQ[mat1, mat2] testet, ob die beleuchteten Zellen in mat1 der Anzahl der beleuchteten Zellen in mat2 entsprechen. MorphologicalTransform [[mat] nimmt eine Lichtmatrix und gibt eine Matrix der Zellen auf, die sie beleuchten.
c[m1]Nimmt alle Lichtkombinationen von m1 und testet sie auf Abdeckung. Unter denjenigen mit der maximalen Abdeckung werden diejenigen ausgewählt, die die wenigsten Glühbirnen haben. Jedes davon ist eine optimale Lösung.
Beispiel 1:
Ein 6x6 Setup
(*all the lights *)
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0}
h[m]

Alle optimalen Lösungen.
(*subsets of lights that provide full coverage *)
h/@(ReplacePart[Array[0&,Dimensions[m]],#/.{{j_Integer,k_}:> {j,k}-> 1}]&/@(c[m]))

Golfversion mit allen Lichtkombinationen.
Diese Version berechnet die Anzahl der nicht verwendeten Lichter. Die Gitter werden nicht angezeigt.
c Gibt die Anzahl der nicht verwendeten Lichter zurück.
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]zählt die Anzahl der markierten Zellen. Es wird verwendet, um die Lichter und auch die beleuchteten Zellen zu zählen
s[mat1, mat2] testet, ob die beleuchteten Zellen in mat1 der Anzahl der beleuchteten Zellen in mat2 entsprechen. t [[mat] nimmt eine Lichtmatrix und gibt eine Matrix` der Zellen zurück, die sie beleuchten.
c[j]Nimmt alle Lichtkombinationen von j und testet sie auf Abdeckung. Unter denjenigen mit der maximalen Abdeckung werden diejenigen ausgewählt, die die wenigsten Glühbirnen haben. Jedes davon ist eine optimale Lösung.
Beispiel 2
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0};
m//Grid

Bei gleicher Lichtabdeckung können zwei Lichter gespeichert werden. cm]
2