Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Kütüphane için yazara çok teşekkürler!
Üst arama fonksiyonunun döngüsüne "cnt++;" satırını ekleyin, aksi takdirde sonsuz bir döngüye girebilir!
Gerçekten de, bazı durumlarda, popülasyonda yalnızca bir birey olduğunda döngünün sonsuz hale gelebileceği bir durum olabilir.
Gönderi için teşekkürler, kısa süre içinde değişiklikleri yapacağım.
Not: Büyük olasılıkla, cnt++ eklemeyi unuttum, sonuçta bu değişkeni bu yüzden girdim. :)
Döngüyü for() operatörü ile yapma isteğimi hatırlıyorum, böylece farklı ebeveynleri aramanın "kalıcılığını" düzenlemek mümkün olacaktı, ama sonra fikrimi değiştirdim, bunda pek bir anlam görmedim.
@joo Kütüphanenizi Ishimoku, MAKD vb. göstergelerin parametrelerinin seçimi için kullanmak mümkün mü?
"Hangi tüccarın optimizasyon görevleri için kütüphaneyi kullanmak imkansızdır?" Diye sorduysanız. - o zaman ne cevap vereceğimi bilemem.
Elbette verebilirsiniz.
"Hangi tüccarın optimizasyon görevleri için kütüphaneyi kullanmak imkansızdır?" diye sorsaydınız. - o zaman ne cevap vereceğimi bilemem.
Elbette verebilirsiniz.
Aptalca bir soru için özür dilerim, ben bir programcı değilim. Mümkünse, çalışmasının netliği için lütfen kütüphanenizin bir göstergeye (örneğin, Ishimoku, MAKD) birkaç parametre seçmek için kullanıldığı kodu paylaşın.
Soru hiç de aptalca değil.
Makaledeki ikinci örneği kullanın. ZZ göstergesi yerine başka bir gösterge kullanın. ZZ tepelerini okumak yerine, kendi koşullarınızı yazmanız gerekir (örneğin MACD, aynı alternatif zikzağı elde edersiniz, ancak belirlediğiniz kurallara göre). Karmaşık bir şey yok. Deneyin, kodu yazın. Başarısız olursanız, koddaki sorunlu yerleri göstererek sorular sorun. İlgilenenler görevlerini çözmenin yollarını görecek, siz ve herkes faydalanacaktır. Dili öğrenmek istemiyorsanız, lütfen"Work" ile iletişime geçin.
2joo:
Lütfen bana RemovalDuplicates() fonksiyonunun özünü anlatabilir misiniz? Soru şu: Eğer iki özdeş kromozomumuz varsa, her ikisi de kopya olarak mı işaretlenmeli yoksa bir tanesi daha sonra kullanılmak üzere kopya olarak işaretlenmeden mi kalmalı?
Ayrıca, bu fonksiyonu hızlandırmak için, Ch2 döngüsünün Ch+1 değeriyle başlamasını öneriyorum, çünkü Ch2'nin sıfırdan başlamasının bir anlamı yok:
//Выбираем второй из пары...
for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
ve eğer sorumun cevabı her iki kromozomun da çift olarak işaretlenmesi ise, o zaman bunun yerine
do:
Ve eğer cevap bir kromozomun çift olarak işaretlenmeden bırakılması gerektiği ise, o zaman Ch2 döngüsü yine de Ch+1 değeri ile başlamalıdır.
2joo:
Lütfen bana RemovalDuplicates() fonksiyonunun özünü anlatabilir misiniz? Soru şu: İki özdeş kromozomumuz varsa, her ikisi de kopya olarak işaretlenmeli mi, yoksa biri daha sonra kullanılmak üzere kopya olarak işaretlenmeden mi kalmalı?
Bu fonksiyon için algoritma aşağıdaki gibidir:
Tüm kromozomları "1" benzersizlik özelliği ile işaretleriz. Tüm kromozomların benzersiz olduğunu düşünüyoruz.
Özdeş kromozomlar olup olmadığını kontrol edin. Bunu yapmak için, popülasyonu sanal olarak çoğaltırız ve aynı sıra numarasına sahip çiftleri atlarken tüm kromozomları birbirleriyle karşılaştırırız. Bulunan kopyalar, kopya özelliği "0" ile işaretlenir.
Ardından, "0" olarak işaretlenmemiş kalan tüm kromozomları geçici diziye kopyalayın. Boşluklar olmadan doldurulmuş bir geçici dizi elde ederiz ve popülasyonda kaç tane benzersiz kromozom kaldığını zaten biliyoruz.
Geriye kalan tek şey kromozomları popülasyona geri kopyalamaktır. Gördüğünüz gibi, kromozom silinmesi söz konusu değildir, benzersiz kromozomlar yalnızca popülasyonun başına kaydırılmıştır.
Bu işlevi test etmek için bir komut dosyası yazın ve elle yapılmış zor dolu diziler kombinasyonlarını beslemeyi deneyin. İşlevin ne kadar verimli/verimsiz çalıştığını göreceksiniz. Dizideki sütunların mümkün olan en küçük kontrol sayısını hesaplayın ve bunu RemovalDuplicates() fonksiyonunun sütunları kontrol etme sayısıyla karşılaştırın.
ZY Bu işlevi test etmek için bir komut dosyası yazın ve elle yapılmış zor kombinasyonları doldurulmuş dizilerle beslemeyi deneyin. İşlevin ne kadar etkili/etkisiz olduğunu göreceksiniz. Dizideki sütunların mümkün olan en küçük kontrol sayısını hesaplayın ve bunu RemovalDuplicates() fonksiyonunun sütunları kontrol etme sayısıyla karşılaştırın.
"for (Ch2=Ch+1)" döngüsünün başlangıcında gerekli ve yeterli iterasyon sayısı 2 kat azalacak ve kopya kromozomlardan biri kopya olarak işaretlenmeyecektir. Burada, çift kromozomlardan birini benzersiz bırakmanın ne kadar daha doğru olacağını merak ediyordum! Yani, fonksiyonun görevi özdeş kromozomları kaldırmaktır, ancak kopya kromozomların bir kopyası bana popülasyona geri dönmek için daha iyi görünüyor, çünkü kopyalarının varlığı canlılığını kanıtlamaz. Örneğin: {1,3,4,7,7,6,7,8,8} kromozom dizisi varsa, en uygun kopya çıkarma işleminin bu sonuç olacağını düşünüyorum: {1,3,4,7,6,8}. Dolayısıyla 7 ve 8 numaralı kromozomlar daha fazla dikkate alınacaktır.
cnt++ ile ilgili önceki yorumunuz doğruydu. Ama bu sefer yanılıyorsunuz. "Eğer... olursa ne olur?" diye spekülasyon yapmamanızı, bir kod yazmanızı, fonksiyonu test etmenizi ve sonucu göstermenizi öneririm.
Tek bir benzersiz kromozom kalır, onun tam kopyalarının geri kalanı kopya olarak tanınır ve "silinir".
Bu muhtemelen tüm UGA algoritmasının en moskova kırıcı işlevlerinden biridir. Benim en çok zamanımı aldı. Ancak içinde hiçbir hata yok.
Not: Önemli olan, aynı kromozomların tekrar tekrar kontrol edilmemesi gerektiğidir - bu yapılır.
Teklik için kontrol sayısı gerekli minimum sayıdır. for() operatöründeki çalıştırma sayısından bahsediyorsanız, bunları (teklik kontrollerinin sayısı aynı kalırken - mümkün olan minimum), iç içe geçmiş olanda her seferinde bir artarak ek bir değişken ekleyerek azaltabilirsiniz. Bu, işlevi yavaşlatacaktır.
PPS Eğer üzerinde durursanız:
shurick:
....
kopyalardan bir kromozomu benzersiz bırakmak ne kadar daha doğru olurdu! Yani, fonksiyonun görevi özdeş kromozomları ortadan kaldırmaktır, ancak kopya kromozomların bir kopyasının popülasyona geri dönmesi bana daha iyi görünüyor, çünkü kopyalarının varlığı canlılığını kanıtlamaz.
İşlevin görevi kopyaları ortadan kaldırmaktır. Adı üstünde. Özdeş kromozomları ortadan kaldırmakla ilgili değil. Farkı görüyor musunuz? Bu işlev kromozomlar arasında canlılıklarına göre ayrım yapmaz. Sonuç olarak, kopyasız tek bir kopyada yalnızca benzersiz kromozomlar kalır.
PPPS Her ihtimale karşı bir açıklama daha yapacağım.
Diyelim ki 20 kromozomdan oluşan bir popülasyonumuz var (basitlik ve açıklık için bir tamsayı geni ile), maksimizasyon problemi:
|7|2|3|9|2|4|5|3|3|5|6|2|4|3|5|10|6|7|7|2|
Yani, gen içeren kromozomlardan oluşan bir popülasyonda
2 - 4 adet
3 - 4 adet
4 - 2 adet
5 - 3 adet
6 - 2 adet
7 - 3 adet
9 - 1 adet
10 - 1 parça.
Toplam - 20 adet kromozom.
Çiftleri çıkardıktan sonra, popülasyon 8 kromozom kalacak şekilde aşağıdaki gibi görünecektir:
|7|2|3|9|4|5|6|10|
Yani geriye tek bir kromozom kalmıştır, diğerleri kopyadır ve "silinecektir"
fonksiyon çağrısından sonra.
fonksiyonun sonunda.
Nüfus şu şekilde görünecektir:
|10|9|7|6|5|4|3|2|
PPPS Her ihtimale karşı bir açıklama daha yapacağım.
Açıklama için çok teşekkür ederim, kopyaların kaldırılmasıyla ilgili soru beni tatmin edecek şekilde tamamen yanıtlandı. Döngülerdeki geçiş sayısının azaltıldığını gösteren orijinal ve optimize edilmiş işlevi gösteren komut dosyası kodunu ekliyorum. Mevcut yorumumda, işlevdeki bir hataya işaret etmiyorum, ancak optimizasyonunu öneriyorum ve asıl amacım, kapsamlı bir yanıt aldığım yinelenen kaldırma ilkesini bulmaktı. Kütüphane ve fonksiyon açıklamaları için tekrar çok teşekkür ederim.