Jump to content
  • entries
    55
  • comments
    2
  • views
    57,774

Harmony Search (HS) Algoritması


Doğuhan ELMA

213 views

Harmony Search (HS) algoritması, müzik sürecinden esinlenen bir metaheuristik optimizasyon algoritmasıdır. Metaheuristik algoritmalar, genellikle bir dizi çözümü keşfederek ve iyileştirerek belirli bir hedef fonksiyonunu minimize etmeye veya maksimize etmeye çalışır. HS, müzisyenlerin harika bir harmoni (veya optimal çözüm) bulmak için farklı enstrümanlar (veya karar değişkenleri) üzerindeki notaları (veya değerleri) ayarlamalarına benzer bir süreci taklit eder.

HS algoritmasının temel adımları şunlardır:

1. Başlangıçta Harmony Memory (HM) oluşturulur: HS, belirli bir sayıda rastgele çözümden oluşan bir "harmony memory" (HM) oluşturur. Bu, bir grup müzisyenin ilk kez bir araya gelip rastgele notalar çalmalarına benzer.

2. Yeni bir harmony oluşturulur: HS daha sonra yeni bir "harmony" (çözüm) oluşturur. Bu, her bir karar değişkeninin HM'deki değerlerinden birini rastgele seçerek veya belirli bir olasılıkla yeni bir rastgele değer oluşturarak yapılır. Bu, bir müzisyenin daha önce çalınan bir notayı tekrar çalma veya yeni bir notayı deneme sürecine benzer.

3. Yeni harmony değerlendirilir: HS, yeni oluşturulan harmoninin kalitesini (veya uygunluğunu) bir hedef fonksiyonu kullanarak değerlendirir. Bu, bir grup müzisyenin yeni çalınan notaların genel harmoniye ne kadar katkıda bulunduğunu değerlendirmesine benzer.

4. HM güncellenir: Eğer yeni harmony, HM'deki en kötü harmoniden daha iyi ise, HS en kötü harmoniyi yeni harmony ile değiştirir. Bu, bir grup müzisyenin genel harmoniyi iyileştirmek için daha iyi notaları kabul etme ve kötü notaları reddetme sürecine benzer.

5. Durma kriteri kontrol edilir: HS, belirli bir durma kriteri karşılanana kadar bu süreci tekrarlar. Bu, genellikle belirli bir sayıda iterasyon veya belirli bir hedef uygunluk seviyesi olabilir.

HS algoritmasının avantajlarından biri, basit ve anlaşılır olmasıdır. Ancak, genellikle birçok problemde başarılı olabilmesi için parametrelerinin (örneğin, HM boyutu ve yeni harmony oluşturma olasılıkları) dikkatlice ayarlanması gerekmektedir.

 

Öncelikle, belirtmemiz gerekir ki Harmony Search algoritması genellikle geniş ve karmaşık arama alanları için kullanılır ve bu nedenle basit bir Python scriptinde tam anlamıyla uygulanması zordur. Ancak, aşağıda sizinle basit bir Harmony Search benzeri algoritmanın bir örneğini paylaşıyoruz. Bu örnek, yukarıda tarif ettiğimiz Harmony Search algoritmasının genel sürecini yansıtmaktadır.

import numpy as np

# Parametreler
n_variables = 10
n_harmonies = 20
max_iter = 1000
bandwidth = 0.01
harmony_memory_consideration_rate = 0.95
pitch_adjustment_rate = 0.7

# Harmony memory'yi başlangıçta rastgele değerlerle doldur
harmony_memory = np.random.rand(n_harmonies, n_variables)

# Her harmony için uygunluk değerini hesapla
fitness_values = np.sum(harmony_memory, axis=1)

for _ in range(max_iter):
    # Yeni harmony oluştur
    new_harmony = np.zeros(n_variables)
    for i in range(n_variables):
        if np.random.rand() < harmony_memory_consideration_rate:
            # Harmony memory'den bir harmony seç
            new_harmony[i] = harmony_memory[np.random.randint(n_harmonies), i]
            if np.random.rand() < pitch_adjustment_rate:
                # Pitch adjustment uygula
                new_harmony[i] += bandwidth * np.random.randn()
        else:
            # Yeni rastgele harmony oluştur
            new_harmony[i] = np.random.rand()

    # Yeni harmony'nin uygunluk değerini hesapla
    new_fitness_value = np.sum(new_harmony)

    # Eğer yeni harmony en kötü harmony'den daha iyiyse, en kötü harmony'yi yeni harmony ile değiştir
    worst_fitness_value_index = np.argmin(fitness_values)
    if new_fitness_value > fitness_values[worst_fitness_value_index]:
        harmony_memory[worst_fitness_value_index, :] = new_harmony
        fitness_values[worst_fitness_value_index] = new_fitness_value

# En iyi harmony'yi yazdır
best_harmony_index = np.argmax(fitness_values)
print('En iyi harmony:', harmony_memory[best_harmony_index, :])
print('En iyi harmony\'nin uygunluk değeri:', fitness_values[best_harmony_index])

Bu kod, çok boyutlu bir arama alanında yer alan harmonilerin uygunluk değerlerini en yükseğe çıkarmaya çalışır. Her harmony, bir dizi rastgele sayıdan oluşur ve uygunluk değeri, bu sayıların toplamıdır.

Kod, en başta harmony memory'yi rastgele sayılarla doldurur ve sonra her iterasyonda yeni bir harmony oluşturur. Yeni harmony, harmony memory'deki harmonilerden birini rastgele seçerek ve belirli bir olasılıkla pitch adjustment uygulayarak oluşturulur. Yeni harmony'nin uygunluk değeri, mevcut en kötü harmony'den daha yüksekse, yeni harmony, harmony memory'deki en kötü harmony'nin yerini alır. Bu süreç, belirli bir sayıda iterasyon boyunca tekrarlanır. Sonuç olarak, en iyi harmony ve onun uygunluk değeri yazdırılır.

Lütfen bu kodun basit bir örnekleme ve pitch adjustment stratejisi kullandığını ve gerçek hayatta genellikle daha karmaşık problemlerle karşılaşıldığını unutmayın. Gerçek dünya uygulamaları için Harmony Search algoritmasının daha karmaşık versiyonları ve daha kapsamlı kütüphaneler mevcuttur.

armony Search algoritması ses frekansları veya melodilerle doğrudan bir ilgisi olmasa da, bir ses sentezleme uygulaması için bir yaklaşım denenebilir. Python'da sesle çalışabilmek için genellikle pydub ve simpleaudio gibi kütüphaneler kullanılır.

Aşağıdaki örnekte, bir dizi frekanstaki notaların farklı ses yoğunluklarına sahip bir 'harmoni' oluşturulmaktadır. Harmony Search algoritması, bu ses yoğunluklarını optimal hale getirmek için kullanılır. Ancak, bu kod örneği gerçek bir Harmony Search algoritması uygulaması olmayıp, Harmony Search algoritmasının temel konseptlerini bir ses uygulaması bağlamında göstermeye yöneliktir.

import numpy as np
import simpleaudio as sa

# Parametreler
n_notes = 10
n_harmonies = 20
max_iter = 1000
bandwidth = 0.01
harmony_memory_consideration_rate = 0.95
pitch_adjustment_rate = 0.7

# Nota frekansları (Hz)
frequencies = np.logspace(np.log10(440), np.log10(880), n_notes)

# Harmony memory'yi başlangıçta rastgele değerlerle doldur
harmony_memory = np.random.rand(n_harmonies, n_notes)

# Her harmony için uygunluk değerini hesapla
fitness_values = np.sum(harmony_memory, axis=1)

for _ in range(max_iter):
    # Yeni harmony oluştur
    new_harmony = np.zeros(n_notes)
    for i in range(n_notes):
        if np.random.rand() < harmony_memory_consideration_rate:
            # Harmony memory'den bir harmony seç
            new_harmony[i] = harmony_memory[np.random.randint(n_harmonies), i]
            if np.random.rand() < pitch_adjustment_rate:
                # Pitch adjustment uygula
                new_harmony[i] += bandwidth * np.random.randn()
        else:
            # Yeni rastgele harmony oluştur
            new_harmony[i] = np.random.rand()

    # Yeni harmony'nin uygunluk değerini hesapla
    new_fitness_value = np.sum(new_harmony)

    # Eğer yeni harmony en kötü harmony'den daha iyiyse, en kötü harmony'yi yeni harmony ile değiştir
    worst_fitness_value_index = np.argmin(fitness_values)
    if new_fitness_value > fitness_values[worst_fitness_value_index]:
        harmony_memory[worst_fitness_value_index, :] = new_harmony
        fitness_values[worst_fitness_value_index] = new_fitness_value

# En iyi harmony'yi oynat
best_harmony_index = np.argmax(fitness_values)
for i in range(n_notes):
    frequency = frequencies[i]
    amplitude = harmony_memory[best_harmony_index, i]

    # Sine dalgası oluştur
    sample_rate = 44100
    duration = 0.5
    t = np.linspace(0, duration, int(sample_rate * duration), False)
    note = amplitude * np.sin(frequency * t * 2 * np.pi)

    # Ses dalgasını 16-bit PCM formatına dönüştür
    audio = note * (2**15 - 1) / np.max(np.abs(note))
    audio = audio.astype(np.int16)

    # Ses dalgasını çal
    play_obj = sa.play_buffer(audio, 1, 2, sample_rate)
    play_obj.wait_done()

Bu kodda, belirli frekanslarda bir dizi nota oluşturulur ve her nota, bir 'harmony' içindeki bir elemana karşılık gelir. Harmony Search algoritması, her bir notanın ses yoğunluğunu optimize etmek için kullanılır. Her iterasyonda, yeni bir harmony oluşturulur ve eğer yeni harmony'nin toplam ses yoğunluğu (uygunluk değeri) mevcut en düşük uygunluk değerinden daha yüksekse, en düşük uygunluk değerine sahip olan harmony yerine geçer. Algoritma belirli bir sayıda iterasyon boyunca çalıştıktan sonra, en iyi harmony oynatılır.

Bu kod örneği, bir bilgisayarın ses kartına bağlı hoparlörlerden çıkan sesi üretir.  Ayrıca, kod örneği basitleştirilmiştir ve gerçek bir ses sentezleme uygulamasında kullanılacak Harmony Search algoritması genellikle daha karmaşık olacaktır.

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...