최적화 알고리즘 챔피언십. - 페이지 52

 

두 번째 변형 가져오기 에 대한 예에서는 어떻습니까?

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

글쎄, 나도 이렇게 쓸 수 있다 - 내 질문에서 명확하지 않은 것은 무엇인가?

나는 당신이 모든 것을 이해한다고 확신하기 때문에 오히려 수사학적인 질문이었습니다.

드미트리 페도세프 :
하나의 질문에 10번을 물어야 하는 이유는 무엇입니까?

어려운 질문, 나는 종종 스스로에게 이 질문을 던진다.)

드미트리 페도세프 :

두 번째 변형 가져오기의 예에서는 어떻게 됩니까?

스크립트에서 알고리즘을 제어하기 위해 알고리즘이 실제로 FF를 호출한 횟수.

첫 번째 옵션의 경우 스크립트 자체가 호출하기 때문에 명확하게 표시되지만 두 번째 옵션의 경우 표시되지 않으므로 스크립트에서 FF 라이브러리에 액세스할 수 있는 기능이 필요합니다.

 

이제 이 주제에서 스스로를 "초보자"로 분류하고 우승을 진지하게 생각하지 않는 모든 참가자에게 호소하고 싶습니다 .

이미 이해할 수 없는 작업을 크게 혼란스럽게 하고 순수한 수학으로 전환하는 공간의 많은 차원에 대한 완전한 "이론"을 폐기하면 FF가 방정식 임을 알 수 있습니다.

이 방정식은 그래프에 적용해야 분석 함수가 됩니다 .

그러나 질문이 있습니다 - 그것이 필요 합니까? - 그래프는 단순히 방정식 매개변수의 관계 패턴을 시각화하는 데 도움이 됩니다.

158페이지의 토론 후에 우리는 이미 작업의 본질을 공식화할 수 있습니다.

방정식 의 왼쪽에 있는 변수의 값이 가장 큰 방정식 의 오른쪽에 있는 변수의 값 을 선택하는 것이 필요합니다 .

목표는 무차별 대입보다 더 효율적으로 수행하는 것입니다.

모두.

더 나아가:

이 문제를 해결하기 위해 가치를 찾는 "진화"기술이 발명되었습니다. 다윈주의에서 비롯된 유추와 방법이 만들어졌습니다.

이 접근법의 효과는 논쟁의 여지가 있습니다. 아마도 이 문제를 해결하는 더 간단하고 효율적인 방법이 있을 것입니다.

내 관행은 일반적으로 받아 들여지는 접근 방식이 항상 가장 효과적인 것은 아니라는 것을 증명합니다.

나는 우리가 "진화론자들"을 쉽게 피할 수 있다고 확신합니다 ...

해보자!

 

FF 호출의 두 번째 변형에 대한 참가자 알고리즘의 예:

 #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 )));
}
//————————————————————————————————————————————————————————————————————

알고리즘의 주요 코드는 첫 번째 버전과 동일하지만 스크립트가 아닌 알고리즘의 FF 호출이 있습니다.

물론 결과는 첫 번째 옵션과 유사합니다.

2016.06.22 11:47:45.321 OAC 변형 2(GBPUSD,M30) ----------------------------------

2016.06.22 11:47:45.321 OAC 변형 2(GBPUSD,M30) 시간: 135μs; 0.00013500초

2016.06.22 11:47:45.321 OAC 변형 2(GBPUSD,M30) FF 시작: 1000

2016.06.22 11:47:45.321 OAC 변형 2(GBPUSD,M30) 최대: 2.94159260

2016.06.22 11:47:41.404 OAC 변형 2(GBPUSD,M30) ----------------------------------

2016.06.22 11:47:41.404 OAC 변형 2(GBPUSD,M30) 시간: 136 µs; 0.00013600초

2016.06.22 11:47:41.404 OAC 변형 2(GBPUSD,M30) FF 시작: 1000

2016.06.22 11:47:41.404 OAC 변형 2(GBPUSD,M30) 최대: 3.10159260

2016.06.22 11:47:37.309 OAC 변형 2(GBPUSD,M30) ----------------------------------

2016.06.22 11:47:37.309 OAC 변형 2(GBPUSD,M30) 시간: 133 µs; 0.00013300초

2016.06.22 11:47:37.309 OAC 변형 2(GBPUSD,M30) FF 시작: 1000

2016.06.22 11:47:37.309 OAC 변형 2(GBPUSD,M30) 최대: 3.06159260

2016.06.22 11:47:32.933 OAC 변형 2(GBPUSD,M30) ----------------------------------

2016.06.22 11:47:32.933 OAC 변형 2(GBPUSD,M30) 시간: 133 µs; 0.00013300초

2016.06.22 11:47:32.933 OAC 변형 2(GBPUSD,M30) FF 시작: 1000

2016.06.22 11:47:32.933 OAC 변형 2(GBPUSD,M30) 최대: 3.10159260

2016.06.22 11:47:07.584 OAC 변형 2(GBPUSD,M30) ----------------------------------

2016.06.22 11:47:07.584 OAC 변형 2(GBPUSD,M30) 시간: 180 µs; 0.00018000초

2016.06.22 11:47:07.584 OAC 변형 2(GBPUSD,M30) FF 시작: 1000

2016.06.22 11:47:07.584 OAC 변형 2(GBPUSD,M30) 최대: 3.04159260

즉, 나쁘지 않습니다.

 

따라서 위의 예는 함수 가져오기 를 통해 참가자 알고리즘을 테스트 스크립트에 연결하는 방법을 보여줍니다.

참가자의 알고리즘을 사용하는 이 특별한 방법이 조직된 이유를 상기시켜 드리겠습니다. 한편으로는 지적 재산권을 보호하기 위해 참가자의 알고리즘을 숨길 필요가 있고 다른 한편으로는 두 배심원단의 통제 및 검증 가능성 회원과 관객.

 

오늘 나는 테스트 할 것이다

그러나 하나의 게시물에서 동일한 파일의 첨부 파일과 함께 파일에 관한 규칙을 작성하고(Andrey, 이해합니다) 한 게시물에 게시하는 것이 바람직합니다. 지금 당장은 아니지만 출발점이 있어야 합니다.

 
Реter Konow :

이제 이 주제에서 스스로를 "초보자"로 분류하고 우승을 진지하게 생각하지 않는 모든 참가자에게 호소하고 싶습니다 .

이미 이해할 수 없는 작업을 크게 혼란스럽게 하고 순수한 수학으로 전환하는 공간의 많은 차원에 대한 완전한 "이론"을 폐기하면 FF가 방정식 임을 알 수 있습니다.

이 방정식은 그래프에 적용해야 분석 함수가 됩니다 .

그러나 질문이 있습니다 - 그것이 필요 합니까? - 그래프는 단순히 방정식 매개변수의 관계 패턴을 시각화하는 데 도움이 됩니다.

158페이지의 토론 후에 우리는 이미 작업의 본질을 공식화할 수 있습니다.

방정식 의 왼쪽에 있는 변수의 값이 가장 큰 방정식 의 오른쪽에 있는 변수의 값 을 선택하는 것이 필요합니다 .

목표는 무차별 대입보다 더 효율적으로 수행하는 것입니다.

모두.

더 나아가:

이 문제를 해결하기 위해 가치를 찾는 "진화"기술이 발명되었습니다. 다윈주의에서 비롯된 유추와 방법이 만들어졌습니다.

이 접근법의 효과는 논쟁의 여지가 있습니다. 아마도 이 문제를 해결하는 더 간단하고 효율적인 방법이 있을 것입니다.

내 관행은 일반적으로 받아 들여지는 접근 방식이 항상 가장 효과적인 것은 아니라는 것을 증명합니다.

나는 우리가 "진화론자들"을 쉽게 피할 수 있다고 확신합니다 ...

해보자!

게시물의 감정적 인 색상을 버리면 기본적으로 말한 내용이 사실입니다. 언급하는 것을 잊은 유일한 것은 FF 방정식 자체가 이 챔피언십의 틀 내에서 알려지지 않았다는 것입니다(실생활에서 알려질 수도 있고 알려지지 않을 수도 있음).

"불합리한 이론"에 관해서는 - 이 스레드에서 다른 곳에서는 사용되지 않고 이전에는 사용된 적이 없는 최적화 알고리즘의 원리에 대한 명확한 팁을 제공했습니다(적어도 사용 가능한 소스에서). 그리고 선택은 항상 연구원에게 달려 있습니다. 알고리즘에서 어떻게 그리고 무엇을 사용할 것인지입니다. 위의 예에는 다윈과 간접적으로 관련이 없는 알고리즘이 있습니다. 최적화 방법은 많이 있지만 아무도 없습니다. 적어도 저는 "다윈의 기원을 가져오는 것"이 더 낫다고 주장하지는 않았습니다.

글쎄, 행운을 빈다! 승리를 향해 전진하라!

 
나는 다섯 가지를 코딩하지 않았으며 수출입 작업에 대한 경험도 없었습니다. 귀하의 예를 올바르게 이해했는지 알려주십시오. 내 의견을 코드에 넣었습니다. 질문 하나 더 . FF가 공식으로 주어지면 나누기 또는 근 추출 작업이 있는지 여부. 0 또는 음수 값은 심각한 오류를 발생시키고 프로그램을 중지합니다 .
 // -- данный код находится на стороне жюри (организатора)---------------------
#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 :
나는 다섯 가지를 코딩하지 않았으며 수출입 작업에 대한 경험도 없었습니다. 귀하의 예를 올바르게 이해했는지 알려주십시오. 내 의견을 코드에 넣었습니다. 질문 하나 더 . FF가 공식으로 주어지면 나누기 또는 근 추출 작업이 있는지 여부. 0 또는 음수 값은 심각한 오류를 발생시키고 프로그램을 중지합니다 .

예, FF 챔피언십의 작업을 올바르게 이해하고 있습니다.

매개변수 배열 크기가 잘못된 경우 결과를 반환하는 것에 대한 유일한 수정은 참가자 알고리즘이 FF의 매개변수 수에 대해 알고 있고 잘못된 크기의 배열을 FF에 전달하면 이것이 문제입니다. FF가 아닌 참가자 알고리즘. 이 시점에서 생각해 보세요. 시장을 예로 들면 시장은 거래에서 "잘못된" 수의 전략 매개변수를 사용하고 있다고 말하지 않을 것이며, 단순히 부정적인 거래 결과를 얻게 될 것입니다. 시장에서 실수에 대한 이유를 설명하지 않고.

Your라는 단어는 Our라는 단어로 대체될 수 있고 You는 We라는 단어로 대체될 수 있습니다.

 
Igor Volodin :

오늘 나는 테스트 할 것이다

그러나 하나의 게시물에서 동일한 파일의 첨부 파일과 함께 파일에 관한 규칙을 작성하고(Andrey, 이해합니다) 한 게시물에 게시하는 것이 바람직합니다. 지금 당장은 아니지만 출발점이 있어야 합니다.

예제 파일을 사용 가능한 파일 저장소에 넣어 검색에 뛰어들지 않도록 하고 저장소에 대한 링크를 분기 시작 부분에 배치하는 것이 편리할 것입니다.

네, 하겠습니다.