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

 
Andrey Dik :

알고리즘의 첫 번째 버전에 대한 테스트 스크립트:

이러한 간단한 기능을 위해 인터페이스를 지나치게 복잡하게 만들었습니다. 불필요한 수출은 많지만 그에 반해 필요한 것은 부족하다. 나는 당신의 코드를 처음 이해한 것이 아니라 프로그래밍을 잘하지 못하는 사람들이 어떻게 느낄지 상상할 수 있습니다.

이제 나는 그것에 대해 생각하고 단순화된 내보내기 및 테스트 스크립트 작업의 나만의 버전을 제공할 것입니다.

 

FF 방정식의 매개변수 값을 찾는 "진화적" 접근 방식은 값 검색의 효율성을 높이는 것이 아니라 프로그래밍 방식으로 진화 과정을 시뮬레이션하기 위해 만들어졌을 가능성이 있습니다.

글쎄, 진화가 과학자들에 의해 표현되는 형태로 ...

고통스럽게도 접근 방식은 모든 진화론적 규범을 준수한다는 점에서 일관성이 있습니다...

 

제안:

1. 피트니스 함수는 이중 유형의 매개변수 배열을 허용하고 숫자가 클수록 더 나은 매개변수를 선택하여 숫자를 반환합니다. 피트니스 함수 프로토타입은 다음과 같습니다.

 double FF( double &array[]);

2. 피트니스 함수에는 FitnessParams 구조에 지정된 특정 매개변수가 있습니다. 구조에 대한 설명은 아래와 같습니다.

 //+------------------------------------------------------------------+
//| Параметры фитнес-функции (FF)                                    |
//+------------------------------------------------------------------+
struct FitnessParams
{
   int       limit_runs;           // Максимально допустимое количество вызовов FF
   int       count_params;         // Количество параметров, которое необходимо оптимизировать
   int       current_runs;         // Текущее количество вызовов функции
   double    current_max_value;   // Текущее найденное максимальное значение
   double    step_value;           // Минимальный шаг изменения параметра. 
   double    max_value;           // Максимальное значение, которое может принимать параметр
   double    min_value;           // Минимальное значение, которое может принимать параметр
   FitnessParams( void );
};
//+------------------------------------------------------------------+
//| Инициализация параметров фитнес-функции (FF) по-умолчанию        |
//+------------------------------------------------------------------+
FitnessParams::FitnessParams( void ) : limit_runs( 1000 ),
                                   count_params( 2 ),
                                   step_value( 0.1 ),
                                   max_value( 10.0 ),
                                   min_value(- 10.0 ),
                                   current_runs( 0 )
                                   
{
   current_max_value = min_value;
}

3. 피트니스 기능 및 해당 매개 변수는 외부 영향으로부터 보호되며 독립 라이브러리 에 있습니다..\\Scripts\\FF\\FF.ex5 누군가에 의해 변경됩니다.

4. 사용자 정의 최적화 알고리즘 및 검사 스크립트는 피트니스 기능 매개변수를 학습할 수 있습니다. Export.mqh 파일에 이 함수와 해당 매개변수의 필수 프로토타입이 포함된 이유는 무엇입니까? FF 매개변수를 얻으려면 ..\\Scripts\\FF\\FF.ex5에도 있는 매개변수 내보내기 기능을 사용하십시오.

 void    GetFitnessParams(FitnessParams& params);

5. 사용자 정의 최적화 알고리즘은 별도의 폐쇄된 사용자 라이브러리 ..\\Scripts\\FF\\ UserFindExtremum.ex5 에 있으며 사용자 측에서 별도로 컴파일됩니다. FindExtremum 함수는 사용자 라이브러리로 내 보내야 합니다. 이 함수는 검사 스크립트에 의해 호출됩니다. 다음은 완전한 함수 프로토타입입니다.

 //+------------------------------------------------------------------+
//| Экспорт пользовательской библиотеки поиска экстремума            |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\UserFindExtremum.ex5"
   void FindExtremum( void );
#import

6. 검사 스크립트는 해당 주소 공간에 해당 매개변수와 함께 피트니스 함수 ..\\Scripts\\FF\\FF.ex5의 라이브러리와 극한 검색을 위한 구성원의 라이브러리를 로드합니다.   ..\\스크립트\\FF\\UserFindExtremum.ex5. 그런 다음 FindExtremum 멤버 함수를 호출합니다.

7. 참가자 함수가 처리된 후 검사 스크립트는 참가자 함수에서 찾은 최대값과 이 최대값을 찾는 데 필요한 호출 수가 포함된 피트니스 함수의 매개변수를 요청합니다. 이러한 데이터를 기반으로 참가자 결과에 대한 보고서가 테이블 형식으로 생성됩니다.

 2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      ———————————————————————————————————————————
2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      Максимальное найденное значение: 3.1
2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      Досрочное выполнение алгритма: НЕТ
2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      Вызовов фитнес-функции потребовалось: 1001
2016.06 . 22 13 : 09 : 48.583 TestFF (EURUSD,H1)      Поиск экстремума выполнен за 0 мсек.

다음 포스팅에서는 필요한 파일과 사용 예시를 첨부하겠습니다.

 

.mqh 파일 내보내기 - 모든 참가자에 대해 사용 가능한 기능 및 매개변수 구조의 공통 목록

 //+------------------------------------------------------------------+
//|                                                       Export.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link        "https://www.mql5.com/ru/users/c-4"
//+------------------------------------------------------------------+
//| Параметры фитнес-функции (FF)                                    |
//+------------------------------------------------------------------+
struct FitnessParams
{
   int       limit_runs;           // Максимально допустимое количество вызовов FF
   int       count_params;         // Количество параметров, которое необходимо оптимизировать
   int       current_runs;         // Текущее количество вызовов функции
   double    current_max_value;   // Текущее найденное максимальное значение
   double    step_value;           // Шаг значений или дискретность. 
   double    max_value;           // Максимальное значение, которое может принимать ff-функция
   double    min_value;           // Минимальное значение, которое может принимать ff-функция
   FitnessParams( void );
};
//+------------------------------------------------------------------+
//| Инициализация параметров фитнес-функции (FF) по-умолчанию        |
//+------------------------------------------------------------------+
FitnessParams::FitnessParams( void ) : limit_runs( 1000 ),
                                   count_params( 2 ),
                                   step_value( 0.1 ),
                                   max_value( 10.0 ),
                                   min_value(- 10.0 ),
                                   current_runs( 0 )
                                   
{
   current_max_value = min_value;
}
//+------------------------------------------------------------------+
//| Экспорт библиотеки фитнесс-функций                               |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\FF.ex5"
   double FF( double &array[]);                       // Фитнес-функция, возвращающая значение тем больше, чем лучше подобраны значения в массиве array
   void    GetFitnessParams(FitnessParams& params);   // Возвращает параметры фитнесс-функции в виде структуры FitnessParams
#import
//+------------------------------------------------------------------+
//| Экспорт пользовательской библиотеки поиска экстремума            |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\UserFindExtremum.ex5"
   void FindExtremum( void );
#import

FF.mq5 파일은 라이브러리 형태의 피트니스 함수의 예입니다.

 //+------------------------------------------------------------------+
//|                                                           FF.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link        "https://www.mql5.com/ru/users/c-4"
#property library
#property strict
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Параметры фитнесс-функции, с которыми необходимо ознакомится     |
//| алгоритму поиска до начала работы. Получить эти параметры можно  |
//| с помощью функции GetFitnessParams                               |
//+------------------------------------------------------------------+
static FitnessParams FParams;
//+------------------------------------------------------------------+
//| Фитнес-функция, возвращающая значение тем больше, чем лучше      |
//| подобраны значения в массиве array                               |
//+------------------------------------------------------------------+
double FF( double &array[]) export
{ 
   if (FParams.current_runs > FParams.limit_runs)
       return FParams.min_value;
   FParams.current_runs++;
   if ( ArraySize (array) < FParams.count_params)
       return FParams.min_value; 
   double ff_value = (-( pow ( 2.4 + array [ 0 ], 2.0 ) + pow (array [ 1 ] - 2.3 , 2.0 ))+ 3.1415926 );
   if (ff_value > FParams.current_max_value)
      FParams.current_max_value = ff_value;
   return ff_value;
}
//+------------------------------------------------------------------+
//| Возвращает параметры фитнесс-функции                             |
//+------------------------------------------------------------------+
void GetFitnessParams(FitnessParams& params) export
{
   params = FParams;
}
//+------------------------------------------------------------------+

파일 TestFF.mq5 - 스크립트 형태의 테스트 알고리즘

 //+------------------------------------------------------------------+
//|                                                       TestFF.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link        "http://www.mql5.com"
#property version    "1.00"
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   uint begin_tiks = GetTickCount ();
   // Вызываем пользовательскую функцию поиска экстремума фитнес-функции
   FindExtremum();             
   uint end_tiks = GetTickCount ();
   // Получаем результаты поиска в качестве комплексного параметра
   FitnessParams params;      
   GetFitnessParams(params);
   // Подготавливаем отчет
   string yesno_count = params.current_runs >= params.limit_runs ? "НЕТ" : "ДА" ;
   printf ( "Поиск экстремума выполнен за " + ( string )(end_tiks - begin_tiks) + " мсек." );
   printf ( "Вызовов фитнес-функции потребовалось: " + ( string )params.current_runs);
   printf ( "Досрочное выполнение алгритма: " + yesno_count);
   printf ( "Максимальное найденное значение: " + DoubleToString (params.current_max_value, 1 ));
   printf ( "——————————————————————" );
}
//+------------------------------------------------------------------+

UserFindExtremum.mq5 파일은 라이브러리 형태로 극값을 찾기 위한 사용자 정의 함수입니다. 무작위 검색이 예로 사용됩니다.

 //+------------------------------------------------------------------+
//|                                             UserFindExtremum.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link       "http://www.mql5.com"
#property version   "1.00"
#property library
#property strict
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Алгоритм поиска экстремума, который будет вызван проверяющим    |
//| скриптом                                                         |
//+------------------------------------------------------------------+
void FindExtremum( void ) export
{
   FitnessParams params ;
   while ( params .current_runs < params .limit_runs)
   {
      GetFitnessParams( params );
       if ( params .current_max_value >= params .max_value)
         break ;
       double values[];
      ArrayResize(values, params .count_params);
       for ( int i = 0 ; i < params .count_params; i++) 
      {
         double random = RandomDouble( params .min_value, params .max_value);
        values[i] = SeInDiSp (random, params .min_value, params .max_value, params .step_value);
      }
      FF(values);
   }
}
//+------------------------------------------------------------------+
//| Выбор в дескретном пространстве                                  |
//+------------------------------------------------------------------+
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 RandomDouble( 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 )));
}
파일:
Export.mqh  3 kb
FF.mq5  2 kb
TestFF.mq5  2 kb
 
Vasiliy Sokolov :

File Export.mqh - 모든 참가자가 사용할 수 있는 기능의 공통 목록 및 매개변수 구조

FF.mq5 파일은 라이브러리 형태의 피트니스 함수의 예입니다.

파일 TestFF.mq5 - 스크립트 형태의 테스트 알고리즘

UserFindExtremum.mq5 파일은 라이브러리 형태의 사용자 정의 극한값 검색 기능입니다. 무작위 검색이 예로 사용됩니다.

모든 예에서 모든 것이 매우 명확하고 이해하기 쉽게 설명되어 있습니다. 작업에 많은 감사를 드립니다. )
 
Vasiliy Sokolov :

이러한 간단한 기능을 위해 인터페이스를 지나치게 복잡하게 만들었습니다. 불필요한 수출은 많지만 그에 반해 필요한 것은 부족하다. 나는 당신의 코드를 처음 이해한 것이 아니라 프로그래밍을 잘하지 못하는 사람들이 어떻게 느낄지 상상할 수 있습니다.

이제 단순화된 내보내기 및 테스트 스크립트 작업 버전을 생각하고 제공합니다.

왜 필요하지 않습니까?

어떤 필수품이 빠져 있습니까?

결국 참가자들에게 가능한 한 삶을 어렵게 만들기 위해서가 아니라 나는 모든 것을했고 첫 번째 날이 아니라 두 번째 날까지 모든 것을 생각했습니다.

 
Andrey Dik :

왜 필요하지 않습니까?

어떤 필수품이 빠져 있습니까?

결국 참가자들에게 가능한 한 삶을 어렵게 만들기 위해서가 아니라 나는 모든 것을했고 첫 번째 날이 아니라 두 번째 날까지 모든 것을 생각했습니다.

Andrei, 다른 사람은 모르지만 개인적으로 Vasily의 예가 더 좋았습니다. 범죄가 없습니다. 이건 제 주관적인 생각일뿐...

솔직히 말해서, 연결 인터페이스(귀하 또는 Vasily)를 선택하는 문제를 투표에 포함할 것을 제안합니다.

당신은 어떻게 생각하십니까?

 
Реter Konow :

Andrei, 다른 사람은 모르지만 개인적으로 Vasily의 예가 더 좋았습니다. 범죄가 없습니다. 이건 제 주관적인 생각일뿐...

솔직히 말해서, 연결 인터페이스(귀하 또는 Vasily)를 선택하는 문제를 투표에 포함할 것을 제안합니다.

당신은 어떻게 생각하십니까?

구체적으로 무엇을 더 좋아합니까?
그리고 Vasily의 반복되는 연결 유형의 예이지만 첫 번째 유형은 어디에 있습니까?
 
Andrey Dik :

왜 필요하지 않습니까?

어떤 필수품이 빠져 있습니까?

결국 참가자들에게 가능한 한 삶을 어렵게 만들기 위해서가 아니라 나는 모든 것을했고 첫 번째 날이 아니라 두 번째 날까지 모든 것을 생각했습니다.

귀하의 예에서 검색 작업은 부분적으로 검사 스크립트에 위임되었습니다. 옳지 않다. 유효성 검사 스크립트는 검색을 호출하고 결과만 확인해야 합니다.

모든 FF 옵션을 사용할 수 있는 것은 아닙니다. 예를 들어, 매개변수 단계(값 0.1), 가능한 최대 및 최소를 얻는 방법은 무엇입니까? 모든 사용자가 이 포럼을 읽고 단계가 0.1, 최소 -10.0 및 최대 +10.0으로 판명되었음을 이해하고 이러한 상수를 코드에 입력하고 FF 함수가 같은 방식으로 생각하기를 바라는 것은 확실히 좋습니다. . 그러나 그것은 좋은 방법으로 수행되는 방법이 아닙니다.

ServiceFunc1과 같은 많은 내보내기 기능은 특정 검색 알고리즘에서만 사용됩니다. 예를 들어 임의 검색에서는 사용할 필요가 없습니다. 그렇다면 사용자 라이브러리는 왜 내보내야 합니까? 이 모든 복잡한 내보내기 기능 조합이 단순히 필요하지 않다는 것을 이해하려면 테스트 작업을 직접 검색 작업과 분리하는 것으로 충분합니다.

추가 기능이 필요하지 않은 항목이 더 많습니다.

 
Andrey Dik :
구체적으로 무엇을 더 좋아합니까?
그리고 Vasily의 반복되는 연결 유형의 예이지만 첫 번째 유형은 어디에 있습니까?
두 번째, 세 번째, 110 연결 유형이 필요하지 않습니다. 단 하나의 보편적인 연결 유형이 필요합니다. 불필요한 구문 구조를 사용하지 않고. 아무도 ServiceFunc1 함수의 신성한 의미를 의아해하고 싶어하지 않습니다. 대신 피트니스 함수와 해당 매개변수를 채우는 규칙을 제공해야 합니다. 그리고 더 이상 없습니다.