Min / maks'i sıra tabanlı bir strateji oyununa başarıyla uygulamak için mevcut tüm satranç tekniklerini doğru bir şekilde uygulamanız gerekir ...
Değerlendirme fonksiyonu
Değerlendirme fonksiyonlarınız kötü ise, satranç motorları bile çok kötü bir güce sahiptir. Bir değerlendirme fonksiyonunun en basit versiyonu: 1 = beyaz ile kazanılan oyun, -1 = siyahla kazanılan oyun, 0 = diğer tüm durumlar; Ancak, bu size çok kötü bir performans verecektir. Aynı şey sıra tabanlı oyununuza da oluyor! Eğer satrançta olduğu gibi min / max (alfa / beta budama ve eşyalar ile) kullanmak istiyorsanız, makul bir değerlendirme fonksiyonu da uygulamalısınız! Aksi takdirde, strateji oyununuza uygulandığında bu algoritmaların performansını satranç için geçerli olan durumla karşılaştıramazsınız.
Satranç motorlarının değerlendirme işlevleri ne yapar:
- Bir parçanın tahtadaki konumu ne kadar iyi?
- Bir parça kaç kez saldırıya uğruyor?
- Parça kaç kez korunur?
- Her parça tahtada serbestçe "hareket edebilir". (veya: Kaç fayans "kontrol eder")
Değerlendirme fonksiyonunun bu bölümleri önce oyununuza "çevrilmelidir":
- Parçanın konumu: Örneğin, atış menzilini genişleten bir tepe üzerinde mi?
- Saldırı: Her bir parça ne kadar tehlikede? (örneğin, özel bir birime saldırabilecek bir olasılıkla çarpılan birimlerin saldırı değerlerinin toplamı; birim zaten hasar görmüşse olasılık artar; diğer birçok birim saldıran birim aralığındaysa azalır)
- Kendi Saldırı: Bu birimlerden kaç tane saldırı yapılabilir?
- Koruma: Yanında ne kadar kendi parçası var (yardım etmek için)? Belki de bir birim minimum mesafenin altındaki birimlere saldıramayabilir ve yakın birimlere saldırma imkanına sahip birimle onu korumak tercih edilebilir.
- Mobilite: Üniteniz ne kadar hareketli? (kaçabilir mi?)
Farklı birimler, tüm birimler için ağırlıklandırma fonksiyonu (factor_a * rating_a + factor_b * ranting_b + ...) ile özetlenmelidir ...
Strateji oyunlarında ayrıca kalan kaynaklar (altın, ahşap, ...) dikkate alınmalıdır.
Değerlendirme fonksiyonunuz yeterince iyiyse, çoğu durumda ağaçta gerçekten "derin" arama yapmanız gerekmez. Bu yüzden muhtemelen sadece en umut verici 3 veya 10 seçeneğe daha yakından bakmanız gerekir. Sonraki bölüme bakın ...
Her pozisyonda olası hamleler
Strateji oyunları için min / max kullanmanın en sorunlu yanı, bir turda birden fazla birime komut verebilmenizdir, oysa satrançta sadece bir birime komut vermenize izin verilir (castling hariç, ancak bu açıkça tanımlanmış bir hareket kombinasyonudur). Bu, her bir birim için yalnızca "kuzey, güney, batı, doğu VEYA dur" arasında karar verirseniz, her "pozisyon" (satranç terimi) için N birimler için 5 ^ N olası harekete neden olur. Karmaşık komutu düşük seviyeli komutlara ayırarak bunu çözebilirsiniz: örn. Ünite A için eylem seçin, derinlemesine gidin ve ünite B'ye karar verin .... ünite N'ye karar verin ... ve sonra bu dönüşü sonlandırın. Ancak, bu tek başına karmaşıklığı değiştirmez! Eylemlerin birimlere atanma sırasını en iyi duruma getirmelisiniz (örneğin ilk birim B, C, D ve sonra birim A). Son hesaplama sırasında her birim için kararın etkisini kaydedebilir ve daha sonra önem derecesine göre sıralayabilirsiniz. Bu şekilde alfa-beta budama, arama ağacından herhangi bir kötü kombinasyonu kesmek için çok erken kullanılabilir. En yüksek öncelik, her yinelemede "daha fazla bir şey yapmayın ve sıranızı sonlandırın" (boş hareket budaması) olmalıdır. Bu şekilde çoğu üniteye birçok görev atamayı "atlayabilir" ve daha önce yaptıklarına devam etmelerine izin verebilirsiniz. Bu şekilde arama, sadece "kritik" birimlere (örneğin şu anda gerçekten savaşta olanlara) bir göz atarak hızlı bir şekilde derinlere inecektir. Her birime yalnızca bir kez komut verdiğinizden emin olun ... "Önemli" birimlerin de zaman zaman bir komut aldığından emin olmak için bazı rasgelelikler de kullanabilirsiniz. Özellikle, bir işi bitiren birimler (ör.
Yinelemeli Derinleşme + Önbellekleme / Karma Tablosu
Daha sonra, bir süre sınırına ulaşılana kadar derinlemesine gitmek için "interaktif derinleşme" yapabilirsiniz. Böylece daha az birim varsa daha derinlemesine arama yaparsınız ve daha iyi bir çözüm aramayı bırakırsanız her zaman bir "sonuç" elde edersiniz. Yinelemeli derinleştirme, eski arama sonuçlarını önbelleğe almak için bir karma tablo kullanılmasını gerektirir. Bu aynı zamanda son dönüş aramasından (arama ağacının son dönüşte gerçekte yürütülen komutları kapsayan dalı) bazı sonuçların yeniden kullanılmasını sağlar. Bunu uygulamak için, yinelemeli olarak güncellenebilen çok iyi bir karma işlevine ("zobrist anahtarına göz atın") ihtiyacınız vardır. Karma anahtarını güncellemek, eski "konumun" karma anahtarını alabileceğiniz ve yalnızca konumdaki değişikliği (ör. üniteyi x konumunda alın ve y) konumuna getirin. Bu şekilde hash anahtarını hesaplamak hızlıdır ve sadece karmanın bu konum için eski bir giriş içerip içermediğini kontrol etmek için tüm panoların durumunu işlemeniz gerekmez. Bir şekilde karma çarpışmaların gerçekleşmediğinden emin olmalısınız.
Deterministik Olmayan Davranış
Deterministik olmayan davranış min / maks aramalar için bir problemdir. Bu, saldırıya uğramış bir hedefi vuracağınızdan emin değilsiniz (örneğin olasılık% 10'dur). O zaman sadece bunun olmasını planlayamazsınız. Bu durumda algoritmayı değiştirmeniz ve arasına bir "olasılık" katmanı koymanız gerekir. Biraz "olasılıklar döner" gibi. Her bağımsız sonuç ayrı ayrı dikkate alınmalıdır. Bu derinlik "katmanı" yoluyla değerlendirme daha sonra örneklenmelidir (monte carlo örneklemesi) ve derinlemesine değerlendirmenin sonucu oluşma olasılığı ile ağırlıklandırılmalıdır. Olasılık katmanının farklı sonuçları farklı karşıt hareketler olarak değerlendirilmelidir (ancak min / maks yerine "ortalama" hesaplanmalıdır). Bu elbette arama ağacının karmaşıklığını artıracaktır.
özet
Tüm bu teknikleri (mevcut satranç motorları tarafından kullanılan) deterministik bir oyuna uygularken, kesinlikle bir oyun için de makul sonuçlar elde edebileceksiniz. Deterministik olmayan oyunlar için bu muhtemelen daha karmaşık olacaktır, ancak yine de yönetilebilir olduğunu düşünüyorum.
Bu tekniklerin (satranç için) açıklanması için iyi bir kaynak http://chessprogramming.wikispaces.com/
Min / maks aramalarda bir tür yönlendirilmiş rastgele uygulama bile uygulayabilirsiniz. Her yinelemede ilk önce en iyi sonuçları kararlı bir şekilde araştırmak yerine, bunu rastgele seçebilir ve mevcut değerlendirmelere dayanan bir olasılık dağılımı ile sırasına karar verebilirsiniz ...