Algoritmaların optimizasyonu. - sayfa 2

 

Ve bu yüzden:

 //————————————————————————————————————————————————————————————————
int Selection()
{
   int     u= 0 ;
   double p=RNDfromCI(Population[ 0 ][ 0 ]-Population[ 0 ][SizeOfPop- 1 ]);

   for (u= 0 ;u<SizeOfPop;u++)   if (Population[ 0 ][u+1]<=p)   break ;
  
   return (u);
}
//————————————————————————————————————————————————————————————————

?

 

Yarı hızlandı.

 // Рулетка.
int Roulette( double &array[], int SizeOfPop)
{
   double p, sum= 0 , zero = array[SizeOfPop- 1 ] - 1 .;
   for ( int i= 0 ; i<SizeOfPop; i++)
  {
     select [i] = sum += array[i] - zero;
  }
   // бросим "шарик"
  p=RNDfromCI( 0 ,sum);
   // посмотрим, на какой сектор упал "шарик"
   for ( int u= 0 ;u<SizeOfPop;u++)   if ( select [u]>=p)   return (u);
   return - 1 ;    
}

Sıfır (sizin durumunuzda, "katsayı") aptalca (neredeyse "buldozerden") seçilir.

// Potansiyel bir kullanıcı olarak bu anı dikkatlice değerlendirmenizi öneririm.

// Konuyla ilgili makul düşüncelerim var, boş zamanınızda tartışabilirsiniz.

sıfırı hesaplarken bir yerine 1.1 koyarsanız - sonuçlar (sayısal, hız değil) tamamen sizinkine karşılık gelir

 2012.04 . 05 02 : 30 : 17      mdRoulette (GBOTUSDMUR16Apr2012,M1)     ----------------
2012.04 . 05 02 : 30 : 17      mdRoulette (GBOTUSDMUR16Apr2012,M1)     h0 = 38621212 ;   38.621212
2012.04 . 05 02 : 30 : 17      mdRoulette (GBOTUSDMUR16Apr2012,M1)     h1 = 31685827 ;   31.685827
2012.04 . 05 02 : 30 : 17      mdRoulette (GBOTUSDMUR16Apr2012,M1)     h2 = 17770070 ;   17.77007
2012.04 . 05 02 : 30 : 17      mdRoulette (GBOTUSDMUR16Apr2012,M1)     h3 = 7335400 ;   7.3354
2012.04 . 05 02 : 30 : 17      mdRoulette (GBOTUSDMUR16Apr2012,M1)     h4 = 4203603 ;   4.203603
2012.04 . 05 02 : 30 : 17      mdRoulette (GBOTUSDMUR16Apr2012,M1)     h5 = 383888 ;   0.383888
2012.04 . 05 02 : 30 : 17      mdRoulette (GBOTUSDMUR16Apr2012,M1)     10374 мс - Время исполнения
2012.04 . 05 02 : 30 : 00      Roulette (GBOTUSDMUR16Apr2012,M1)       ----------------
2012.04 . 05 02 : 30 : 00      Roulette (GBOTUSDMUR16Apr2012,M1)       h0 38635063 38.635063
2012.04 . 05 02 : 30 : 00      Roulette (GBOTUSDMUR16Apr2012,M1)       h1 31678144 31.678144
2012.04 . 05 02 : 30 : 00      Roulette (GBOTUSDMUR16Apr2012,M1)       h2 17759576 17.759576
2012.04 . 05 02 : 30 : 00      Roulette (GBOTUSDMUR16Apr2012,M1)       h3 7333799 7.333799
2012.04 . 05 02 : 30 : 00      Roulette (GBOTUSDMUR16Apr2012,M1)       h4 4208364 4.208364
2012.04 . 05 02 : 30 : 00      Roulette (GBOTUSDMUR16Apr2012,M1)       h5 385054 0.385054
2012.04 . 05 02 : 30 : 00      Roulette (GBOTUSDMUR16Apr2012,M1)       16036 мс - Время исполнения
2012.04 . 05 02 : 29 : 24      Roulette (GBOTUSDMUR16Apr2012,M1)       ----------------
Dosyalar:
 
 
MetaDriver :

1. Bir buçuk kat hızlandı.

2. Konuyla ilgili makul düşüncelerim var, boş zamanınızda tartışabilirsiniz.

1. İyi karar, teşekkürler. Öz benimkiyle aynı, ancak iki yerine bir işaretleme dizisiyle başardınız - dolayısıyla hız kazancı. Öyle gibi görünmek. hiçbir şey yapmasan iyi olur.

Peki, döngü için işaretlemeyi çıkarmak dışında:

 for ( int i= 0 ; i<SizeOfPop; i++)
  {
     select [i] = sum += array[i] - zero;
  }

:)

2. Elbette.

 
Yedelkin :

Bu soru https://www.mql5.com/en/forum/6343/page5#comment_177533 bu konu için uygun mu?

Evet, bunlar algoritmalaştırma sorularıdır. Doğru, bu başlıkta zaten cevaplandı.
 

Ama böyle...

 void Test(){
   double SectorSize[]={ 22 , 3 , 2 , 1 , 7 , 12 };
   
   double tc[];
   ArrayResize (tc, ArraySize (SectorSize));
   for ( int i= 0 ;i< 100000 ;i++){
      tc[Roulete(SectorSize)]++;
   }
   int m=tc[ ArrayMinimum (tc)];
   string str= "" ;
       for (i= 0 ;i< ArraySize (SectorSize);i++){
         tc[i]/=m;
         str=str+DoubleToStr(tc[i], 2 )+ " " ;
      }      
   Alert (str);
}

int Roulete( double & SectorSize[]){ // На входе размеры секторов
   double Sum= 0 ;
   int i;
   for (i= ArraySize (SectorSize);i>= 0 ;i--){
      Sum+=SectorSize[i];
   }
   for (i= ArraySize (SectorSize);i> 0 ;i--){
       if ( MathRand ()<SectorSize[i]/Sum* 32767 ){
         return (i);
      }
      Sum-=SectorSize[i];
   }
   return (i);   
   
}

Girdi, sektör boyutlarına sahip bir dizidir ( diziyi sıralamak gerekli değildir).

Dizide neden negatif bir sayı var - anlamıyorum. Belki de sektörlerin işaretlenmesi?

 
joo :

İyi karar, teşekkürler. Öz benimkiyle aynı, ancak iki yerine bir işaretleme dizisiyle başardınız - dolayısıyla hız kazancı. Öyle gibi görünmek. hiçbir şey yapmasan iyi olur.

Kazanç, birçok küçük iyileştirme ile elde edilir. Ayrıca "küçük şeyler üzerinde" biraz hızlandırabilirsiniz.

Örneğin, rulet çarkını çağırırken ikinci parametreyi önceden bir azaltın:

 int Roulette( double &array[], int MaxIndex)
{
   double p, sum= 0 , zero = array[MaxIndex] - 1.1 ;
   for ( int i= 0 ; i!=MaxIndex; i++)
  {
     select [i] = sum += array[i] - zero;
  }
   // бросим "шарик"
  p=RNDfromCI( 0 ,sum);
   // посмотрим, на какой сектор упал "шарик"
   for ( int u= 0 ;u!=MaxIndex;u++) 
  {   if ( select [u]>=p)   return (u);}
   return - 1 ;    
}

oldukça ölçülebilir bir fark elde ediyoruz

 2012.04 . 05 18 : 35 : 31      mdQuikRoulette (USDCHF,M1)      ----------------
2012.04 . 05 18 : 35 : 31      mdQuikRoulette (USDCHF,M1)      h0 = 38784632 ;   38.784632
2012.04 . 05 18 : 35 : 31      mdQuikRoulette (USDCHF,M1)      h1 = 31791177 ;   31.791177
2012.04 . 05 18 : 35 : 31      mdQuikRoulette (USDCHF,M1)      h2 = 17835360 ;   17.83536
2012.04 . 05 18 : 35 : 31      mdQuikRoulette (USDCHF,M1)      h3 = 7365937 ;   7.365937
2012.04 . 05 18 : 35 : 31      mdQuikRoulette (USDCHF,M1)      h4 = 4222894 ;   4.222894
2012.04 . 05 18 : 35 : 31      mdQuikRoulette (USDCHF,M1)      h5 = 0 ;   0.0
2012.04 . 05 18 : 35 : 31      mdQuikRoulette (USDCHF,M1)       9828 мс - Время исполнения
2012.04 . 05 18 : 33 : 30      mdRoulette (USDCHF,M1)  ----------------
2012.04 . 05 18 : 33 : 30      mdRoulette (USDCHF,M1)  h0 = 38627427 ;   38.627427
2012.04 . 05 18 : 33 : 30      mdRoulette (USDCHF,M1)  h1 = 31682853 ;   31.682853
2012.04 . 05 18 : 33 : 30      mdRoulette (USDCHF,M1)  h2 = 17763763 ;   17.763763
2012.04 . 05 18 : 33 : 30      mdRoulette (USDCHF,M1)  h3 = 7334465 ;   7.334465
2012.04 . 05 18 : 33 : 30      mdRoulette (USDCHF,M1)  h4 = 4206490 ;   4.20649
2012.04 . 05 18 : 33 : 30      mdRoulette (USDCHF,M1)  h5 = 385002 ;   0.385002
2012.04 . 05 18 : 33 : 30      mdRoulette (USDCHF,M1)   10359 мс - Время исполнения

Ama hepsi bu değil. Gerçek galibiyet "büyük" önde. Bekle, düzelteceğim - göndereceğim.

// burada küçük bir hata var - zaten düzeltildi.

 
Integer :

Ama böyle...

1. Girdi, sektör boyutlarına sahip bir dizidir ( diziyi sıralamak gerekli değildir).

2. Dizide neden negatif bir sayı var - anlamadım. Belki de sektörlerin işaretlenmesi?

1. Sorun, girdinin ham veri olmasıdır. Oyun yolları henüz sektör boyutlarına dönüştürülmedi. Bu, görevin kagbe kısmıdır. :)

2. Boşver. Eziyet joo, yeterince zorlarsan itiraf edecek. Ve hata ayıklamaya gittim. ;)

 
Ama bu gerçek bir hızlı ateş eden Quik ruleti.
 // Рулетка.
int Roulette( double &array[], int r)
{
   double p, sum= 0 , zero = array[r++] - 1.1 ;
   for ( int i= 0 ; i!=r; i++)
  {
     select [i] = sum += array[i] - zero;
  }
  p=RNDfromCI( 0 ,sum);
   int l= 0 , m=(l+(--r))>> 1 ;
   while (l<r) 
    {
     if ( select [m]>=p) r=m;
     else l=m+ 1 ; 
     m=(l+r)>> 1 ;
    }
   return m;    
}
 2012.04 . 05 19 : 58 : 24      mdQuikRoulette (USDCHF,M1)      ----------------
2012.04 . 05 19 : 58 : 24      mdQuikRoulette (USDCHF,M1)      h0 = 38632491 ;   38.632491
2012.04 . 05 19 : 58 : 24      mdQuikRoulette (USDCHF,M1)      h1 = 31675215 ;   31.675215
2012.04 . 05 19 : 58 : 24      mdQuikRoulette (USDCHF,M1)      h2 = 17769223 ;   17.769223
2012.04 . 05 19 : 58 : 24      mdQuikRoulette (USDCHF,M1)      h3 = 7337466 ;   7.337466
2012.04 . 05 19 : 58 : 24      mdQuikRoulette (USDCHF,M1)      h4 = 4202088 ;   4.202088
2012.04 . 05 19 : 58 : 24      mdQuikRoulette (USDCHF,M1)      h5 = 383517 ;   0.383517
2012.04 . 05 19 : 58 : 24      mdQuikRoulette (USDCHF,M1)       11529 мс - Время исполнения
2012.04 . 05 19 : 57 : 06      mdQuikRoulette (USDCHF,M1)      ----------------
Sonuç sizi etkiledi mi?

Bu saflıktır. ;) Girdi dizisini 10000 kat artırın - o zaman kesinlikle etkileneceksiniz.

--

Karşılaştırma testleri için sabırsızlanıyorum. // büyük bir dizide.

;)

Dosyalar:
 
MetaDriver :

Karşılaştırma testleri için sabırsızlanıyorum. // büyük bir dizide.

Bekleyemeyeceğim gibi görünüyor. :)

Tekrar kendin yapman gerekecek:

 2012.04 . 05 22 : 04 : 25      mdQuikRoulette_CompareTest (USDCHF,M1)  h0 = 2105 ;   0.02105
2012.04 . 05 22 : 04 : 25      mdQuikRoulette_CompareTest (USDCHF,M1)  h1 = 1782 ;   0.01782
2012.04 . 05 22 : 04 : 25      mdQuikRoulette_CompareTest (USDCHF,M1)  h2 = 2189 ;   0.02189
2012.04 . 05 22 : 04 : 25      mdQuikRoulette_CompareTest (USDCHF,M1)  h3 = 1793 ;   0.01793
2012.04 . 05 22 : 04 : 25      mdQuikRoulette_CompareTest (USDCHF,M1)  h4 = 1803 ;   0.01803
2012.04 . 05 22 : 04 : 25      mdQuikRoulette_CompareTest (USDCHF,M1)  h5 = 2075 ;   0.02075
2012.04 . 05 22 : 04 : 25      mdQuikRoulette_CompareTest (USDCHF,M1)   1825 мс - Время исполнения QuickRoulette
2012.04 . 05 22 : 04 : 23      mdQuikRoulette_CompareTest (USDCHF,M1)  h0 = 2104 ;   0.02104
2012.04 . 05 22 : 04 : 23      mdQuikRoulette_CompareTest (USDCHF,M1)  h1 = 1812 ;   0.01812
2012.04 . 05 22 : 04 : 23      mdQuikRoulette_CompareTest (USDCHF,M1)  h2 = 2088 ;   0.02088
2012.04 . 05 22 : 04 : 23      mdQuikRoulette_CompareTest (USDCHF,M1)  h3 = 1839 ;   0.01839
2012.04 . 05 22 : 04 : 23      mdQuikRoulette_CompareTest (USDCHF,M1)  h4 = 1769 ;   0.01769
2012.04 . 05 22 : 04 : 23      mdQuikRoulette_CompareTest (USDCHF,M1)  h5 = 2089 ;   0.02089
2012.04 . 05 22 : 04 : 23      mdQuikRoulette_CompareTest (USDCHF,M1)   183207 мс - Время исполнения Roulette


Aynı zamanda sonunda tarandı ve her şeyi sınıfa attı. Rulet sektörlerinin "ayarları" CRoulette.Reset()'e taşındı;