Herkese merhaba ! Sizlere optimizasyon teknikleri dersi ile ilgilenirken tanıştığım jaya algoritmasından bahsetmek ve örnekleyerek açıklamak istiyorum. Jaya algoritması tıpkı genetik, parçacık sürü ve tabu arama algoritması gibi meta-sezgisel bir algoritmadır. Peki sıklıkla duyduğumuz bu "meta-sezgisel" kavramı tam olarak nedir ? Öncelikle bunu anlamakla başlayalım.
Nedir bu meta-sezgisel algoritmalar ?
Meta-sezgisel algoritmalar, belirli bir problem için kesin ve analitik çözümler yerine mevcut çözüme yakınsamayı amaçlar.
Diyelim ki, minimize edilmesi gereken basit bir fonksiyonumuz var:
Bunu minimize etmek istiyoruz ve bizim çözüm uzayımız x∈[−10,10].
Çözüm uzayında sonuca yani 0'a yakınsamaya çalışıyoruz.
Özellikle karmaşık problemlerde, klasik algoritmaların sonuç veremediği durumlarda iterasyonlar boyunca dene-yanıl mantığı kullanarak sezgisel bir yaklaşım sergiliyoruz. İşte bu da tam olarak meta-sezgisel algoritma oluyor.
Jaya Algoritması ve Adımları
Sanskritçede "zafer" anlamına gelen jaya, 2016 yılında Hindistan kökenli bir akademisyen olan Rao R. Venkata tarafından önerilmiştir. Bu algoritmanın temel felsesi şu şekilde açıklanabilir:
" Popülasyon içindeki her bireyi en iyi çözüm yönünde iyileştirirken en kötü çözümden uzaklaştır."
Şimdi de bu algoritmanın adımlarını inceleyelim:
1) Çözüm uzayının sınırlarını belirle ve rastgele bir çözüm popülasyonu oluştur.
2) En iyi ve en kötü çözümleri belirle
3) Çözümleri güncelle
Her birey aşağıdaki formülle güncellenir:
Burada:
4) Yeni çözümleri mevcut çözümlerle karşılaştır, daha iyi çözümleri popülasyona dahil et
5) Durdurma kriterine ulaşılana kadar tekrarla
Jaya Algoritması Örneği
Genelde yeni bir algoritma ile ilgilenirken birkaç iterasyonu oturur kendim çözerim, aşağıda jaya algoritması için basit bir örnek çalışmam mevcut. Umarım konuyu daha iyi kavramamıza yardımcı olur.
Çok Boyutlu Optimizasyon Problerinde Jaya Algoritmasının Kullanımı
import numpy as np def jaya_algorithm(obj_function, dim, bounds, population_size, max_iter):
# cozum uzayinin sinirlarina gore baslangic populasyonu olustur population = np.random.uniform( [b[0] for b in bounds], [b[1] for b in bounds], (population_size, dim) )
for iteration in range(max_iter): # populasyonun uygunluk degerlerini belirle (her birinin fitness value'su) fitness = np.apply_along_axis(obj_function, 1, population)
# en iyi ve en kotu cozumu belirle best_idx = np.argmin(fitness) worst_idx = np.argmax(fitness) best_solution = population[best_idx] worst_solution = population[worst_idx]
# cozumleri formule gore guncelle # x_new = x_old + r1*(x_best-abs(x_old)) - r2*(x_worst-abs(x_old)) for i in range(population_size): r1, r2 = np.random.rand(), np.random.rand() new_solution = ( population[i] + r1 * (best_solution - abs(population[i])) - r2 * (worst_solution - abs(population[i])) ) # yeni cozum, cozum sinirlari icerisinde mi kontrol et new_solution = np.clip(new_solution, [b[0] for b in bounds], [b[1] for b in bounds]) # Yeni çözüm eski cozumden iyiyse güncelle if obj_function(new_solution) < obj_function(population[i]): population[i] = new_solution best_value = obj_function(best_solution) return best_solution, best_value # Ornek amac fonksiyonlarimiz (fitness func) # sphere en klasik optimizasyon problemidir # kisaca f(x) = ∑ (x_i)^2 # bunu da bir minimizasyon problemi olarak degerlendiriyoruz 0 yakinsiyoruz def sphere_function(x): return np.sum(x**2) sphere_function_dim = 5 bounds = [(-5, 5) for _ in range(sphere_function_dim)] population_size = 20 max_iter = 100 best_solution, best_value = jaya_algorithm(sphere_function, sphere_function_dim, bounds, population_size, max_iter) print(f"Best Solution: {best_solution}") print(f"Best Value: {best_value}") |
Comments