"Genetik Algoritmalar - Çok Kolay!" makalesi için tartışma - sayfa 5

 
shurick:

Açıklama için çok teşekkür ederim, kopyaların kaldırılmasıyla ilgili soru tamamen tatmin edici bir şekilde yanıtlandı. Döngülerdeki geçiş sayısındaki azalmayı gösteren orijinal ve optimize edilmiş işlevi gösteren kod 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ı. Bir kez daha, kütüphane ve fonksiyonun açıklanması için çok teşekkür ederim.

20 kromozom için 110 ve 160 çok fazla.... Sayacı yanlış yere koymuşsunuz.

Doğru yer burası:

//Çiftin ikincisini seçin....
      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
      {
        //count_cicles++; // DEBUG Ch ve Ch2 döngülerini kaç kez geçtiğimizi sayar
        if (Ch!=Ch2 && chromosomeUnique[Ch2]!=0)
        {
          count_cicles++; // DEBUG kromozomları kaç kez karşılaştırdığımızı sayar.
          //Özdeş genlerin sayısını sıfırlayalım
          cnt=0;
          //Genler aynı olduğu sürece genleri kontrol edin.
          for (Ge=1;Ge<=GeneCount;Ge++)
          {
            if (Population[Ge][Ch]!=Population[Ge][Ch2])
              break;
            else
              cnt++;
          }
          //Eğer özdeş genlerin sayısı toplam gen sayısı ile aynı ise
          //...kromozom bir kopya olarak kabul edilir.
          if (cnt==GeneCount)
            chromosomeUnique[Ch2]=0;
        }

TAMAM. Şimdi aynı popülasyonu, aynı kromozomlarla, ancak bu sırayla deneyin:

int m_init[20] = {7,7,7,3,9,2,4,5,3,3,5,6,2,4,3,5,10,6,2};

Ne gözlemliyoruz?

 

Shurick'e:

Gerçekten de öyle. Tüm farklı kromozomlarla yapılan teklik kontrollerinin sayısı aşağıdaki formülle hesaplanabilir

(PopulChromosCount^2-PopulChromosCount)/2

Kromozom sayısı 20 olan örneğimizde (tüm kromozomların farklı olduğunu varsayarsak), kontrol sayısı şöyle olacaktır:

(20*20-20)/2=190

bu kontrol ile doğrulanmıştır:

int  m_init[20]  = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

Mükerrerler yakalanırsa, daha da az kontrol yapılacaktır.

Projeye aktif katılımınız için teşekkür ederiz!

Kütüphanede uygun değişiklikler yapılacaktır. Değişiklikler algoritmanın arama yeteneklerini etkilemeyecek olsa da, çalışmasını daha rasyonel hale getirecek.

 
joo:

Neye bakıyoruz?

Sonuç

Değişiklikler algoritmanın arama yeteneklerini hiçbir şekilde etkilemeyecek olsa da

Kesinlikle doğru, algoritmanın kalitesi değişmeyecek, başlangıçta bundan şüphe etsem de, şimdi bunu bana kanıtladınız, ancak bu şüpheler üzerine bir optimizasyon yöntemi buldunuz :)

 
UGA kütüphanesi ve makaledeki örnekler güncellendi. Güncel ücretsiz yazar sürümü 1.2.1.
Dosyalar:
 
Kütüphane UGA'yı ve bu makale için örnekleri güncelleyin. Mevcut ücretsiz yazma sürümü 1.2.1.
Dosyalar:
 

Makaleyi inceledim ve kodda böyle bir tutarsızlık buldum, aralık değerlerini elde etmek için iki işlevde aynı formül kullanılıyor:

//Çoğaltma
void Replication
...
    //Yeni bir gen oluşturmak için sınırları belirleyelim
    Minimum = C1-((C2-C1)*ReplicationOffset);
    Maximum = C2+((C2-C1)*ReplicationOffset);
...

/////////////////////////////////////////////

// Yapay Mutasyon.
void ArtificialMutation
...
    //Yeni bir gen oluşturmak için sınırları belirleyelim
    Minimum=C1-((C2-C1)*ReplicationOffset);
    Maximum=C2+((C2-C1)*ReplicationOffset);
...

Yani, iki genin değerleri dışındaki veriler elde edilir, bu da "yapay mutasyon" un karakteristiğidir. Bu bir hata mı yoksa başka bir açıklaması var mı?

Bana öyle geliyor ki, çoğaltma yöntemi için işaretleri değiştirmek gerekiyor:

Minimum = C1+((C2-C1)*ReplicationOffset);

Maksimum = C2-((C2-C1)*ReplicationOffset);


 
Batohov:

Makaleyi inceledim ve kodda bu tutarsızlığı buldum, iki işlev aralık değerlerini almak için aynı formülü kullanıyor:

Yani, "yapay mutasyonun" özelliği olan iki genin değerleri dışında veriler elde edilir. Bu bir hata mı yoksa başka bir açıklaması var mı?

Bana öyle geliyor ki, çoğaltma yöntemi için işaretleri değiştirmek gerekiyor:

Minimum = C1+((C2-C1)*ReplicationOffset);

Maksimum = C2-((C2-C1)*ReplicationOffset);

Herhangi bir hata ya da tutarsızlık yoktur. Hem replikasyonda hem de yapay mutasyonda yeni bir genin ortaya çıkma olasılığının sınırları (bahsettiğiniz kod bölümleri) aynı şekilde tanımlanır.

Ancak replikasyon için olasılık alanı bu sınırların içinde, yapay mutasyon için ise bu sınırların ötesindedir.

Çoğalma, her iki ebeveynin genlerinin karakteristik özelliklerini aktarmaya hizmet eder (sınırlar dahilinde).

Yapay mutasyon ise ebeveynlerinkinden farklı yeni genler üretmeye yarar (sınırların dışında).

 
joo:

Hiçbir hata ya da tutarsızlık yoktur. Hem replikasyonda hem de yapay mutasyonda, yeni bir genin ortaya çıkma olasılığının sınırları (bahsettiğiniz kod bölümleri) aynı şekilde tanımlanır.

Ancak replikasyon için olasılık alanı bu sınırların içinde, yapay mutasyon için ise bu sınırların ötesindedir.

Çoğalma, her iki ebeveynin genlerinin karakteristik özelliklerini aktarmaya hizmet eder (sınırlar dahilinde).

Yapay mutasyon ise ebeveynlerinkinden farklı yeni genler üretmeye yarar (sınırların dışında).

Hızlı cevabınız için teşekkür ederim, düşünce tarzınızı anlıyorum.
 
joo:

Bu arada, ZZ ile ilgili en ünlü tüccar efsanelerinden birinin (makaledeki ikinci görev) yok edicisi olmak çok güzel. :)

Görünüşe göre, görevin ifadesini anlamamışım. Benim ifadem:

Minimum işlemin N pip olması koşuluyla maksimum kar için giriş noktaları, minimum diz N + Spread pip koşulu ile ZigZag'ın tepelerinde bulunur.

 
joo:

MQL4 forumunda "Test Multivariable Multiextremal Function" başlığında bazı ilginç test fonksiyonları yayınladım, bunlardan biri makalede sunulmuştur.

İsterseniz, GA dışındaki diğer optimizasyon algoritmalarını kullanarak önerilen fonksiyonların ekstremumlarını bulmayı deneyebilir ve sonuçları burada yayınlayabilirsiniz. Bunu yapmaktan memnuniyet duyarsınız. Bu herkes için ve en başta benim için ilginç olacaktır.

Uyumun geçerliliğini değerlendirmenin çok önemli olduğunun farkındayım. Yöntemlerden biri orijinal verilere gürültü eklemektir.

Alternatif optimizasyon yöntemleri için kaynak kodları burada(http://alglib.sources.ru/optimization/) ve burada(http://ool.sourceforge.net/) bulabilirsiniz.

Açıkçası, her optimizasyon algoritması kendi hedef fonksiyon sınıflarında daha iyi performans gösterir.

Pratikte hangi hedef fonksiyonları kullanıyorsunuz?