İçindekiler
Bir karakter düşünün: Karnı aç, uykusu var, ama komşusuyla dedikodu yapmayı da bırakamıyor. Simülasyon oyunlarını eğlenceli kılan tam olarak bu küçük çelişkilerdir. The Sims benzeri oyunlarda karakterler, yalnızca hazır animasyonlar oynatan kuklalar değildir; ihtiyaçları, çevresel fırsatları ve karar kuralları sayesinde yaşayan bir mahalle izlenimi yaratırlar.
``
Yapay yaşam: Bilinç değil, etkileşim
Yapay yaşam, canlı sistemlerin bazı özelliklerini hesaplamalı modellerle yeniden üretmeyi amaçlar. Oyunlarda bunun karşılığı; ihtiyaçları değişen, çevresini algılayan ve eylemlerinin sonuçlarından etkilenen ajanlardır. Buradaki ajan, kendi durumunu taşıyan bir karakterdir.
İnandırıcılık için insan zihnini bütünüyle simüle etmek gerekmez. Basit kuralların birleşmesiyle ortaya çıkan davranışlar üretilebilir: Aynı buzdolabına yönelen iki karakterden biri bekler, diğeri sohbet eder. Küçük bir kaynak çatışması, oyuncunun gözünde komik bir hikâyeye dönüşür.
Aşağıdaki model, bu yaklaşımı öğretmek içindir; The Sims’in gerçek kaynak kodunun birebir açıklaması değildir.
İhtiyaçları sayılara çevirmek
Her ihtiyacı $n_i$ ile gösterelim. Değerler sıfır ile bir arasında olsun: Sıfır, ihtiyaç karşılanmış; bir, ciddi eksiklik demektir. Böylece açlık ve enerji eksikliği aynı ölçekte karşılaştırılabilir.
| İhtiyaç eksikliği | Zamanla değişim | Azaltan eylem |
|---|---|---|
| Açlık | Genellikle yükselir | Yemek yemek |
| Enerji | Uyanıkken yükselir | Uyumak |
| Sosyallik | Yalnızlıkla yükselir | Sohbet etmek |
Basit bir zaman güncellemesi şöyle yazılır:
\[n_i(t+h)=\min(1,n_i(t)+r_i h)\]Burada $h$ geçen süre, $r_i$ ise saniye başına artış hızıdır. Eylem tamamlandığında ilgili eksiklik azaltılır ve değer sıfırın altına düşmeyecek şekilde sınırlandırılır. Gerçek projelerde uyku gibi uzun eylemlerin etkisini tamamlanma anında değil, zaman boyunca uygulamak daha doğal sonuç verir.
Karar vermek: En faydalı eylem hangisi?
Utility AI, uygulanabilir eylemlere fayda puanı vererek seçim yapar. Basit bir puanlama kullanabiliriz:
\[U(a)=\sum_i w_i n_i\min(n_i,d_i(a))-\lambda T(a)\]$w_i$ ihtiyacın önemini, $d_i(a)$ eylemin sağlayacağı azalmayı, $T(a)$ süresini temsil eder. Minimum işlemi, zaten karşılanmış bir ihtiyaca gereğinden fazla fayda yazılmasını önler. Süre cezası ise uzak mutfağa yürümek gibi maliyetleri hesaba katabilir.
| Yaklaşım | Güçlü yanı | Zorlandığı nokta |
|---|---|---|
| Sabit öncelikler | Kolay uygulanır | Davranışlar tekrara düşebilir |
| Sonlu durum makinesi | Geçişler nettir | Çok ihtiyaçta karmaşıklaşır |
| Utility AI | Öncelikler dinamik değişir | Puanları dikkatle ayarlamak gerekir |
Python ile küçük bir karar motoru
Aşağıdaki örnek, önceden uygulanabilir olduğu belirlenmiş eylemler arasından seçim yapar. Karakterin mevcut eylemini değiştirmek için küçük bir avantaj eşiği kullanır:
from dataclasses import dataclass
@dataclass
class Action:
name: str
relief: dict[str, float]
seconds: float
weights = {"hunger": 1.4, "energy": 1.2, "social": 0.8}
needs = {"hunger": 0.8, "energy": 0.5, "social": 0.3}
actions = [
Action("yemek", {"hunger": 0.6}, 8),
Action("uyumak", {"energy": 0.7}, 30),
Action("sohbet", {"social": 0.5}, 12),
]
def score(action):
benefit = sum(
weights[key] * needs[key] * min(needs[key], relief)
for key, relief in action.relief.items()
)
return benefit - 0.002 * action.seconds
def choose(available, current_name=None):
if not available:
return None
best = max(available, key=score)
current = next(
(a for a in available if a.name == current_name), None
)
if current and score(best) < score(current) + 0.05:
return current
return best
print(choose(actions).name)
Action, eylemin etkisini ve süresini taşır. score, ihtiyaçlarla faydayı eşleştirir; choose ise en yüksek puanı seçer. Örnekte yemek kazanır. Eşik sayesinde karakter, puanlar birbirine yakınken sürekli fikir değiştirmez. Bu teknik histerezis olarak bilinir. Yine de mevcut eylem geçersizleşirse korunmaz; karar motoru başka bir seçenek arar.
Mahalleye hayat veren ayrıntılar
Puanlama tek başına yeterli değildir. Eylem adayları üretilirken nesnenin erişilebilirliği, kullanım kapasitesi ve yol bulma sonucu kontrol edilmelidir. Tuvaleti iki karakter aynı anda kullanmaya çalışıyorsa bir rezervasyon sistemi gerekir; yoksa dijital eviniz trafik kazasına döner.
Kişilik, ağırlıkları değiştirerek davranış çeşitliliği sağlar. Dışa dönük bir karakter sosyalliğe daha çok önem verebilir. İlişkiler, sohbetin beklenen faydasını; ruh hâli, eylem tercihlerini etkileyebilir. Bunlar rastgelelikten daha tutarlı farklılıklar üretir.
Son olarak aç kalma süresi, eylem değiştirme sıklığı ve nesne önündeki kuyrukları ölçün. Zaman adımını değiştirince davranışlar bozuluyorsa modeli yeniden ayarlayın. Başarılı yapay yaşam, en karmaşık algoritma değil; oyuncunun anlamlandırabildiği, tutarlı ama şaşırtıcı küçük hikâyeler üreten sistemdir.
Yorumlar