Python ile Yapay Zekâ için Hill Climbing Algoritmasını Uygulama
Python'da hill climbing algoritmasını öğrenin. Bu rehber, türler, sınırlamalar ve gerçek dünyadaki yapay zekâ uygulamalarını kod örnekleriyle ele alır.
Hill climbing algoritması, yapay zekâ ve bilgisayar bilimlerinde en eski ve en basit optimizasyon algoritmalarından biridir. Artımlı iyileştirmeler yaparak çözümler bulan yerel arama (local search) algoritmaları kategorisine girer.
Algoritmanın adı faydalı bir benzetmeden gelir: Gözleri bağlı bir yürüyüşçünün bir tepenin zirvesine ulaşmaya çalıştığını hayal edin. Tüm manzarayı göremediği için yalnızca hemen çevresindeki zemini hissedebilir. Her adımda yukarıya götüren yöne ilerler. Bu, algoritmanın çalışma şekline benzer — yakın çözümleri değerlendirir ve daha iyilerine doğru yinelemeli olarak hareket eder, en iyi çözümü (tepenin zirvesini) bulmaya çalışır.
Bu yazıda, hill climbing algoritmasını, varyasyonlarını ve Python'da nasıl uygulanacağını ayrıntılı olarak inceleyeceğiz. Yapay zekâda yeniyseniz, temelleri kapsayan AI Fundamentals beceri yolumuzu mutlaka inceleyin.
Yapay Zekâda Hill Climbing Algoritması Nedir?
Hill climbing, bir dağın zirvesine ulaşmaya çalışan bir yürüyüşçü gibi, bilgisayarların mümkün olan en iyi cevabı bularak sorunları çözmesinin basit bir yoludur. Yapay zekâda (AI) çoğu zaman birçok olası seçenek arasından en iyi çözümü bulmamız gerekir. Buna optimizasyon denir.
"Sıcak-soğuk" oyunu oynarken en yüksek noktayı bulmaya çalıştığınızı düşünün. Bu oyunda yalnızca hareket ettikçe "ısındığınızı" (daha iyi) ya da "soğuduğunuzu" (daha kötü) kontrol edebilirsiniz. Hill climbing de aynı şekilde çalışır — yakındaki çözümlere bakar ve daha iyi olanlara doğru ilerler.
Basit adımlarla nasıl çalıştığı şöyle:
Herhangi bir olası çözümle başlayın
Yakındaki çözümlere bakın
Yakındaki bir çözüm daha iyiyse ona geçin
Daha iyi bir çözüm bulunamayıncaya kadar 2–3. adımları tekrarlayın
Örneğin bir robota yürümeyi öğretmeye çalışıyorsanız, Hill Climbing şunları yapabilir:
Rastgele bacak hareketleriyle başlayın
Biraz farklı hareketler deneyin
Robotun daha iyi yürümesine yardımcı olanları koruyun
En iyi yürüme düzenini bulana kadar tekrarlayın
Hill climbing her zaman AI'deki en gelişmiş yöntem olmasa da, bilgisayarların tıpkı minimax algoritması gibi kendi başlarına nasıl problem çözebildiklerini anlamamıza yardımcı olan önemli bir yapı taşıdır.
Hill Climbing Algoritmalarının Türleri
Her biri en iyi çözümü arama biçimi farklı olan üç ana hill climbing türü vardır:
1. Basit hill climbing
Basit hill climbing, bulduğunuz ilk iyi adımı atmaya benzer. Bu sürümde:
Algoritma yakın çözümlere tek tek bakar
Daha iyi bir çözüm bulur bulmaz onu seçer
Diğer seçenekleri kontrol etmez
Hızlıdır ama biraz daha uzaktaki daha iyi çözümleri kaçırabilir
2. En dik çıkış (steepest-ascent) hill climbing
Bu sürüm, basit hill climbing’den daha kapsamlıdır:
Hamle yapmadan önce TÜM yakın çözümlere bakar
Buldukları arasından en iyi seçeneği seçer
Daha uzun sürer ama genellikle daha iyi çözümler bulur
Adım atmadan önce her yolu dikkatle kontrol etmeye benzer
3. Stokastik hill climbing
Bu tür, aramayı daha etkili kılmak için biraz rastgelelik ekler:
Her zaman en iyiyi seçmek yerine, daha iyi seçenekler arasından rastgele seçim yapar
Daha iyi çözümlerin seçilme olasılığı daha yüksektir
Bu rastgelelik, kötü noktalarda sıkışmayı önlemeye yardımcı olur
Bazen sırf nereye çıkacağını görmek için farklı bir patikayı seçmeye benzer
Her türün kendi güçlü yanları vardır ve farklı problem türlerinde daha iyi çalışır. Basit hill climbing hızlı ama temel düzeydedir, en dik çıkış kapsamlıdır ama yavaştır, stokastik yaklaşım ise sıkışmayı önlemek için faydalı bir rastgelelik katar.
Hill Climbing Algoritması Nasıl Çalışır
Hill climbing algoritması, en iyi mümkün çözüme ulaşana kadar küçük iyileştirmeleri adım adım yaparak çalışır. Nasıl çalıştığını ana bölümlerine ayıralım.
1. Başlangıç
Her hill climbing algoritmasının bir başlangıç noktasına ihtiyacı vardır. Bunu bir dağda yürüyüşe nereden başlayacağınıza karar vermek gibi düşünün. Rastgele başlayabilir ya da problem hakkında bildiklerinizi kullanarak iyi bir başlangıç noktası seçebilirsiniz.
Nereden başladığınız gerçekten önemlidir — iyi bir nokta seçerseniz en iyi çözüme hızlıca ulaşabilirsiniz. Kötü bir nokta seçerseniz, dağın zirvesini bulmak yerine küçük bir tepede sıkışıp kalabilirsiniz.
Örneğin yapay sinir ağlarını eğitirken, başlangıç noktası nöronlar arasındaki bağlantıların ilk ağırlıklarını seçmek anlamına gelir. Bu ağırlıkları rastgele başlatabilirsiniz; bu, yürüyüşe dağın rastgele bir noktasından başlamak gibidir. Ya da ağ yapısına dayalı akıllı başlangıç ağırlıkları seçen Xavier başlatma gibi teknikler kullanabilirsiniz.
İyi bir başlatma, ağın daha hızlı öğrenmesine ve daha iyi çözümler bulmasına yardımcı olurken; kötü bir başlatma, doğruluğun düşük kalmasına ve hiç iyileşmemesine yol açabilir.
2. Yakındaki çözümlere bakma
Algoritma aramasına başladığında, mevcut konuma benzer komşu çözümleri değerlendirir. Bunu, yakın çevreyi küçük adımlarla keşfetmek gibi düşünün. Örneğin şehirler arası bir teslimat rotasını optimize etmeye çalışıyorsanız ve mevcut rotanız [A -> B -> C -> D] ise, algoritma [A -> B -> D -> C] veya [A -> C -> B -> D] gibi benzer rotaları, toplam kat edilen mesafeyi azaltıp azaltmadıklarını görmek için inceler. Rotadaki her küçük değişiklik, mevcut olandan potansiyel olarak daha iyi olabilecek bir "komşu" çözümü temsil eder.
Bu karşılaştırmaları yapmak için algoritma, her olası çözüme bir puan veya değer atayan, amaç fonksiyonu denilen şeye dayanır.
Bu fonksiyon bir pusula gibi davranır; algoritmanın hangi yönlerin daha iyi çözümlere doğru “yokuş yukarı”, hangilerinin “yokuş aşağı” olduğunu anlamasına yardımcı olur. Bir teslimat rotası için amaç fonksiyonu toplam kat edilen mesafeyi hesaplar — daha kısa toplam mesafe daha iyi bir çözüm demektir.
Dolayısıyla X rotası 100 mil sürüyor, Z rotası 90 mil sürüyorsa, B rotası daha iyi (daha düşük) bir puana sahip olur. Algoritma böylece B rotasına benzer çözümler yönünde ilerlemesi gerektiğini bilir. Amaç fonksiyonu, rota optimizasyonu gibi karmaşık bir problemi karşılaştırıp en aza indirgenebilen basit bir sayıya dönüştürür.
3. Sonraki adımı seçme
Yakın çözümlere baktıktan sonra, algoritmanın bir sonraki hamleyi belirlemesi gerekir. Algoritma, yakın çözümlerin puanlarını mevcut çözümle karşılaştırır. Daha iyi bir çözüm bulursa oraya geçer. Hill climbing’in farklı sürümleri bu seçimi farklı şekillerde yapar:
Basit sürüm, bulduğu ilk daha iyi çözümü alır
Dikkatli sürüm, en iyisini seçmeden önce tüm yakın çözümleri kontrol eder
Rastgele sürüm, bazen en iyi olmayan çözümleri seçer; bu da sıkışmayı önlemeye yardımcı olabilir
4. Ne zaman duracağını bilme
Algoritma, daha iyi çözümler aramayı ne zaman bırakacağını bilmelidir. Genellikle şu durumlardan biri gerçekleştiğinde durur:
Yakında daha iyi çözümler bulamaz
Çok uzun süredir çalışıyordur
Yeterince iyi bir çözüm bulmuştur
Algoritma çalışırken genellikle bir desen izler. Başta hızlıca daha iyi çözümler bulur; bu, dik bir yokuşta büyük adımlar atmaya benzer. Sonra zirveye yaklaştıkça yavaşlar, küçük iyileştirmeler yapar ve sonunda durur.
Bazen yol düz ve nettir; bazen de iniş çıkışlarla dolu, daha zorlu olabilir.
AI’de Hill Climbing’in Avantajları ve Sınırlamaları
Hill climbing’in ne işe yaradığını ve kullanırken ne tür sorunlarla karşılaşabileceğinizi inceleyelim.
Avantajlar
Hill climbing, anlaşılması ve programlanması en kolay optimizasyon algoritmalarından biridir. Temel bir kuralı izler: “Daha iyiyse, oraya git.” Bu, birçok problemi çözmek için iyi bir başlangıç noktası yapar.
Problem net olduğunda, hill climbing iyi çözümleri hızlıca bulabilir. Her olası çözümü araştırmakla vakit kaybetmez — sadece yukarı giden yolu takip eder.
Algoritma fazla bellek veya işlem gücü gerektirmez. Nerede olduğunu hatırlaması ve yakın çözümlere bakması yeterlidir; bu da onu birçok gerçek dünya problemi için pratik kılar.
Sınırlamalar
Elbette, her yöntemde olduğu gibi bazı potansiyel dezavantajlar vardır:
1. Küçük tepelerde takılmak
Hill climbing’in en büyük problemi, “yerel maksimumlar”da takılabilmesidir — yakında bir dağ olmasına rağmen küçük tepelere benzerler. Algoritma küçük bir tepenin zirvesine ulaştığında, çevresindeki her şey daha alçak olduğu için durur; oysa başka yerlerde çok daha iyi çözümler olabilir.
2. Düz zemin problemi
Bazen algoritma, yakındaki tüm çözümlerin eşit derecede iyi olduğu düz bir zeminde (plateau) kalır. Düz bir futbol sahasında yürürken en yüksek noktayı bulmaya çalıştığınızı hayal edin — hangi yöne gideceğinizi bilmek zordur!
3. Sırt (ridge) problemi
Dar bir dağ sırtının üzerinde yürümeye çalıştığınızı düşünün. Algoritma, zirveye doğru ilerlemek yerine sırt üzerinde sağa sola zigzag yaparak zaman kaybedebilir. Bunun nedeni, yana atılan her adımın, rotada kalmak kadar iyi görünmesidir.
4. Başlangıç noktası çok önemlidir
Nereden başladığınız, algoritmanın ne kadar iyi çalıştığını büyük ölçüde etkiler. Bu bir yürüyüşe başlamak gibidir — yanlış yerden başlarsanız, en yüksek zirveyi asla bulamayabilirsiniz.
Bu sınırlamalar, hill climbing’in kötü bir seçim olduğu anlamına gelmez — sadece onu ne zaman ve nasıl kullanacağımız konusunda dikkatli olmamız gerektiği anlamına gelir. Bazen bu sorunların üstesinden gelmek için onu diğer tekniklerle birleştirebiliriz; bir sonraki bölümde bunu tartışacağız.
Sınırlamaların Üstesinden Gelme Stratejileri
Hill climbing kullanırken, daha önce tartıştığımız sorunları çözmek için birkaç akıllı strateji uygulayabiliriz. Hill climbing’i daha etkili kılan iki ana yaklaşımı inceleyelim.
Rastgele başlatmalı (random-restart) hill climbing
Küçük tepelerde sıkışmayı önlemenin en iyi yollarından biri, farklı başlangıç noktalarından tırmanmayı denemektir. Bu yaklaşıma rastgele başlatmalı hill climbing denir ve tam da göründüğü gibi çalışır — sıkışırsanız, yeni bir yerde yeniden başlarsınız.
Sisli bir sıradağda en yüksek dağı bulmaya çalıştığınızı düşünün. Karşınıza çıkan ilk tepeyi tırmanıp zirvesine ulaşırsanız, yakındaki çok daha yüksek bir dağı kaçırabilirsiniz. Ama farklı noktalara ışınlanıp tekrar tırmanmaya başlasaydınız, en yüksek zirveyi bulma şansınız çok daha yüksek olurdu.
Nasıl çalışır: Önce normal hill climbing algoritmasını, sıkışana kadar çalıştırırsınız. Vazgeçmek yerine, bulduğunuz en iyi çözümü kaydeder ve sonra rastgele yeni bir noktadan tekrar başlarsınız. Bunu birkaç deneme boyunca sürdürür, sonunda tüm denemeleriniz arasından en iyi çözümü seçersiniz.
Rastgele başlatmanın güzelliği basit ama etkilidir. Her yeniden başlatma size en yüksek zirveyi bulmak için yeni bir şans verir. Normal hill climbing’den daha fazla zaman alsa da, en iyi çözümü bulma olasılığı çok daha yüksektir.
Benzetimli tavlama (simulated annealing)
Teknik olarak hill climbing olmasa da, benzetimli tavlama hill climbing’in birçok sorununu çözmeye yardımcı olan akıllı bir varyasyondur. Metal işçiliğinde metallerin soğuyup sertleşmesinden esinlenmiştir. Metal yavaşça soğuduğunda atomlar daha iyi konumlar bulur ve metal daha sağlam hale gelir.
Bu yaklaşımda, algoritma özellikle başlangıçta zaman zaman bilerek daha kötü çözümleri kabul eder. Zaman geçtikçe, kabul ettiği çözümler konusunda daha seçici hale gelir. Bu, engebeli bir zeminde zıplayan bir topa benzer — başta tepeciklerin üzerinden zıplayacak kadar enerjisi vardır, fakat enerji kaybettikçe iyi bir noktaya yerleşir.
Nasıl çalışır: Başlangıçta, algoritma mevcut çözümden daha kötü bir çözümü nispeten yüksek bir olasılıkla kabul edebilir. Bu olasılık iki şeye bağlıdır: yeni çözümün ne kadar daha kötü olduğu ve algoritmanın ne kadar süredir çalıştığı. Zamanla, daha kötü çözümleri kabul etme olasılığı azalır ve sonunda normal Hill Climbing gibi davranır.
Benzetimli tavlamanın asıl gücü, özellikle aramanın başlarında küçük tepelerden ve düz alanlardan kaçabilmesidir. Bazen daha kötü çözümleri kabul ederek şunları yapabilir:
Yerel maksimumlardan (küçük tepeler) sıçrayıp çıkmak
Plâtoları (düz alanlar) aşmak
Sırtları (dar zirveler) aşmak
Çözüm uzayının daha fazlasını keşfetmek
Örneğin, bir odadaki mobilyaları alanı en üst düzeye çıkaracak şekilde düzenlemeye çalıştığınızı hayal edin. Bir sandalyeyi hareket ettirmek geçici olarak odayı daha sıkışık hale getirebilir, ancak sonrasında diğer parçaları çok daha iyi konumlara taşımanıza olanak tanıyabilir. Benzetimli tavlama, özellikle sürecin başında bu geçici olarak daha kötü düzenlemeleri denemeye istekli olur ve böylece en iyi genel düzeni bulabilir.
Bu stratejiler, bazen bir problemi çözmenin en iyi yolunun her zaman bariz adımı atmak olmadığını gösterir. Rastgelelik ve kontrollü kaosu ekleyerek, çoğu zaman düz yolun her zaman seçilmesinden daha iyi çözümlere ulaşabiliriz.
Python’da Basit Bir Hill Climbing Algoritması Uygulama
Artık hill climbing’i rastgele başlatma ve benzetimli tavlama gibi stratejilerle nasıl geliştireceğimizi anladığımıza göre, bunu gerçek bir finansal probleme uygulayalım: portföy optimizasyonu.
Portföy optimizasyonu, yatırımcıların paralarını farklı yatırımlar arasında nasıl dağıtacaklarına karar vermelerine yardımcı olur. Yatırımcılar bir portföy oluştururken, risklerini düşük tutarken mümkün olan en yüksek getiriyi elde etmek isterler. Bu dengeyi bulmak zordur — birçok malzemeli mükemmel bir tarif bulmaya benzer.
1952’de Harry Markowitz adlı bir iktisatçı bu soruna akıllı bir çözüm buldu. Yatırımcıların, birlikte hareket etmeyen yatırımları karıştırarak risklerini azaltabileceklerini gösterdi. Buna çeşitlendirme denir — tüm yumurtaları tek sepete koymamaya benzer.
Bir portföy oluştururken üç ana şeyi çözmemiz gerekir:
Ne kadar para kazanmayı beklediğimiz (Beklenen Getiri)
Yatırımların ne kadar riskli olduğu (Portföy Riski)
Olası kârların riske değip değmediği (Riske Göre Ayarlanmış Getiri)
Hill Climbing bu problem için iyi çalışır çünkü paramızı bölüşme biçimimizdeki küçük değişiklikler, genellikle portföy performansında küçük değişikliklere yol açar. Paranızın yatırılabileceği her yolu temsil eden pürüzsüz bir tepe hayal edin. Daha yüksek noktalar daha iyi yatırım tercihlerini gösterir.
Hill Climbing ile iyi bir portföy bulmak için şunları yapacağız:
Yatırımların rastgele bir karmasıyla başlayın
Biraz farklı karmaların daha iyi çalışıp çalışmadığını deneyin
Daha iyi seçenekler bulamayıncaya kadar küçük iyileştirmeler yapmaya devam edin
Bulduğumuz en iyi karmayı kullanın
Hill climbing’i bu şekilde kullanarak, yatırımcılara milyonlarca olası kombinasyon arasından daha iyi portföyler bulmalarında yardımcı olabiliriz. Bu, riski ve getiriyi iyi dengeleyen farklı yatırım karmalarını hızla test edebilen akıllı bir yardımcıya sahip olmak gibidir.
Öncelikle, beklenen getirileri riskle dengeleyen bir portföy performansı ölçüsü olan amaç fonksiyonumuzu tanımlayalım. Bu fonksiyon, girdi olarak portföy ağırlıklarının bir listesini alır ve daha yüksek puanların daha iyi portföyleri gösterdiği bir skor döndürür.
defobjective_function(state):"""
Portfolio optimization objective function that maximizes expected returns while minimizing risk.
The state represents portfolio weights for different assets.
Args:
state (list): List of portfolio weights for different assets (should sum to 1)
Returns:
float: Portfolio score combining returns and risk
"""# Expected annual returns for assets (example values)
expected_returns =[0.1,0.12,0.18,0.1,0.15]# 8%, 12%, etc.# Risk (volatility) for each asset
volatilities =[0.1,0.2,0.3,0.2,0.2]# 10%, 20%, etc.# Validate input length matches expected returns/volatilitiesiflen(state)!=len(expected_returns):returnfloat("-inf")# Return worst possible score for invalid states# Calculate expected portfolio return
portfolio_return =sum(w * r for w, r inzip(state, expected_returns))# Calculate portfolio risk (simplified, not using covariance matrix)
portfolio_risk =sum(w * v for w, v inzip(state, volatilities))# Penalize if weights don't sum to 1 (invalid portfolio)
weight_sum_penalty =abs(sum(state)-1)*100# Penalize negative weights (no short selling)
negative_weight_penalty =sum(abs(min(0, w))for w in state)*100# Combine return and risk with risk aversion factor of 2# Higher score is better: maximize return, minimize risk and penalties
score =(
portfolio_return
-2* portfolio_risk
- weight_sum_penalty
- negative_weight_penalty
)return scoreAltyapı:
objective_function yukarıda, belirli bir yatırım portföyünün ne kadar iyi olduğunu değerlendirmemize yardımcı olur. Nasıl çalıştığını şöyle özetleyebiliriz:
Önce, paramızı farklı varlıklara (hisse senedi veya tahvil gibi) ne oranda yatırmak istediğimizi temsil eden bir sayı listesi alır. Örneğin beş varlığımız varsa, her birine yüzde 20 yatırabiliriz.
Fonksiyon iki önemli bilgiyi kullanır:
Beklenen getiriler: Her varlıktan ne kadar kazanç beklediğimiz (yılda yüzde 8 veya 12 gibi)
Oynaklıklar: Her varlığın ne kadar riskli olduğu — daha yüksek sayılar, varlığın değerinin daha öngörülemez şekilde değiştiği anlamına gelir (kripto gibi)
Fonksiyon ardından şunları yapar:
Her varlığın beklenen getirisini, ona ne kadar yatırım yaptığımızla çarparak portföyün toplam beklenen getirisini hesaplar
Her varlığın oynaklığına bakarak toplam riski bulur
Yatırım yüzdelerimizin toplamının yüzde 100 edip etmediğini kontrol eder (etmelidir!)
Sahip olmadığımız varlıkları satmaya çalışmadığımızdan emin olur (negatif yüzdelere izin yok)
Sonunda tüm bu bilgileri tek bir skorda birleştirir. Daha yüksek skor daha iyi bir portföy demektir. Skor, daha yüksek getirilerle artar ama daha yüksek riskle azalır. Yüzdeler toplamı yüzde 100 etmezse veya negatif yüzdeler kullanmaya çalışırsak skor belirgin biçimde düşer.
Bu fonksiyon, aşağıdaki hill climbing algoritmasını kullanarak en iyi yatırım karmasını bulmamıza yardımcı olacak. Amaç fonksiyonunu tam olarak anlamasanız da sorun değil — önemli olan, belirli bir yatırım karmasının ne kadar iyi olduğunu söylemesi ve bizim de daha iyi kombinasyonlar bulmak için bunu kullanacak olmamız.
Şimdi, ağırlıklarda küçük ayarlamalar yaparak komşu portföy durumları üreten yeni bir fonksiyon tanımlayalım.
defget_neighbors(state):"""
Generates neighboring states by making small adjustments to portfolio weights
Args:
state (list): Current portfolio weights
Returns:
list: List of neighboring portfolio weight configurations
"""
neighbors =[]
step_size =0.01# Small adjustment to weights (1%)for i inrange(len(state)):for j inrange(len(state)):if i != j:# Transfer weight from asset i to asset j
neighbor = state.copy()if neighbor[i]>= step_size:# Only transfer if enough weight available
neighbor[i]-= step_size
neighbor[j]+= step_size
neighbors.append(neighbor)return neighborsAltyapı:
get_neighbors fonksiyonu, mevcut portföy ağırlıklarımızda küçük ayarlamalar yaparak benzer portföy dağılımları üreten hill climbing algoritmamızın kritik bir parçasıdır. Şöyle çalışır:
Portföyümüzdeki her varlık çifti için, bir varlıktan diğerine küçük bir miktar (%1) aktararak yeni bir portföy dağılımı oluşturur. Örneğin beş varlığımız varsa, şunları dener:
Varlık 1’den Varlık 2’ye %1 taşımak
Varlık 1’den Varlık 3’e %1 taşımak
Varlık 1’den Varlık 4’e %1 taşımak
Varlık 1’den Varlık 5’e %1 taşımak
Varlık 2’den Varlık 1’e %1 taşımak ve tüm olası çiftler için bu böyle sürer.
Fonksiyon, yalnızca kaynak varlığın yeterli payı varsa (en az %1) aktarım yapmamızı sağlayan bir güvenlik kontrolü içerir. Bu, gerçek bir portföyde mantıklı olmayan negatif ağırlıkları önler.
Bu küçük ayarlamaların her biri bir “komşu” oluşturur — mevcut olana çok benzeyen ama biraz farklı bir portföy dağılımı. Hill climbing algoritması daha sonra bu komşuları değerlendirecek ve daha iyi portföy dağılımları bulacaktır.
%1’lik adım boyutu, farklı dağılımları keşfetmek ile kontrollü değişiklikler yapmak arasında iyi bir denge sunar. Daha büyük bir adım boyutu, optimal çözümleri kaçırabilir; daha küçük bir adım boyutu ise aramayı aşırı yavaşlatır.
Şimdi, nihayet basit bir hill climbing algoritmasını uygulayalım:
defsimple_hill_climbing(initial_state, max_iterations=1000):"""
Implements Simple Hill Climbing algorithm
Args:
initial_state (list): Starting point for the algorithm
max_iterations (int): Maximum number of iterations to prevent infinite loops
Returns:
tuple: (best_state, best_value) found by the algorithm
"""
current_state = initial_state
current_value = objective_function(current_state)for _ inrange(max_iterations):# Get neighboring states
neighbors = get_neighbors(current_state)# Flag to check if we found a better neighbor
found_better =False# Check neighbors one by one (Simple Hill Climbing)for neighbor in neighbors:
neighbor_value = objective_function(neighbor)# If we find a better neighbor, move to it immediatelyif neighbor_value > current_value:
current_state = neighbor
current_value = neighbor_value
found_better =Truebreak# If no better neighbor was found, we've reached a peakifnot found_better:breakreturn current_state, current_valueAltyapı:
Fonksiyon, bir başlangıç durumundan hareketle, yerel bir maksimuma ulaşana ya da maksimum yineleme sayısına varana kadar daha iyi komşu durumlara yinelemeli olarak geçer.
Fonksiyon iki parametre alır:
initial_state: Optimizasyon için başlangıç noktası; değerler listesi olarak temsil edilir
max_iterations: Sonsuz döngüleri önlemek için güvenlik parametresi; varsayılan 1000 yineleme
Algoritma şu şekilde çalışır:
initial_state ile başlar ve onun amaç fonksiyonu değerini hesaplar
Her yinelemede şunları yapar:
get_neighbors() ile komşu durumları üretir
Her komşuyu tek tek değerlendirir
Daha iyi bir komşu (daha yüksek amaç değeri) bulur bulmaz o duruma geçer
Daha iyi komşu bulunamazsa yerel bir maksimuma ulaşılmıştır ve süreç sonlanır
Fonksiyon şu ikiliyi döndürür:
Bulunan en iyi durum (değerler listesi)
Bu durumun amaç fonksiyonu değeri
Hill climbing’in bu “basit” varyantı açgözlüdür — tüm komşuları değerlendirip en iyisini seçmek yerine, bulduğu ilk daha iyi komşuya hareket eder. Bu onu hızlı kılarken, daha kapsamlı bir aramayla bulunabilecek daha iyi çözümleri kaçırabilir.
Algoritma yerel en iyileri bulmak için kullanışlıdır ancak bu yerel maksimumlarda sıkışıp kalarak küresel maksimumu kaçırabilir. Bu sınırlamaya rağmen basitliği ve verimliliği nedeniyle popülerliğini korur.
Bunu örnek bir portföy üzerinde test edelim:
# Example usage
initial_state =[0.15,0.25,0.1,0.3,0.2]
best_state, best_value = simple_hill_climbing(initial_state)print(f"Initial State: {initial_state}")print(f"Best State Found: {best_state}")print(f"Best Value: {best_value}")[OUT]:
Initial State:[0.15,0.25,0.1,0.3,0.2]
Best State Found:[0.9700000000000006,0.009999999999999913,1.0408340855860843e-17,0.009999999999999858,0.009999999999999969]
Best Value:-0.1053000000000444Altyapı:
Çıktı, bir portföyü optimize ederken hill climbing algoritmamızın sonuçlarını gösterir. Beş varlık için rastgele ağırlıklardan başlayarak, amaç fonksiyonu değerini iyileştiren yeni bir ağırlık kümesi buldu. Bu çözüm başlangıç portföyüne göre gelişmiş olsa da, algoritma bulduğu ilk zirvede durduğu için yalnızca yerel bir optimum olabilir.
AI’de Hill Climbing Uygulamaları
Hill Climbing algoritmaları, yapay zekâ ve makine öğrenmesinin birçok alanında pratik uygulamalar bulur. Bazı temel uygulamaları inceleyelim:
1. Makine öğrenmesi model optimizasyonu
Hill climbing, makine öğrenmesi modellerini çeşitli şekillerde ayarlamaya yardımcı olur:
Özellik seçimi: Bir model için en iyi özellik alt kümesini bulma
Hiperparametre ayarı: Öğrenme oranı veya ağaç derinliği gibi model parametrelerini optimize etme
Sinir ağı eğitimi: Ağ ağırlıkları ve mimarisini ince ayarlama
Model sıkıştırma: Performansı korurken model boyutunu azaltma
Örneğin, kestirimsel bir model için özellik seçerken, Hill Climbing tüm özelliklerle başlayıp, model performansına göre özellikleri yinelemeli olarak çıkarıp ekleyebilir. Bu, doğruluk ile karmaşıklığı dengeleyen optimal bir özellik kümesi bulmaya yardımcı olur.
2. Robotik ve yol planlama
Robotikte hill climbing şu konularda yardımcı olur:
Hareket planlama: Fiziksel uzayda verimli yollar bulma
Eklemsel açı optimizasyonu: Robot kolları için en uygun konumları belirleme
Sensör konumlandırma: Maksimum kapsama için sensör yerleşimini optimize etme
Pil yönetimi: Güç tüketim kalıplarını optimize etme
Bir robot süpürge, oda kapsaması ve pil ömrüne göre rotasını sürekli ayarlayarak verimli temizlik yolları bulmak için hill climbing kullanabilir.
Metin özetleme: Özet içeriği seçimini optimize etme
Kelime gömme (embedding): Kelime vektör temsillerini ince ayarlama
Belge kümelendirme: Belgeleri en uygun gruplara ayırma
Arama motoru optimizasyonu: Arama sonucu sıralamalarını iyileştirme
Örneğin, metin özetlemede Hill Climbing, bilgi içeriğini en üst düzeye çıkarırken tekrarları en aza indirecek cümleleri seçmeye yardımcı olabilir.
4. Bilgisayarlı görü Görüntü işleme ve bilgisayarlı görüde
Görüntü bölütleme: Nesneler arasındaki en uygun sınırları bulma
Kamera kalibrasyonu: Daha iyi görüntü kalitesi için kamera parametrelerini ayarlama
Nesne tespiti: Sınırlayıcı kutu konumlarını optimize etme
Özellik eşleştirme: Görüntüler arasındaki karşılık gelen noktaları bulma
Bir yüz tanıma sistemi, ön işleme sırasında yüz özelliklerinin hizalamasını optimize etmek için hill climbing kullanabilir.
5. Oyun yapay zekâsı ve karar verme
Hill climbing şu konularda yardımcı olur:
Oyun stratejisi optimizasyonu: Tahta oyunlarında kazandıran hamleleri bulma
Kaynak tahsisi: Strateji oyunlarında kaynak dağılımını optimize etme
NPC davranışı: Oyuncu olmayan karakterlerin karar vermesini iyileştirme
Seviye üretimi: Dengeli ve ilgi çekici oyun seviyeleri oluşturma
Satranç motorları, oyun sırasında hamle dizilerini değerlendirmek ve optimize etmek için sıklıkla hill climbing varyantlarını kullanır.
6. İş ve operasyonlar
Pratik iş uygulamaları şunları içerir:
Tedarik zinciri optimizasyonu: Verimli teslimat rotaları bulma
Kaynak çizelgeleme: Personel vardiyaları veya makine kullanımını optimize etme
Portföy yönetimi: Yatırım portföylerini dengeleme
Stok yönetimi: Stok seviyelerini optimize etme
Bir teslimat şirketi, trafik kalıpları ve paket önceliklerine göre teslimat rotalarını sürekli optimize etmek için hill climbing kullanabilir.
Hill climbing her zaman mutlak en iyi çözümü bulamayabilir; ancak basitliği ve verimliliği onu bu gerçek dünya uygulamaları için değerli kılar. Özellikle şu durumlarda kullanışlıdır:
Hızlı çözümlere ihtiyaç duyulduğunda
Problem uzayı eksiksiz bir arama için fazla büyük olduğunda
Yaklaşık çözümler kabul edilebilir olduğunda
Çözüm uzayı nispeten pürüzsüz olduğunda
Daha iyi sonuçlar için algoritma diğer tekniklerle birleştirilebildiğinde
Sonuç
Hill climbing, yapay zekâda temel bir algoritma olarak, optimizasyon problemlerine doğrudan ama güçlü bir yaklaşım sunar.
İncelememiz boyunca, daha iyi çözümlere yinelemeli olarak ilerleme fikrinin; makine öğrenmesi, robotik, doğal dil işleme ve iş operasyonları gibi karmaşık zorluklara nasıl uygulanabildiğini gördük.
Algoritmanın yerel optimumlarda takılmak gibi sınırlamaları olsa da, rastgele başlatma ve benzetimli tavlama gibi stratejiler bu zorlukları etkili biçimde ele almak üzere geliştirilmiştir.
Yapay zekâ ilerlemeye devam ederken, hill climbing yalnızca pratik bir araç olarak değil, daha karmaşık optimizasyon algoritmalarını anlamak için bir basamak taşı olarak da önemini korur. Sezgisel doğası, AI alanına girenler için mükemmel bir başlangıç noktası yaparken, çok yönlülüğü gerçek dünya uygulamalarında kullanılmaya devam etmesini sağlar.
İster sinir ağı ağırlıklarını optimize ediyor, ister robot yolları planlıyor, ister yatırım portföyleri yönetiyor olun; hill climbing prensipleri, bilgisayarların zorlu problemlere sistematik biçimde daha iyi çözümler bulmasını nasıl sağladığına dair değerli içgörüler sunar.
Yapay zekâ ve arkasındaki algoritmalar hakkında daha fazla bilgi edinmek istiyorsanız, kaynaklarımıza göz atın:
Basit Hill Climbing ile En Dik Çıkış Hill Climbing arasındaki fark nedir?⌄
Basit Hill Climbing, bulduğu ilk daha iyi çözüme geçerken, En Dik Çıkış Hill Climbing (Steepest-Ascent) tüm komşu çözümleri değerlendirdikten sonra en iyisine geçer. Basit Hill Climbing daha hızlıdır ama daha iyi çözümleri kaçırabilir; En Dik Çıkış ise daha kapsamlıdır fakat yavaştır. Basit Hill Climbing’i bulduğunuz ilk yukarı giden patikayı almak, En Dik Çıkış’ı ise adım atmadan önce tüm olası patikaları kontrol edip en dik olanı seçmek gibi düşünebilirsiniz.
Hill Climbing yerel maksimumlarda sıkışmayı nasıl ele alır?⌄
Hill Climbing, yakında daha iyi bir çözüm olmadığında ama başka yerlerde daha iyi çözümler mevcut olduğunda “yerel maksimumlarda” (küçük tepeler) sıkışabilir. Bunu ele almak için Rastgele Başlatmalı Hill Climbing (birden çok rastgele noktadan başlamak) ve Benzetimli Tavlama (zaman zaman daha kötü çözümleri kabul etmek) gibi teknikler kullanılır. Bu stratejiler, algoritmanın çözüm uzayını daha fazla keşfetmesine ve daha iyi çözümler bulmasına yardımcı olur.
Diğer optimizasyon algoritmaları yerine ne zaman Hill Climbing kullanmalıyım?⌄
Hill Climbing şu durumlar için en uygundur: 1) Çözüm uzayı kademeli iyileşmelerle nispeten pürüzsüzse, 2) Hızlı yaklaşık çözümler kabul edilebilirse, 3) Problem uzayı eksiksiz arama için çok büyükse ve 4) Hesaplama kaynakları sınırlıysa. Hiperparametre ayarı, portföy optimizasyonu ve rota planlama gibi problemler için özellikle etkilidir. Ancak çok sayıda yerel optimum içeren karmaşık problemler için Genetik Algoritmalar veya Benzetimli Tavlama gibi daha gelişmiş algoritmaları düşünebilirsiniz.
Kendi spesifik problemim için Hill Climbing’i nasıl uygularım?
⌄
Sorununuz için Hill Climbing’i uygulamak üzere üç temel bileşeni tanımlamanız gerekir: 1) Çözümünüzü (durumu) nasıl temsil edeceğiniz, 2) Bir çözümün ne kadar iyi olduğunu değerlendiren bir amaç fonksiyonu ve 3) Komşu çözümler üretme yöntemi. Örneğin, portföy optimizasyonunda durum yatırım ağırlıklarıdır; amaç fonksiyonu getiri ile riski değerlendirir; komşular ise biraz farklı ağırlık dağılımlarıdır. Makalede, kendi kullanım durumunuza uyarlayabileceğiniz bir Python uygulaması sağlanmıştır.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Yapay zekanın temellerini keşfedin, yapay zekayı işinizde etkili bir şekilde kullanmayı öğrenin ve dinamik yapay zeka dünyasında yolunuzu bulmak için ChatGPT gibi modellere dalın.
OpenAI API, Hugging Face ve LangChain dahil olmak üzere en yeni yapay zeka geliştirici araçlarıyla yapay zeka destekli uygulamalar oluşturmayı öğrenin.
Hill climbing algoritması, yapay zekâ ve bilgisayar bilimlerinde en eski ve en basit optimizasyon algoritmalarından biridir. Artımlı iyileştirmeler yaparak çözümler bulan yerel arama (local search) algoritmaları kategorisine girer.
Algoritmanın adı faydalı bir benzetmeden gelir: Gözleri bağlı bir yürüyüşçünün bir tepenin zirvesine ulaşmaya çalıştığını hayal edin. Tüm manzarayı göremediği için yalnızca hemen çevresindeki zemini hissedebilir. Her adımda yukarıya götüren yöne ilerler. Bu, algoritmanın çalışma şekline benzer — yakın çözümleri değerlendirir ve daha iyilerine doğru yinelemeli olarak hareket eder, en iyi çözümü (tepenin zirvesini) bulmaya çalışır.
Bu yazıda, hill climbing algoritmasını, varyasyonlarını ve Python'da nasıl uygulanacağını ayrıntılı olarak inceleyeceğiz. Yapay zekâda yeniyseniz, temelleri kapsayan AI Fundamentals beceri yolumuzu mutlaka inceleyin.
Yapay Zekâda Hill Climbing Algoritması Nedir?
Hill climbing, bir dağın zirvesine ulaşmaya çalışan bir yürüyüşçü gibi, bilgisayarların mümkün olan en iyi cevabı bularak sorunları çözmesinin basit bir yoludur. Yapay zekâda (AI) çoğu zaman birçok olası seçenek arasından en iyi çözümü bulmamız gerekir. Buna optimizasyon denir.
"Sıcak-soğuk" oyunu oynarken en yüksek noktayı bulmaya çalıştığınızı düşünün. Bu oyunda yalnızca hareket ettikçe "ısındığınızı" (daha iyi) ya da "soğuduğunuzu" (daha kötü) kontrol edebilirsiniz. Hill climbing de aynı şekilde çalışır — yakındaki çözümlere bakar ve daha iyi olanlara doğru ilerler.
Basit adımlarla nasıl çalıştığı şöyle:
Örneğin bir robota yürümeyi öğretmeye çalışıyorsanız, Hill Climbing şunları yapabilir:
Hill climbing her zaman AI'deki en gelişmiş yöntem olmasa da, bilgisayarların tıpkı minimax algoritması gibi kendi başlarına nasıl problem çözebildiklerini anlamamıza yardımcı olan önemli bir yapı taşıdır.
Hill Climbing Algoritmalarının Türleri
Her biri en iyi çözümü arama biçimi farklı olan üç ana hill climbing türü vardır:
1. Basit hill climbing
Basit hill climbing, bulduğunuz ilk iyi adımı atmaya benzer. Bu sürümde:
2. En dik çıkış (steepest-ascent) hill climbing
Bu sürüm, basit hill climbing’den daha kapsamlıdır:
3. Stokastik hill climbing
Bu tür, aramayı daha etkili kılmak için biraz rastgelelik ekler:
Her türün kendi güçlü yanları vardır ve farklı problem türlerinde daha iyi çalışır. Basit hill climbing hızlı ama temel düzeydedir, en dik çıkış kapsamlıdır ama yavaştır, stokastik yaklaşım ise sıkışmayı önlemek için faydalı bir rastgelelik katar.
Hill Climbing Algoritması Nasıl Çalışır
Hill climbing algoritması, en iyi mümkün çözüme ulaşana kadar küçük iyileştirmeleri adım adım yaparak çalışır. Nasıl çalıştığını ana bölümlerine ayıralım.
1. Başlangıç
Her hill climbing algoritmasının bir başlangıç noktasına ihtiyacı vardır. Bunu bir dağda yürüyüşe nereden başlayacağınıza karar vermek gibi düşünün. Rastgele başlayabilir ya da problem hakkında bildiklerinizi kullanarak iyi bir başlangıç noktası seçebilirsiniz.
Nereden başladığınız gerçekten önemlidir — iyi bir nokta seçerseniz en iyi çözüme hızlıca ulaşabilirsiniz. Kötü bir nokta seçerseniz, dağın zirvesini bulmak yerine küçük bir tepede sıkışıp kalabilirsiniz.
Örneğin yapay sinir ağlarını eğitirken, başlangıç noktası nöronlar arasındaki bağlantıların ilk ağırlıklarını seçmek anlamına gelir. Bu ağırlıkları rastgele başlatabilirsiniz; bu, yürüyüşe dağın rastgele bir noktasından başlamak gibidir. Ya da ağ yapısına dayalı akıllı başlangıç ağırlıkları seçen Xavier başlatma gibi teknikler kullanabilirsiniz.
İyi bir başlatma, ağın daha hızlı öğrenmesine ve daha iyi çözümler bulmasına yardımcı olurken; kötü bir başlatma, doğruluğun düşük kalmasına ve hiç iyileşmemesine yol açabilir.
2. Yakındaki çözümlere bakma
Algoritma aramasına başladığında, mevcut konuma benzer komşu çözümleri değerlendirir. Bunu, yakın çevreyi küçük adımlarla keşfetmek gibi düşünün. Örneğin şehirler arası bir teslimat rotasını optimize etmeye çalışıyorsanız ve mevcut rotanız
[A -> B -> C -> D]ise, algoritma[A -> B -> D -> C]veya[A -> C -> B -> D]gibi benzer rotaları, toplam kat edilen mesafeyi azaltıp azaltmadıklarını görmek için inceler. Rotadaki her küçük değişiklik, mevcut olandan potansiyel olarak daha iyi olabilecek bir "komşu" çözümü temsil eder.Bu karşılaştırmaları yapmak için algoritma, her olası çözüme bir puan veya değer atayan, amaç fonksiyonu denilen şeye dayanır.
Bu fonksiyon bir pusula gibi davranır; algoritmanın hangi yönlerin daha iyi çözümlere doğru “yokuş yukarı”, hangilerinin “yokuş aşağı” olduğunu anlamasına yardımcı olur. Bir teslimat rotası için amaç fonksiyonu toplam kat edilen mesafeyi hesaplar — daha kısa toplam mesafe daha iyi bir çözüm demektir.
Dolayısıyla X rotası 100 mil sürüyor, Z rotası 90 mil sürüyorsa, B rotası daha iyi (daha düşük) bir puana sahip olur. Algoritma böylece B rotasına benzer çözümler yönünde ilerlemesi gerektiğini bilir. Amaç fonksiyonu, rota optimizasyonu gibi karmaşık bir problemi karşılaştırıp en aza indirgenebilen basit bir sayıya dönüştürür.
3. Sonraki adımı seçme
Yakın çözümlere baktıktan sonra, algoritmanın bir sonraki hamleyi belirlemesi gerekir. Algoritma, yakın çözümlerin puanlarını mevcut çözümle karşılaştırır. Daha iyi bir çözüm bulursa oraya geçer. Hill climbing’in farklı sürümleri bu seçimi farklı şekillerde yapar:
4. Ne zaman duracağını bilme
Algoritma, daha iyi çözümler aramayı ne zaman bırakacağını bilmelidir. Genellikle şu durumlardan biri gerçekleştiğinde durur:
Algoritma çalışırken genellikle bir desen izler. Başta hızlıca daha iyi çözümler bulur; bu, dik bir yokuşta büyük adımlar atmaya benzer. Sonra zirveye yaklaştıkça yavaşlar, küçük iyileştirmeler yapar ve sonunda durur.
Bazen yol düz ve nettir; bazen de iniş çıkışlarla dolu, daha zorlu olabilir.
AI’de Hill Climbing’in Avantajları ve Sınırlamaları
Hill climbing’in ne işe yaradığını ve kullanırken ne tür sorunlarla karşılaşabileceğinizi inceleyelim.
Avantajlar
Hill climbing, anlaşılması ve programlanması en kolay optimizasyon algoritmalarından biridir. Temel bir kuralı izler: “Daha iyiyse, oraya git.” Bu, birçok problemi çözmek için iyi bir başlangıç noktası yapar.
Problem net olduğunda, hill climbing iyi çözümleri hızlıca bulabilir. Her olası çözümü araştırmakla vakit kaybetmez — sadece yukarı giden yolu takip eder.
Algoritma fazla bellek veya işlem gücü gerektirmez. Nerede olduğunu hatırlaması ve yakın çözümlere bakması yeterlidir; bu da onu birçok gerçek dünya problemi için pratik kılar.
Sınırlamalar
Elbette, her yöntemde olduğu gibi bazı potansiyel dezavantajlar vardır:
1. Küçük tepelerde takılmak
Hill climbing’in en büyük problemi, “yerel maksimumlar”da takılabilmesidir — yakında bir dağ olmasına rağmen küçük tepelere benzerler. Algoritma küçük bir tepenin zirvesine ulaştığında, çevresindeki her şey daha alçak olduğu için durur; oysa başka yerlerde çok daha iyi çözümler olabilir.
2. Düz zemin problemi
Bazen algoritma, yakındaki tüm çözümlerin eşit derecede iyi olduğu düz bir zeminde (plateau) kalır. Düz bir futbol sahasında yürürken en yüksek noktayı bulmaya çalıştığınızı hayal edin — hangi yöne gideceğinizi bilmek zordur!
3. Sırt (ridge) problemi
Dar bir dağ sırtının üzerinde yürümeye çalıştığınızı düşünün. Algoritma, zirveye doğru ilerlemek yerine sırt üzerinde sağa sola zigzag yaparak zaman kaybedebilir. Bunun nedeni, yana atılan her adımın, rotada kalmak kadar iyi görünmesidir.
4. Başlangıç noktası çok önemlidir
Nereden başladığınız, algoritmanın ne kadar iyi çalıştığını büyük ölçüde etkiler. Bu bir yürüyüşe başlamak gibidir — yanlış yerden başlarsanız, en yüksek zirveyi asla bulamayabilirsiniz.
Bu sınırlamalar, hill climbing’in kötü bir seçim olduğu anlamına gelmez — sadece onu ne zaman ve nasıl kullanacağımız konusunda dikkatli olmamız gerektiği anlamına gelir. Bazen bu sorunların üstesinden gelmek için onu diğer tekniklerle birleştirebiliriz; bir sonraki bölümde bunu tartışacağız.
Sınırlamaların Üstesinden Gelme Stratejileri
Hill climbing kullanırken, daha önce tartıştığımız sorunları çözmek için birkaç akıllı strateji uygulayabiliriz. Hill climbing’i daha etkili kılan iki ana yaklaşımı inceleyelim.
Rastgele başlatmalı (random-restart) hill climbing
Küçük tepelerde sıkışmayı önlemenin en iyi yollarından biri, farklı başlangıç noktalarından tırmanmayı denemektir. Bu yaklaşıma rastgele başlatmalı hill climbing denir ve tam da göründüğü gibi çalışır — sıkışırsanız, yeni bir yerde yeniden başlarsınız.
Sisli bir sıradağda en yüksek dağı bulmaya çalıştığınızı düşünün. Karşınıza çıkan ilk tepeyi tırmanıp zirvesine ulaşırsanız, yakındaki çok daha yüksek bir dağı kaçırabilirsiniz. Ama farklı noktalara ışınlanıp tekrar tırmanmaya başlasaydınız, en yüksek zirveyi bulma şansınız çok daha yüksek olurdu.
Nasıl çalışır: Önce normal hill climbing algoritmasını, sıkışana kadar çalıştırırsınız. Vazgeçmek yerine, bulduğunuz en iyi çözümü kaydeder ve sonra rastgele yeni bir noktadan tekrar başlarsınız. Bunu birkaç deneme boyunca sürdürür, sonunda tüm denemeleriniz arasından en iyi çözümü seçersiniz.
Rastgele başlatmanın güzelliği basit ama etkilidir. Her yeniden başlatma size en yüksek zirveyi bulmak için yeni bir şans verir. Normal hill climbing’den daha fazla zaman alsa da, en iyi çözümü bulma olasılığı çok daha yüksektir.
Benzetimli tavlama (simulated annealing)
Teknik olarak hill climbing olmasa da, benzetimli tavlama hill climbing’in birçok sorununu çözmeye yardımcı olan akıllı bir varyasyondur. Metal işçiliğinde metallerin soğuyup sertleşmesinden esinlenmiştir. Metal yavaşça soğuduğunda atomlar daha iyi konumlar bulur ve metal daha sağlam hale gelir.
Bu yaklaşımda, algoritma özellikle başlangıçta zaman zaman bilerek daha kötü çözümleri kabul eder. Zaman geçtikçe, kabul ettiği çözümler konusunda daha seçici hale gelir. Bu, engebeli bir zeminde zıplayan bir topa benzer — başta tepeciklerin üzerinden zıplayacak kadar enerjisi vardır, fakat enerji kaybettikçe iyi bir noktaya yerleşir.
Nasıl çalışır: Başlangıçta, algoritma mevcut çözümden daha kötü bir çözümü nispeten yüksek bir olasılıkla kabul edebilir. Bu olasılık iki şeye bağlıdır: yeni çözümün ne kadar daha kötü olduğu ve algoritmanın ne kadar süredir çalıştığı. Zamanla, daha kötü çözümleri kabul etme olasılığı azalır ve sonunda normal Hill Climbing gibi davranır.
Benzetimli tavlamanın asıl gücü, özellikle aramanın başlarında küçük tepelerden ve düz alanlardan kaçabilmesidir. Bazen daha kötü çözümleri kabul ederek şunları yapabilir:
Örneğin, bir odadaki mobilyaları alanı en üst düzeye çıkaracak şekilde düzenlemeye çalıştığınızı hayal edin. Bir sandalyeyi hareket ettirmek geçici olarak odayı daha sıkışık hale getirebilir, ancak sonrasında diğer parçaları çok daha iyi konumlara taşımanıza olanak tanıyabilir. Benzetimli tavlama, özellikle sürecin başında bu geçici olarak daha kötü düzenlemeleri denemeye istekli olur ve böylece en iyi genel düzeni bulabilir.
Bu stratejiler, bazen bir problemi çözmenin en iyi yolunun her zaman bariz adımı atmak olmadığını gösterir. Rastgelelik ve kontrollü kaosu ekleyerek, çoğu zaman düz yolun her zaman seçilmesinden daha iyi çözümlere ulaşabiliriz.
Python’da Basit Bir Hill Climbing Algoritması Uygulama
Artık hill climbing’i rastgele başlatma ve benzetimli tavlama gibi stratejilerle nasıl geliştireceğimizi anladığımıza göre, bunu gerçek bir finansal probleme uygulayalım: portföy optimizasyonu.
Portföy optimizasyonu, yatırımcıların paralarını farklı yatırımlar arasında nasıl dağıtacaklarına karar vermelerine yardımcı olur. Yatırımcılar bir portföy oluştururken, risklerini düşük tutarken mümkün olan en yüksek getiriyi elde etmek isterler. Bu dengeyi bulmak zordur — birçok malzemeli mükemmel bir tarif bulmaya benzer.
1952’de Harry Markowitz adlı bir iktisatçı bu soruna akıllı bir çözüm buldu. Yatırımcıların, birlikte hareket etmeyen yatırımları karıştırarak risklerini azaltabileceklerini gösterdi. Buna çeşitlendirme denir — tüm yumurtaları tek sepete koymamaya benzer.
Bir portföy oluştururken üç ana şeyi çözmemiz gerekir:
Hill Climbing bu problem için iyi çalışır çünkü paramızı bölüşme biçimimizdeki küçük değişiklikler, genellikle portföy performansında küçük değişikliklere yol açar. Paranızın yatırılabileceği her yolu temsil eden pürüzsüz bir tepe hayal edin. Daha yüksek noktalar daha iyi yatırım tercihlerini gösterir.
Hill Climbing ile iyi bir portföy bulmak için şunları yapacağız:
Hill climbing’i bu şekilde kullanarak, yatırımcılara milyonlarca olası kombinasyon arasından daha iyi portföyler bulmalarında yardımcı olabiliriz. Bu, riski ve getiriyi iyi dengeleyen farklı yatırım karmalarını hızla test edebilen akıllı bir yardımcıya sahip olmak gibidir.
Öncelikle, beklenen getirileri riskle dengeleyen bir portföy performansı ölçüsü olan amaç fonksiyonumuzu tanımlayalım. Bu fonksiyon, girdi olarak portföy ağırlıklarının bir listesini alır ve daha yüksek puanların daha iyi portföyleri gösterdiği bir skor döndürür.
objective_functionyukarıda, belirli bir yatırım portföyünün ne kadar iyi olduğunu değerlendirmemize yardımcı olur. Nasıl çalıştığını şöyle özetleyebiliriz:Önce, paramızı farklı varlıklara (hisse senedi veya tahvil gibi) ne oranda yatırmak istediğimizi temsil eden bir sayı listesi alır. Örneğin beş varlığımız varsa, her birine yüzde 20 yatırabiliriz.
Fonksiyon iki önemli bilgiyi kullanır:
Fonksiyon ardından şunları yapar:
Sonunda tüm bu bilgileri tek bir skorda birleştirir. Daha yüksek skor daha iyi bir portföy demektir. Skor, daha yüksek getirilerle artar ama daha yüksek riskle azalır. Yüzdeler toplamı yüzde 100 etmezse veya negatif yüzdeler kullanmaya çalışırsak skor belirgin biçimde düşer.
Bu fonksiyon, aşağıdaki hill climbing algoritmasını kullanarak en iyi yatırım karmasını bulmamıza yardımcı olacak. Amaç fonksiyonunu tam olarak anlamasanız da sorun değil — önemli olan, belirli bir yatırım karmasının ne kadar iyi olduğunu söylemesi ve bizim de daha iyi kombinasyonlar bulmak için bunu kullanacak olmamız.
Şimdi, ağırlıklarda küçük ayarlamalar yaparak komşu portföy durumları üreten yeni bir fonksiyon tanımlayalım.
get_neighbors fonksiyonu, mevcut portföy ağırlıklarımızda küçük ayarlamalar yaparak benzer portföy dağılımları üreten hill climbing algoritmamızın kritik bir parçasıdır. Şöyle çalışır:
Portföyümüzdeki her varlık çifti için, bir varlıktan diğerine küçük bir miktar (%1) aktararak yeni bir portföy dağılımı oluşturur. Örneğin beş varlığımız varsa, şunları dener:
Fonksiyon, yalnızca kaynak varlığın yeterli payı varsa (en az %1) aktarım yapmamızı sağlayan bir güvenlik kontrolü içerir. Bu, gerçek bir portföyde mantıklı olmayan negatif ağırlıkları önler.
Bu küçük ayarlamaların her biri bir “komşu” oluşturur — mevcut olana çok benzeyen ama biraz farklı bir portföy dağılımı. Hill climbing algoritması daha sonra bu komşuları değerlendirecek ve daha iyi portföy dağılımları bulacaktır.
%1’lik adım boyutu, farklı dağılımları keşfetmek ile kontrollü değişiklikler yapmak arasında iyi bir denge sunar. Daha büyük bir adım boyutu, optimal çözümleri kaçırabilir; daha küçük bir adım boyutu ise aramayı aşırı yavaşlatır.
Şimdi, nihayet basit bir hill climbing algoritmasını uygulayalım:
Fonksiyon, bir başlangıç durumundan hareketle, yerel bir maksimuma ulaşana ya da maksimum yineleme sayısına varana kadar daha iyi komşu durumlara yinelemeli olarak geçer.
Fonksiyon iki parametre alır:
initial_state: Optimizasyon için başlangıç noktası; değerler listesi olarak temsil edilirmax_iterations: Sonsuz döngüleri önlemek için güvenlik parametresi; varsayılan 1000 yinelemeAlgoritma şu şekilde çalışır:
initial_stateile başlar ve onun amaç fonksiyonu değerini hesaplarget_neighbors()ile komşu durumları üretirFonksiyon şu ikiliyi döndürür:
Hill climbing’in bu “basit” varyantı açgözlüdür — tüm komşuları değerlendirip en iyisini seçmek yerine, bulduğu ilk daha iyi komşuya hareket eder. Bu onu hızlı kılarken, daha kapsamlı bir aramayla bulunabilecek daha iyi çözümleri kaçırabilir.
Algoritma yerel en iyileri bulmak için kullanışlıdır ancak bu yerel maksimumlarda sıkışıp kalarak küresel maksimumu kaçırabilir. Bu sınırlamaya rağmen basitliği ve verimliliği nedeniyle popülerliğini korur.
Bunu örnek bir portföy üzerinde test edelim:
Çıktı, bir portföyü optimize ederken hill climbing algoritmamızın sonuçlarını gösterir. Beş varlık için rastgele ağırlıklardan başlayarak, amaç fonksiyonu değerini iyileştiren yeni bir ağırlık kümesi buldu. Bu çözüm başlangıç portföyüne göre gelişmiş olsa da, algoritma bulduğu ilk zirvede durduğu için yalnızca yerel bir optimum olabilir.
AI’de Hill Climbing Uygulamaları
Hill Climbing algoritmaları, yapay zekâ ve makine öğrenmesinin birçok alanında pratik uygulamalar bulur. Bazı temel uygulamaları inceleyelim:
1. Makine öğrenmesi model optimizasyonu
Hill climbing, makine öğrenmesi modellerini çeşitli şekillerde ayarlamaya yardımcı olur:
Örneğin, kestirimsel bir model için özellik seçerken, Hill Climbing tüm özelliklerle başlayıp, model performansına göre özellikleri yinelemeli olarak çıkarıp ekleyebilir. Bu, doğruluk ile karmaşıklığı dengeleyen optimal bir özellik kümesi bulmaya yardımcı olur.
2. Robotik ve yol planlama
Robotikte hill climbing şu konularda yardımcı olur:
Bir robot süpürge, oda kapsaması ve pil ömrüne göre rotasını sürekli ayarlayarak verimli temizlik yolları bulmak için hill climbing kullanabilir.
3. Doğal dil işleme
NLP uygulamaları şunları içerir:
Örneğin, metin özetlemede Hill Climbing, bilgi içeriğini en üst düzeye çıkarırken tekrarları en aza indirecek cümleleri seçmeye yardımcı olabilir.
4. Bilgisayarlı görü Görüntü işleme ve bilgisayarlı görüde
Bir yüz tanıma sistemi, ön işleme sırasında yüz özelliklerinin hizalamasını optimize etmek için hill climbing kullanabilir.
5. Oyun yapay zekâsı ve karar verme
Hill climbing şu konularda yardımcı olur:
Satranç motorları, oyun sırasında hamle dizilerini değerlendirmek ve optimize etmek için sıklıkla hill climbing varyantlarını kullanır.
6. İş ve operasyonlar
Pratik iş uygulamaları şunları içerir:
Bir teslimat şirketi, trafik kalıpları ve paket önceliklerine göre teslimat rotalarını sürekli optimize etmek için hill climbing kullanabilir.
Hill climbing her zaman mutlak en iyi çözümü bulamayabilir; ancak basitliği ve verimliliği onu bu gerçek dünya uygulamaları için değerli kılar. Özellikle şu durumlarda kullanışlıdır:
Sonuç
Hill climbing, yapay zekâda temel bir algoritma olarak, optimizasyon problemlerine doğrudan ama güçlü bir yaklaşım sunar.
İncelememiz boyunca, daha iyi çözümlere yinelemeli olarak ilerleme fikrinin; makine öğrenmesi, robotik, doğal dil işleme ve iş operasyonları gibi karmaşık zorluklara nasıl uygulanabildiğini gördük.
Algoritmanın yerel optimumlarda takılmak gibi sınırlamaları olsa da, rastgele başlatma ve benzetimli tavlama gibi stratejiler bu zorlukları etkili biçimde ele almak üzere geliştirilmiştir.
Yapay zekâ ilerlemeye devam ederken, hill climbing yalnızca pratik bir araç olarak değil, daha karmaşık optimizasyon algoritmalarını anlamak için bir basamak taşı olarak da önemini korur. Sezgisel doğası, AI alanına girenler için mükemmel bir başlangıç noktası yaparken, çok yönlülüğü gerçek dünya uygulamalarında kullanılmaya devam etmesini sağlar.
İster sinir ağı ağırlıklarını optimize ediyor, ister robot yolları planlıyor, ister yatırım portföyleri yönetiyor olun; hill climbing prensipleri, bilgisayarların zorlu problemlere sistematik biçimde daha iyi çözümler bulmasını nasıl sağladığına dair değerli içgörüler sunar.
Yapay zekâ ve arkasındaki algoritmalar hakkında daha fazla bilgi edinmek istiyorsanız, kaynaklarımıza göz atın: