Memetik algoritmalar (MA)
Memetik algoritmalar (MA), genetik algoritmaların ve yerel arama algoritmalarının birleşimidir. İsmi, Richard Dawkins'in "meme" kavramından türetilmiştir. Dawkins, "meme" kavramını, kültürel bilgi birimlerini ifade etmek için kullanmıştır, bu kavram zamanla bir organizmadan diğerine aktarılır ve evrimleşir. Dawkins, genetik evrimin biyolojik özelliklerin nasıl evrimleştiğini açıkladığı gibi, memetik evrimin de kültürel özelliklerin nasıl evrimleştiğini açıkladığını belirtmiştir.
Memetik algoritmalarda, her birey bir çözümü temsil eder ve bu bireyler genetik operatörler (seçilim, çaprazlama ve mutasyon) aracılığıyla bir popülasyon içinde evrimleşir. Ancak, memetik algoritmalar, genetik algoritmalardan farklı olarak, her bireyin yerel arama algoritmaları kullanılarak daha da optimize edildiği bir adım içerir. Bu yerel arama adımı, bir "meme" olarak görülür ve bireyler arasında yayılır. Yani, her birey, kendi çözümünü iyileştirmek için bilgi kullanır.
Yerel arama adımı genellikle her nesil sonrası uygulanır ve bu da genetik algoritmalardan farklı olarak memetik algoritmalarda genellikle daha hızlı bir yakınsama sağlar. Memetik algoritmalarda çözüm genellikle daha iyi ve daha hızlı bir şekilde elde edilir çünkü algoritma, genetik algoritmaların genel arama yeteneğini ve yerel arama algoritmalarının yoğun arama yeteneğini birleştirir. Bu, memetik algoritmanın genellikle genetik algoritmadan daha iyi performans göstermesini sağlar.
Bir memetik algoritma, optimizasyon problemlerinin çözülmesi için geniş bir yelpazede uygulanabilir. Bu problemler, seyahat eden satış elemanı problemi, dizi hizalama problemleri, rota planlama problemleri ve daha fazlasını içerir. Ancak, memetik algoritmanın başarısı, genellikle yerel arama algoritmasının ve genetik operatörlerin doğru bir şekilde seçilmesine bağlıdır.
Bu örnekte, genetik algoritmanın ana hatlarına yerel arama adımını ekliyoruz.
import numpy as np # Problem Parametreleri num_variables = 10 population_size = 100 num_generations = 50 mutation_rate = 0.1 crossover_rate = 0.7 # Uygunluk Fonksiyonu def fitness(individual): return sum(individual) # Yerel Araştırma Fonksiyonu def local_search(individual): for i in range(len(individual)): if individual[i] == 0: individual[i] = 1 if fitness(individual) > fitness(individual): individual[i] = 0 return individual # Popülasyonu Başlat population = np.random.randint(2, size=(population_size, num_variables)) # Her nesil için for generation in range(num_generations): # Yeni popülasyonu sakla new_population = [] # Her birey için for individual in population: # Yerel araştırma individual = local_search(individual) # Çaprazlama if np.random.random() < crossover_rate: other_individual = population[np.random.randint(population_size)] cross_point = np.random.randint(num_variables) individual[:cross_point], other_individual[:cross_point] = other_individual[:cross_point].copy(), individual[:cross_point].copy() # Mutasyon for i in range(num_variables): if np.random.random() < mutation_rate: individual[i] = 1 - individual[i] new_population.append(individual) # Popülasyonu güncelle population = np.array(new_population) # En uygun bireyi yazdır print("En uygun birey: ", max(population, key=fitness))
Bu örnek memetik algoritma, ikili değişkenlerden oluşan bir optimizasyon problemi çözmek üzere tasarlanmıştır. Algoritma, her bireyi bir bit dizisi olarak temsil eder ve bitlerin toplamını maksimize etmeye çalışır.
Algoritma ayrıca bir yerel arama adımı içerir. Bu adımda, bireyin her bir bitini bir seferde tersine çevirir ve bu terslemenin uygunluğu artırıp artırmadığını kontrol eder. Eğer bir tersleme uygunluğu artırırsa, o tersleme yapılır. Bu, bireyin kendi çözümünü iyileştirmek için kullandığı bir meme olarak düşünülebilir.
0 Comments
Recommended Comments
There are no comments to display.