
Pembahasan Kode PSO : Optimalisasi Energi Penerangan Rumah Berdasarkan Perilaku Kolektif Burung saat Mencari Makanan
Setelah mempelajari bagaimana algoritma Particle Swarm Optimization (PSO) bekerja secara teknis dalam menemukan solusi efisiensi energi pencahayaan, kini saatnya kita membahas kode pemrograman dari seluruh logika tersebut. Dalam konteks audit energi penerangan rumah tangga, program Python menjadi kendaraan utama yang mengarahkan algoritma PSO untuk menemukan kombinasi pencahayaan terbaik di setiap ruangan. Mulai dari mendefinisikan data awal, menetapkan fungsi objektif, hingga menginterpretasi hasil optimasi, semua langkah teknis dirancang agar komputer bisa berpikir efisien layaknya seorang auditor energi profesional. Artikel ini akan membedah setiap bagian kode tersebut secara menyeluruh, agar pembaca pemula pun dapat memahami bagaimana algoritma bekerja.
Sedikit bercerita, program Python ini digunakan untuk menentukan ukuran daya lampu terbaik yang dapat dipasang di setiap ruangan rumah agar pencahayaan sesuai standar lux yang dibutuhkan namun tetap menekan daya listrik total serendah mungkin. Optimasi ini menggunakan metode Particle Swarm Optimization (PSO), yaitu algoritma yang meniru perilaku kawanan seperti burung atau ikan dalam mencari solusi terbaik secara kolektif.
1. Inisiasi Data Luas dan Standar Intensitas Cahaya Setiap Ruangan
import numpy as np
import pyswarms as ps
# === Data Ruangan (Luas dan Standar Lux) ===
rooms = {
"Teras 1": {"luas": 4.39, "lux_min": 60},
"Teras 2": {"luas": 7.24, "lux_min": 60},
"Kebun": {"luas": 8.91, "lux_min": 60},
"Ruangan Jemur": {"luas": 5.55, "lux_min": 60},
"Ruang Tamu": {"luas": 10.24, "lux_min": 150},
"Garasi": {"luas": 8.42, "lux_min": 60},
"Ruang Tidur 1": {"luas": 9.55, "lux_min": 140},
"Ruang Tidur 2": {"luas": 11.22, "lux_min": 140},
"Ruang Tidur 3": {"luas": 7.87, "lux_min": 140},
"Ruang Tidur 4": {"luas": 6.7, "lux_min": 140},
"Ruang Tidur 5": {"luas": 7.87, "lux_min": 140},
"Ruang Tidur 6": {"luas": 7.47, "lux_min": 140},
"Ruang Keluarga 1": {"luas": 15.62, "lux_min": 120},
"Ruang Keluarga 2": {"luas": 27.83, "lux_min": 120},
"Ruang Kerja": {"luas": 7.87, "lux_min": 250},
"Ruang Dapur + Cuci": {"luas": 9.62, "lux_min": 150},
"Musholla": {"luas": 3.17, "lux_min": 150},
"Kamar Mandi 1": {"luas": 3.18, "lux_min": 250},
"Kamar Mandi 2": {"luas": 4.35, "lux_min": 250},
"Gudang": {"luas": 3.94, "lux_min": 60},
}
Pada awal program, data ruangan didefinisikan dalam bentuk dictionary dengan nama rooms untuk mencatat dua informasi penting dari setiap ruangan yaitu luas ruangan dalam satuan meter persegi dan kebutuhan pencahayaan minimum dalam satuan lux. Misalnya, ruangan seperti ruang kerja membutuhkan 250 lux, sementara teras hanya butuh 60 lux karena aktivitasnya tidak memerlukan pencahayaan tinggi (sesuai dengan standar 03-6197-2000).
2. Inisiasi Variasi Daya dengan Intensitas Cahaya yang Dihasilkan Lampu
# === Data Lampu (Daya dan Lumen) ===
lamp_data = {
4: 800,
5: 1000,
7.5: 1500,
15: 1700,
20: 2000,
25: 2700,
30: 3700,
50: 4800,
}
lamp_power = np.array(list(lamp_data.keys()))
lamp_lumen = np.array(list(lamp_data.values()))
Setelah data ruangan, program menetapkan data tentang jenis-jenis lampu yang tersedia dalam dictionary bernama lamp_data. Dictionary ini menyimpan informasi tentang daya lampu dalam watt sebagai kunci dan jumlah cahaya yang dihasilkan dalam lumen. Misalnya, lampu 4 watt menghasilkan 800 lumen, sedangkan lampu 30 watt menghasilkan 3700 lumen. Untuk memudahkan proses optimasi menggunakan array, dua buah array NumPy kemudian dibentuk: lamp_power yang berisi daftar daya lampu, dan lamp_lumen yang berisi jumlah lumen masing-masing lampu. Kedua array ini akan digunakan dalam perhitungan lux dan total daya listrik nantinya.
3. Fungsi Objektif
# === Fungsi Objektif untuk PSO ===
def objective_function(x):
total_power = np.zeros(x.shape[0])
penalty = np.zeros(x.shape[0])
for i, room in enumerate(rooms.keys()):
luas = rooms[room]["luas"]
lux_min = rooms[room]["lux_min"]
idx = np.round(x[:, i]).astype(int)
idx = np.clip(idx, 0, len(lamp_power) - 1)
P = lamp_power[idx]
L = lamp_lumen[idx]
lux = L / luas
penalty += np.where(lux < lux_min, (lux_min - lux) * 100, 0)
penalty += np.where(lux > lux_min * 1.1, (lux - lux_min * 1.2) * 50, 0)
total_power += P
return total_power + penalty
Fungsi objektif bernama objective_function adalah bagian inti dari proses optimasi. Fungsi ini menerima masukan berupa array dua dimensi x yang merepresentasikan keputusan pemilihan jenis lampu untuk tiap ruangan oleh setiap partikel dalam PSO. Di dalam fungsi ini, dua array baru dibentuk yaitu total_power untuk mencatat total daya listrik dari semua lampu yang dipilih dan penalty untuk memberikan hukuman jika pencahayaan ruangan tidak sesuai standar. Fungsi kemudian melakukan iterasi untuk setiap ruangan. Pada setiap iterasi, data luas dan kebutuhan lux minimum ruangan diambil. Kemudian nilai dalam array x untuk ruangan tersebut dibulatkan agar menjadi indeks bulat, lalu dibatasi dengan fungsi clip agar tidak keluar dari rentang indeks lampu yang tersedia. Dari indeks tersebut diperoleh jenis lampu yang dipilih, sehingga diketahui nilai watt dan lumennya. Nilai lux kemudian dihitung dengan membagi lumen dengan luas ruangan. Jika lux yang dihasilkan kurang dari kebutuhan setiap ruangan (standar), maka penalty ditambahkan secara proporsional terhadap selisih kekurangannya dikalikan 100. Jika lux berlebihan lebih dari 20 persen, maka penalty juga ditambahkan tetapi dengan bobot 50 agar hasilnya nanti tidak mubazir atau tidak melebihi terlalu jauh dari standar. Tujuan pemberian penalty adalah agar algoritma tidak hanya mencari solusi yang hemat daya, tetapi juga tetap memenuhi/sesuai dengan standar pencahayaan. Setelah semua ruangan dihitung, total dari daya dan penalty dijumlahkan dan dikembalikan sebagai nilai yang akan dievaluasi oleh PSO/sebagai skor untuk 1 kombinasi.
4. Setup PSO
# === Setup PSO ===
n_particles = 1000
options = {'c1': 1.5, 'c2': 1.5, 'w': 0.5}
bounds = (np.zeros(len(rooms)), np.full(len(rooms), len(lamp_power) - 1))
optimizer = ps.single.GlobalBestPSO(
n_particles=n_particles,
dimensions=len(rooms),
options=options,
bounds=bounds
)
# Jalankan optimasi
best_cost, best_pos = optimizer.optimize(objective_function, iters=3000)
PSO kemudian dikonfigurasi dengan jumlah partikel sebanyak 1000. Setiap partikel mewakili solusi alternatif pemilihan jenis lampu untuk seluruh ruangan. Parameter c1 dan c2 masing-masing diatur ke 1.5, yang berarti partikel akan menyeimbangkan antara mengejar solusi terbaik dari dirinya sendiri dan dari seluruh kawanan. Parameter w atau bobot inersia diatur ke 0.5 agar partikel tidak terlalu agresif berpindah posisi. Ruang solusi dibatasi dengan nilai minimal nol dan nilai maksimal sebanyak jumlah jenis lampu dikurangi satu, sesuai jumlah indeks yang valid. Optimasi dijalankan dengan memanggil fungsi optimize selama 3000 iterasi. Pada setiap iterasi, partikel akan memperbarui posisinya berdasarkan informasi terbaik yang dimiliki diri sendiri maupun kawanan, dengan tujuan akhir mendapatkan konfigurasi lampu untuk seluruh ruangan yang menghasilkan total daya paling kecil tanpa mengorbankan kualitas pencahayaan.
5. Mencetak Hasil Optimalisasi
# === Hasil Optimasi ===
print("\n=== Hasil Optimasi ===")
total_optimal_power = 0
for i, room in enumerate(rooms.keys()):
best_idx = int(np.round(best_pos[i]))
best_idx = np.clip(best_idx, 0, len(lamp_power) - 1)
lamp_watt = lamp_power[best_idx]
lamp_lumen_value = lamp_lumen[best_idx]
room_area = rooms[room]["luas"]
lux_value = lamp_lumen_value / room_area
print(f"{room}: Gunakan Lampu {lamp_watt}W ({lamp_lumen_value} Lm) - Lux: {lux_value:.2f} lux")
total_optimal_power += lamp_watt
print(f"\nTotal Daya Optimal: {total_optimal_power} Watt")
Setelah proses optimasi selesai, program mencetak hasil konfigurasi terbaik. Untuk setiap ruangan, indeks solusi terbaik dibulatkan lalu dikonversi ke jenis lampu berdasarkan lamp_power dan lamp_lumen. Nilai lux aktual kemudian dihitung kembali dengan rumus lumen dibagi luas. Hasil ini ditampilkan dalam bentuk teks yang menyebutkan nama ruangan, jenis lampu yang digunakan dalam watt dan lumen, serta nilai lux aktual yang dihasilkan. Semua daya lampu dijumlahkan untuk menghitung total daya optimal yang dibutuhkan oleh seluruh rumah berdasarkan konfigurasi terbaik yang ditemukan oleh PSO.
Contoh outputnya akan seperti ini;
2025 - 03 - 31 05: 48: 24, 620 - pyswarms.single.global_best - INFO - Optimize for 3000 iters with { 'c1': 1.5, 'c2': 1.5, 'w': 0.5 }
pyswarms.single.global_best: 100 %|██████████| 3000 / 3000, best_cost = 3.13e+4
2025 - 03 - 31 05: 48: 42, 197 - pyswarms.single.global_best - INFO - Optimization finished | best cost: 31313.151858311325, best pos: [0.42387967 0.49995785 0.14419506 0.39158543 4.10916378 0.34271925
2.59876917 4.09623224 2.11122266 1.163188 1.62708942 2.24782588
4.29700711 6.43546488 3.79699337 2.03597881 0.46921681 1.09666132
1.2660181 0.06947284]
=== Hasil Optimasi ===
Teras 1: Gunakan Lampu 4.0W(800 Lm) - Lux: 182.23 lux
Teras 2: Gunakan Lampu 4.0W(800 Lm) - Lux: 110.50 lux
Kebun: Gunakan Lampu 4.0W(800 Lm) - Lux: 89.79 lux
Ruangan Jemur: Gunakan Lampu 4.0W(800 Lm) - Lux: 144.14 lux
Ruang Tamu: Gunakan Lampu 20.0W(2000 Lm) - Lux: 195.31 lux
Garasi: Gunakan Lampu 4.0W(800 Lm) - Lux: 95.01 lux
Ruang Tidur 1: Gunakan Lampu 15.0W(1700 Lm) - Lux: 178.01 lux
Ruang Tidur 2: Gunakan Lampu 20.0W(2000 Lm) - Lux: 178.25 lux
Ruang Tidur 3: Gunakan Lampu 7.5W(1500 Lm) - Lux: 190.60 lux
Ruang Tidur 4: Gunakan Lampu 5.0W(1000 Lm) - Lux: 149.25 lux
Ruang Tidur 5: Gunakan Lampu 7.5W(1500 Lm) - Lux: 190.60 lux
Ruang Tidur 6: Gunakan Lampu 7.5W(1500 Lm) - Lux: 200.80 lux
Ruang Keluarga 1: Gunakan Lampu 20.0W(2000 Lm) - Lux: 128.04 lux
Ruang Keluarga 2: Gunakan Lampu 30.0W(3700 Lm) - Lux: 132.95 lux
Ruang Kerja: Gunakan Lampu 20.0W(2000 Lm) - Lux: 254.13 lux
Ruang Dapur + Cuci: Gunakan Lampu 7.5W(1500 Lm) - Lux: 155.93 lux
Musholla: Gunakan Lampu 4.0W(800 Lm) - Lux: 252.37 lux
Kamar Mandi 1: Gunakan Lampu 5.0W(1000 Lm) - Lux: 314.47 lux
Kamar Mandi 2: Gunakan Lampu 5.0W(1000 Lm) - Lux: 229.89 lux
Gudang: Gunakan Lampu 4.0W(800 Lm) - Lux: 203.05 lux
Total Daya Optimal: 198.0 Watt
Secara keseluruhan, program ini memperlihatkan bagaimana metode Particle Swarm Optimization (PSO) dapat digunakan untuk menyelesaikan masalah optimasi dalam kehidupan nyata, khususnya dalam manajemen energi di rumah tangga. Pendekatan ini menggabungkan data teknis seperti spesifikasi lampu dan standar pencahayaan, lalu mencari kombinasi terbaik dengan mempertimbangkan efisiensi dan standar SNI. Meskipun solusi ditemukan melalui metode stokastik berbasis populasi, hasil yang diperoleh tetap masuk akal secara praktis dan dapat diterapkan langsung dalam perencanaan dan optimalisasi sistem pencahayaan rumah yang hemat energi. Nah, setelah memahami bagaimana pendekatan PSO bekerja dalam konteks perencanaan pencahayaan, pada artikel selanjutnya kita akan membahas lebih dalam mengenai hasil dari proses optimasi tersebut dan sejauh mana penghematan energi dapat dicapai.