Optimizasyon Algoritmaları Şampiyonası. - sayfa 52

 

İkinci varyant içe aktarma ile ilgili bir örnekte ne var?

 //+------------------------------------------------------------------+
// тестовая фитнес функция чемпионата, не известна участникам
#import "\\Projects\\OAC\\lib\\ff.ex5"
// запросить количество параметров ФФ 
int     GetParamCountFF (); 
// запуск ФФ, получеие значения соответствующее параметроам ФФ
double FF ( double &array []); 
// произведённое количество запусков ФФ
int     GetCountRunsFF (); 
#import
 
Dmitry Fedoseev :

Ben de böyle yazabilirim - sorumda net olmayan ne var?

Bu oldukça retorik bir soruydu çünkü eminim ki her şeyi anlamışsınızdır.

Dmitry Fedoseev :
Neden bir soru 10 kere sorulmalı?

Zor soru, sık sık kendime bu soruyu soruyorum.)

Dmitry Fedoseev :

İkinci varyant içe aktarma örneğinde ne için?

Algoritmayı komut dosyasından kontrol etmek için, algoritmanın gerçekte kaç kez FF dediği.

İlk seçenek için bu açıkça görülebilir, çünkü komut dosyasının kendisi çağrı yapar, ancak ikinci seçenek için bu görünmez, bu yüzden komut dosyasından FF kitaplığına erişme yeteneğine ihtiyacınız var.

 

Şimdi, kendilerini bu konuda "acemi" olarak sınıflandıran ve kazanmaya ciddi anlamda güvenmeyen tüm katılımcılara sesleniyorum .

Zaten anlaşılmaz bir görevi çılgınca karıştıran ve saf matematiğe yönelen uzayın birçok boyutu hakkındaki tüm "teori"yi bir kenara bırakırsak, o zaman FF'nin bir denklem olduğunu göreceğiz.

Bu denklem ancak bir grafiğe uygulandığında analitik bir fonksiyon haline gelir.

Ama bir soru var - GEREKLİ Mİ ? - Grafik, denklem parametrelerinin ilişki modellerini görselleştirmeye yardımcı olur.

158 sayfalık tartışmadan sonra, görevin özünü şimdiden formüle edebiliriz:

Denklemin sol tarafındaki değişkenin değerinin en büyük olacağı denklemin sağ tarafındaki değişkenlerin değerlerini seçmek gerekir .

Amaç, bunu kaba kuvvetten daha verimli bir şekilde yapmaya çalışmaktır.

Herşey.

Daha ileri:

Bu sorunu çözmek için, değerleri aramanın "Evrimsel" teknolojisi icat edildi. Darwinizm kaynaklı benzetmeler ve yöntemler inşa edildi.

Bu yaklaşımın etkinliği tartışmalıdır. Belki de bu sorunu çözmenin daha basit ve daha etkili yolları vardır.

Uygulamam, genel kabul görmüş yaklaşımların her zaman en etkili olmadığını kanıtlıyor.

"Evrimcileri" kolayca aşabileceğimize eminim...

Hadi deneyelim!

 

FF'yi çağırmanın ikinci varyantı için katılımcının algoritmasına bir örnek:

 #property library
#property strict

//+------------------------------------------------------------------+
// тестовая фитнес функция чемпионата, не известна участникам
#import "\\Projects\\OAC\\lib\\ff.ex5"
// запросить количество параметров ФФ 
int     GetParamCountFF (); 
// запуск ФФ, получеие значения соответствующее параметроам ФФ
double FF ( double &array []); 
// произведённое количество запусков ФФ
int     GetCountRunsFF (); 
#import
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void InitAO ( int paramCount, int maxFFruns) export
{
  params = paramCount;
  maxFFrunsPossible = maxFFruns;
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void StartAlgo () export
{
   double param []; 
   ArrayResize (param, params);
   double ffVolue = 0.0 ; 
  
   //------------------------------------------------------------------
   for ( int i= 0 ; i< maxFFrunsPossible; i++) 
  {
    GenerateParam (param);
    ffVolue = FF(param);
     if (ffVolue > maxFFvolue) 
      maxFFvolue = ffVolue;
  }
   //------------------------------------------------------------------
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
double GetMaxFF () export
{
   return (maxFFvolue);
}
//+------------------------------------------------------------------+

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Все функции выше этой строки - обязательны! Именно они будут импортированы 
// и использованы тестовым скриптом. Они нужны для доступа к алгоритму оптимизации.
// Содержимое - произвольное, на усмотрение участника
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Ниже этой строки пример алгоритма оптимизации участника
//————————————————————————————————————————————————————————————————————
int     params     = 0 ;
int     maxFFrunsPossible = 0 ;
double maxFFvolue = - DBL_MAX ;
double minParam   = - 10.0 ;
double maxParam   = 10.0 ;
double stepParam  = 0.1 ;
//————————————————————————————————————————————————————————————————————

//————————————————————————————————————————————————————————————————————
// Генерация значений оптимизируемых параметров
void GenerateParam ( double &param[])
{
   int size = ArraySize (param);
   double paramVolue = 0.0 ;
   for ( int i = 0 ; i < size; i++) 
  {
    paramVolue = RNDfromCI (minParam, maxParam);
    param [i] = SeInDiSp (paramVolue, minParam, maxParam, stepParam); 
  }
}
//————————————————————————————————————————————————————————————————————

//————————————————————————————————————————————————————————————————————
// Выбор в дискретном пространстве
double SeInDiSp ( double in, double inMin, double inMax, double step) 
{ 
   if (in <= inMin) 
     return (inMin); 
   if (in >= inMax) 
     return (inMax); 
   if (step == 0.0 ) 
     return (in); 
   else 
     return (inMin + step * ( double ) MathRound ((in - inMin) / step));
}
//————————————————————————————————————————————————————————————————————

//————————————————————————————————————————————————————————————————————
// ГСЧ в заданном интервале
double RNDfromCI ( double min, double max) 
{ 
   if (min == max) 
     return (min); 
   double Min, Max; 
   if (min > max) 
  {
    Min = max; 
    Max = min;
  }
   else 
  {
    Min = min; 
    Max = max;
  }
   return ( double (Min + ((Max - Min) * ( double ) MathRand () / 32767.0 )));
}
//————————————————————————————————————————————————————————————————————

Algoritmanın ana kodu, ilk sürümdekiyle aynıdır, ancak komut dosyasından değil, algoritmadan gelen FF çağrısı ile.

Sonuçlar, elbette, ilk seçeneğe benzer:

2016.06.22 11:47:45.321 OAC varyantı 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:45.321 OAC varyantı 2 (GBPUSD,M30) Süre: 135 µs; 0.00013500 sn

2016.06.22 11:47:45.321 OAC varyantı 2 (GBPUSD,M30) FF başlar: 1000

2016.06.22 11:47:45.321 OAC varyantı 2 (GBPUSD,M30) Maks: 2.94159260

2016.06.22 11:47:41.404 OAC varyantı 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:41.404 OAC varyantı 2 (GBPUSD,M30) Süre: 136 µs; 0.00013600 sn

2016.06.22 11:47:41.404 OAC varyantı 2 (GBPUSD,M30) FF başlar: 1000

2016.06.22 11:47:41.404 OAC varyantı 2 (GBPUSD,M30) Maks: 3.10159260

2016.06.22 11:47:37.309 OAC varyantı 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:37.309 OAC varyantı 2 (GBPUSD,M30) Süre: 133 µs; 0.00013300 sn

2016.06.22 11:47:37.309 OAC varyantı 2 (GBPUSD,M30) FF başlar: 1000

2016.06.22 11:47:37.309 OAC varyantı 2 (GBPUSD,M30) Maks: 3.06159260

2016.06.22 11:47:32.933 OAC varyantı 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:32.933 OAC varyantı 2 (GBPUSD,M30) Süre: 133 µs; 0.00013300 sn

2016.06.22 11:47:32.933 OAC varyantı 2 (GBPUSD,M30) FF başlar: 1000

2016.06.22 11:47:32.933 OAC varyantı 2 (GBPUSD,M30) Maks: 3.10159260

2016.06.22 11:47:07.584 OAC varyantı 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:07.584 OAC varyantı 2 (GBPUSD,M30) Süre: 180 µs; 0.00018000 sn

2016.06.22 11:47:07.584 OAC varyantı 2 (GBPUSD,M30) FF başlar: 1000

2016.06.22 11:47:07.584 OAC varyantı 2 (GBPUSD,M30) Maks: 3.04159260

yani çok kötü değil.

 

Bu nedenle, yukarıdaki örnekler, işlevleri içe aktarma yoluyla komut dosyalarını test etmek için katılımcı algoritmalarının nasıl bağlanacağını gösterir.

Katılımcıların algoritmalarıyla çalışmanın bu özel yolunun neden organize edildiğini size hatırlatmama izin verin: bir yandan fikri mülkiyeti korumak için katılımcının algoritmasını gizlemek gerekir, diğer yandan her iki jüri tarafından kontrol ve doğrulama imkanı üyeler ve seyirciler.

 

Bugün test edeceğim

Ancak, (Anlıyorum, Andrey, aceleniz olduğunu anlıyorum) ve bir gönderide, aynı dosyaların ekleriyle birlikte dosyalarla ilgili kuralları yayınlamak arzu edilir. Şu anda olması şart değil, ama bir başlangıç noktasına sahip olmak.

 
Реter Konow :

Şimdi, kendilerini bu konuda "acemi" olarak sınıflandıran ve kazanmaya ciddi anlamda güvenmeyen tüm katılımcılara sesleniyorum .

Zaten anlaşılmaz bir görevi çılgınca karıştıran ve saf matematiğe yönelen uzayın birçok boyutu hakkındaki tüm "teori"yi bir kenara bırakırsak, o zaman FF'nin bir denklem olduğunu göreceğiz.

Bu denklem ancak bir grafiğe uygulandığında analitik bir fonksiyon haline gelir.

Ama bir soru var - GEREKLİ Mİ ? - Grafik, denklem parametrelerinin ilişki modellerini görselleştirmeye yardımcı olur.

158 sayfalık tartışmadan sonra, görevin özünü şimdiden formüle edebiliriz:

Denklemin sol tarafındaki değişkenin değerinin en büyük olacağı denklemin sağ tarafındaki değişkenlerin değerlerini seçmek gerekir .

Amaç, bunu kaba kuvvetten daha verimli bir şekilde yapmaya çalışmaktır.

Herşey.

Daha ileri:

Bu sorunu çözmek için, değerleri aramanın "Evrimsel" teknolojisi icat edildi. Darwinizm kaynaklı benzetmeler ve yöntemler inşa edildi.

Bu yaklaşımın etkinliği tartışmalıdır. Belki de bu sorunu çözmenin daha basit ve daha etkili yolları vardır.

Uygulamam, genel kabul görmüş yaklaşımların her zaman en etkili olmadığını kanıtlıyor.

"Evrimcileri" kolayca aşabileceğimize eminim...

Hadi deneyelim!

Gönderinin duygusal rengini bir kenara bırakırsak, söylenenler temelde doğrudur. Unuttuğunuz tek şey FF denkleminin kendisi bu şampiyona çerçevesinde bilinmiyor (gerçek hayatta biliniyor olabilir de olmayabilir de).

"Saçma teorilere" gelince - bu başlıkta, başka hiçbir yerde kullanılmayan ve daha önce hiç kullanılmayan (en azından mevcut kaynaklarda) optimizasyon algoritmasının ilkeleri hakkında net ipuçları verdim. Ve seçim her zaman araştırmacıya bağlıdır - algoritmada nasıl ve ne kullanacağı. Yukarıdaki örnekte Darwin'le dolaylı olarak bile alakası olmayan bir algoritma var. Pek çok optimizasyon yöntemi var ve hiç kimse, en azından "Darwin'den köken almanın" daha iyi olduğunu iddia etmedim.

İyi şanslar yeni başlayanlar! Zafere ileri!

 
Beşi üzerine kodlama yapmadım ve ayrıca ihracat-ithalat operasyonlarında da tecrübem yok. Örneğinizi doğru anladıysam lütfen bana bildirin. Yorumlarımı koda koydum. Bir soru daha . FF bir formülle verilirse, bölme veya kök çıkarma işlemlerinin olup olmayacağı. Sıfır veya negatif bir değer kritik bir hataya neden olacak ve programı durduracaktır .
 // -- данный код находится на стороне жюри (организатора)---------------------
#property library      //EX5-файл будет являться библиотекой
#property strict
int   countRuns    = 0 ;   // число обращений к ФФ. Фитнес функции это, как я понимаю неизвестная никому функция у которой 500 параметров
 // и нужно найти такие значения параметров при которой значение фф= максимальному 
//+------------------------------------------------------------------+
int GetParamCountFF () export //функция задачи участникам количества параметров фф  модификатор export указывает что функция доступна
// алгоритму участника  
{ 
   return ( 2 ); // возвращает количество параметров участнику 2 для данного примера 
   // участник в своём коде прописывает  int NumberParam=GetParamCountFF();
}

double FF ( double &array []) export // сама фф 
{ 
  countRuns++;
   int sizeArray = ArraySize (array); //количество элементов массива
   //-------дальше не пойму логику----------------- 
   if (sizeArray != 2 ) 
     return (- DBL_MAX ); 
   return (-( pow ( 2.4 + array [ 0 ], 2.0 ) + pow (array [ 1 ] - 2.3 , 2.0 ))+ 3.1415926 );
 //--------------вероятно нужно так --------------
     if (sizeArray != 2 ){ // возвращает минимальное double ( или может лучше ошибку)
     // если количество элементов в массиве пользователя не равно заданному)
     return (- DBL_MAX );
    } 
     else { // возвращает значение функции
   return (-( pow ( 2.4 + array [ 0 ], 2.0 ) + pow (array [ 1 ] - 2.3 , 2.0 ))+ 3.1415926 );
  }
   //------------------------------------------------------------------
}

int GetCountRunsFF () export
{ 
   return (countRuns); // возвращает кол. обращений к фф
}
 
Yuri Evseenkov :
Beşi üzerine kodlama yapmadım ve ayrıca ihracat-ithalat operasyonlarında da tecrübem yok. Örneğinizi doğru anladıysam lütfen bana bildirin. Yorumlarımı koda koydum. Bir soru daha . FF bir formülle verilirse, bölme veya kök çıkarma işlemlerinin olup olmayacağı. Sıfır veya negatif bir değer kritik bir hataya neden olacak ve programı durduracaktır .

Evet, FF şampiyonasının işini doğru anlıyorsunuz.

Yanlış parametre dizisi boyutunda sonucu döndürme ile ilgili tek düzeltme, katılımcı algoritmanın FF'nin parametre sayısını bilmesi ve yanlış boyutta bir diziyi FF'ye iletmesi durumunda, bu sorunun nedenidir. FF değil, katılımcı algoritması. Bu noktada bir düşünün, eğer piyasayı örnek alırsak - piyasa size asla işleminizde “yanlış” sayıda strateji parametresi kullandığınızı söylemez, sadece negatif bir işlem sonucu alırsınız ve bu kadar, Piyasadan yaptığınız hataların sebeplerini açıklamadan.

Sen kelimesi Bizim kelimesi ile değiştirilebilir ve Sen kelimesi Biz kelimeleri ile değiştirilebilir - bundan hiçbir şey değişmeyecek ve doğru kalacaktır.

 
Igor Volodin :

Bugün test edeceğim

Ancak, (Anlıyorum, Andrey, aceleniz olduğunu anlıyorum) ve bir gönderide, aynı dosyaların ekleriyle birlikte dosyalarla ilgili kuralları yayınlamak arzu edilir. Şu anda olması şart değil, ama bir başlangıç noktasına sahip olmak.

Örnek dosyaları hemen aramamak için mevcut dosya deposuna koymak ve şubenin başına depoya bir bağlantı yerleştirmek muhtemelen uygun olacaktır.

Evet yapacağım.