MQL5의 OOP에 대한 질문 - 페이지 95

 
Maxim Kuznetsov :

"빨간 단어"보다는 GA에 대해. 그레이 코드가 수렴에 어떻게 도움이 될까요? 그건 그냥 이론상...

동일한 성공으로 무작위로 혼합 할 수 있습니다

아무말 안할게 인터넷에 쓰는거 다 안믿고 다 확인해보는데

다음은 그레이 코드 및 그 반대로 변환하기 위한 작업 코드입니다.

 //+------------------------------------------------------------------+
uint IntToGrey( const uint value ) // https://e-maxx.ru/algo/gray_code
  {   return ( value ^ ( value >> 1 )); }
//+------------------------------------------------------------------+
uint GreyToInt( const uint value ) // https://e-maxx.ru/algo/gray_code
  {
   uint n = 0 ;
   for ( uint g = value ; g != 0 ; g >>= 1 )
     {
      n ^= g;
     }
   return (n);
  }
//+------------------------------------------------------------------+
 
그리고 이것이 유전 알고리즘 에 어떤 영향을 미칠 수 있습니까? 유전적인 것은 순전히 유전적이라면 값에 반응하지 않아야 합니다. 어떤 종류의 평균화를 추가로 사용하거나 경사하강법을 사용하면 효과가 있을 수 있습니다. 그러나 그런 다음 문제를 직접 해결하는 것이 좋습니다. 배열을 통해 매개변수를 필터링하고 배열을 혼합합니다. 속성 창에서 최적화할 파라미터의 값은 배열 요소의 인덱스이며, EA 자체에서는 배열의 값을 사용합니다. 그런 다음 옵티마이저를 속이는 것으로 판명됩니다. 그러나 평균화 또는 경사하강법으로 인해 수렴이 발생하는 경우에만 가능합니다. 그러나 이것이 순전히 유전적 알고리즘이라면 이 코딩이 어떤 용도로 사용될 수 있는지 상상할 수 없습니다. 점은 무엇인가? 다리는 어디서 자라나요?
 

이 코드가 있습니다:

 class A
{
private :
   const int _a;
public :
   A( const int a): _a(a) { Print (_a); }
};
//+------------------------------------------------------------------+
class B
{
private :
   const A a;
public :
   B( const int b): a(b) {}
};
//+------------------------------------------------------------------+
void OnStart ()
{
   B b( 3 ); // 3
}
//+------------------------------------------------------------------+

모든 것이 정상이지만 객체 A의 배열이 필요합니다. 다음과 같이 필요합니다.

 class B
{
private :
   const A a[ 2 ];
public :
   B( const int b): a[ 0 ](b),a[ 1 ](b) {}   //'[' - member(s) initialization expected
                                       // 'a' - explicit initializer for arrays not allowed
};

포인터를 사용하지 않고 객체 배열의 생성자를 호출할 수 있습니까?

 
Igor Makanu :

이 코드가 있습니다:

모든 것이 정상이지만 객체 A의 배열이 필요합니다. 다음과 같이 필요합니다.

포인터를 사용하지 않고 객체 배열의 생성자를 호출할 수 있습니까?

아니요. 목발을 통해서만.
 

이 코드에서 가능합니까?

 //+------------------------------------------------------------------+
struct LIST;
struct MyStruct
{
   double             d_data;
   int                i_data;
   MyStruct() {}
   MyStruct( const int i_v, const double d_v): d_data(d_v), i_data(i_v) {}
   LIST               operator +(MyStruct &value)
   {
      LIST result;
       ArrayResize (result.arr, 2 , 10 );
      result.arr[ 0 ] = this ;
      result.arr[ 1 ] = value;
       return (result);
   }
   MyStruct           operator *( const double mult)
   {
      MyStruct result = this ;
      result.d_data *= mult;
       return (result);
   }
};
//+------------------------------------------------------------------+
struct LIST
{
   MyStruct          arr[];
   LIST               operator +(MyStruct &value)
   {
       int last = ArraySize ( this .arr);
       ArrayResize ( this .arr, last + 1 , 10 );
       this .arr[last] = value;
       return ( this );
   }
};
//+------------------------------------------------------------------+
void OnStart ()
{
   MyStruct a( 1 , 1.11 ), b( 2 , 2.22 ), c( 3 , 3.33 );
   LIST x = a + b + c * 2 ;
   ArrayPrint (x.arr);
//    [d_data] [i_data]
//[0]  1.11000        1
//[1]  2.22000        2
//[2]  6.66000        3
}
//+------------------------------------------------------------------+

LIST 의 경우 템플릿/템플릿을 만드시겠습니까?

처음에는 작동하지 않았습니다 :(

 
Igor Makanu :

이 코드에서 가능합니까?

LIST 의 경우 템플릿/템플릿을 만드시겠습니까?

처음에는 작동하지 않았습니다 :(

이것. 가져가다

UPD: 흠... 글쎄요, 당신은 현명합니다)))

UPD: 참마를 잡아라))))

 //+------------------------------------------------------------------+
template < typename T>
struct LIST
{
   T          arr[];
   LIST<T>               operator +(T &value)
   {
       int last = ArraySize (arr);
       ArrayResize (arr, last + 1 , 10 );
      arr[last] = value;
       return ( this );
   }
};
//+------------------------------------------------------------------+
struct MyStruct
{
   double             d_data;
   int                i_data;
   MyStruct() {}
   MyStruct( const int i_v, const double d_v): d_data(d_v), i_data(i_v) {}
   LIST<MyStruct>               operator +(MyStruct &value)
   {
      LIST<MyStruct> result;
       ArrayResize (result.arr, 2 , 10 );
      result.arr[ 0 ] = this ;
      result.arr[ 1 ] = value;
       return (result);
   }
   MyStruct           operator *( const double mult)
   {
      MyStruct result = this ;
      result.d_data *= mult;
       return (result);
   }
};
//+------------------------------------------------------------------+
void OnStart ()
{
   MyStruct a( 1 , 1.11 ), b( 2 , 2.22 ), c( 3 , 3.33 );
   LIST<MyStruct> x = a + b + c * 2 ;
   ArrayPrint (x.arr);
//    [d_data] [i_data]
//[0]  1.11000        1
//[1]  2.22000        2
//[2]  6.66000        3
}
 
Vladimir Simakov :

이것. 가져가다

UPD: 흠... 글쎄요, 당신은 현명합니다)))

UPD: 참마를 잡아라))))

고맙습니다! - 작동합니다!

그리고 무슨 생각을 했어? 코드는 최소한이며 작업을 수행합니다. 구조 배열을 얻고 싶었습니다. 목록이 항상 편리한 것은 아니며 모든 것이 작동합니다. 이 코드를 사용하는 비표준 상황을 시뮬레이션할 수 있다는 것은 분명하지만 12줄로 된 코드

 

다른 사람의 개인 필드에 액세스할 때 이 코드에서 컴파일러 오류가 발생하지 않는 이유는 다음과 같습니다.

 class A
{
private :
   int _value;
public :
   void set ( const int value )      { _value = value ;    }
   int    get ()                     { return (_value);    }
   void set (A &a, const int value ){ a._value = value ;  }
};

void OnStart()
{
  A x,y;
  x. set ( 10 );
  y. set ( 20 );
  Print( "x = " ,x. get ());   // 10
  Print( "y = " ,y. get ());   // 20
   y. set (x, 777 );
  Print( "x = " ,x. get ());   // 777
  Print( "y = " ,y. get ());   // 20
}
//+------------------------------------------------------------------+
 
이것은 당신의 개인 필드입니다
 
Andrei Trukhanovich :
이것은 당신의 개인 필드입니다

알았어 고마워!

파생 클래스 가 개인 필드를 변경하는 것과 같은 방식으로 상위 클래스에 있는 경우 "합법적"입니까?

저것들. 다음과 같이 다소:

 class B: private A
{
        A a;
         void setA(A &obj, const int value ) { a. set (obj, value ); }
}
....
A x;
B y;
y.(x. 55 )