Mathematica 186 (serakah) dan 224 (semua kombinasi)
Solusi Serakah
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]
Ini mematikan lampu berlebihan satu per satu. Jika cakupan cahaya tidak berkurang ketika lampu padam, lampu itu bisa dihilangkan. Pendekatan serakah sangat cepat dan dapat dengan mudah menangani matriks 15x15 dan jauh lebih besar (lihat di bawah). Ini mengembalikan solusi tunggal, tetapi tidak diketahui apakah itu optimal atau tidak. Kedua pendekatan, dalam versi golf, mengembalikan jumlah lampu yang tidak digunakan. Pendekatan un-golfed juga menampilkan grid, seperti di bawah ini.
Sebelum:

Setelah:

Solusi Optimal menggunakan semua kombinasi lampu (224 karakter)
Terima kasih kepada @ Clément.
Versi ungolfed menggunakan semua kombinasi lampu
fFungsi transformasi morfologis yang digunakan dalam sameCoverageQperlakukan sebagai menyala (nilai = 1 bukannya nol) 3 x 3 persegi di mana setiap cahaya berada. Ketika cahaya berada di dekat tepi tambak, hanya kotak (kurang dari 9) dalam batas-batas pertanian dihitung. Tidak ada penghitungan yang berlebihan; kotak yang diterangi oleh lebih dari satu lampu cukup dinyalakan. Program mematikan setiap lampu dan memeriksa untuk melihat apakah keseluruhan cakupan pencahayaan di lahan berkurang. Jika tidak, lampu tersebut dihilangkan.
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]menghitung jumlah sel yang ditandai. Ini digunakan untuk menghitung lampu dan juga untuk menghitung sel yang menyala
sameCoverageQ[mat1, mat2] menguji apakah sel-sel yang menyala di mat1 sama dengan jumlah sel-sel yang menyala di mat2.MorphologicalTransform [[mat] mengambil matriks cahaya dan mengembalikan matriks` sel yang mereka nyalakan.
c[m1]mengambil semua kombinasi lampu dari m1 dan mengujinya untuk cakupan. Di antara mereka yang memiliki jangkauan maksimum, ia memilih yang memiliki bola lampu paling sedikit. Masing-masing adalah solusi optimal.
Contoh 1:
Pengaturan 6x6
(*all the lights *)
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0}
h[m]

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

Versi golf menggunakan semua kombinasi lampu.
Versi ini menghitung jumlah lampu yang tidak digunakan. Itu tidak menampilkan grid.
c mengembalikan jumlah lampu yang tidak digunakan.
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]menghitung jumlah sel yang ditandai. Ini digunakan untuk menghitung lampu dan juga untuk menghitung sel yang menyala
s[mat1, mat2] menguji apakah sel-sel yang menyala di mat1 sama dengan jumlah sel-sel yang menyala di mat2.t [[mat] mengambil matriks cahaya dan mengembalikan matriks` sel-sel yang mereka nyalakan.
c[j]mengambil semua kombinasi lampu dari j dan mengujinya untuk cakupan. Di antara mereka yang memiliki jangkauan maksimum, ia memilih yang memiliki bola lampu paling sedikit. Masing-masing adalah solusi optimal.
Contoh 2
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0};
m//Grid

Dua lampu dapat disimpan dengan cakupan pencahayaan yang sama. c [m]
2