기사의 무료 라이브러리에서 유전자형으로 작업하세요. FF에서 표현형으로 작업합니다(예 2에서와 같이).
위의 내용은 표현형을 FF에서 처리하는 경우에도 라이브러리가 똑같이 효율적으로 작동하지만, 반복 횟수(FF 실행)는 GA가 표현형으로 직접 작업하는 경우보다 훨씬 더 많아집니다(검색 공간 세부 사항이 증가하기 때문에). 한계에서는 (표현형 세분화 없이) 검색이 연속적인 검색 공간으로 향하는 경향이 있습니다.
이 포럼 스레드에 글을 쓰기 전에 귀하의 기사와 UGA 알고리즘의 과정을 올바르게 이해했는지 스스로 명확히하고 싶습니다:
1) 특정 작업에 대한 UGA의 입력 매개 변수 설정.
---UGA
2) 유전자를 무작위로 결합하여 부모의 초기 식민지 만들기
2.2)이 식민지 각각에 대한 FF 결과 계산
2.3)클론 제거.
3)해당 군집의 모든 개체에서 최상의 FF 결과 결정
4) 첫 번째 식민지에서 자손의 식민지를 만드는 주기를 시작합니다. 자손은 도구를 사용하여 생성됩니다: 크로스오버, 인공 및 자연 돌연변이, 유전자 복제 및 유전자 차용, 여기서 다음과 같은 도구를 사용합니다.
크로스오버 - 부모 염색체의 일부를 교환합니다,
인공 돌연변이 - 범위를 벗어난 유전자 선택 (부모 1의 유전자, 부모 2의 유전자).
Est. 돌연변이 - 범위에서 유전자 선택 (유전자 범위의 최소 , 유전자 범위의 최대).
복제 - 부모 유전자의 값에 가깝지만 특정 오프셋이있는 범위의 유전자 선택.
유전자 차용 - 유전자 수와 동일한 수의 부모로부터 "조립 된 개체"를 생성합니다.
5)클론 삭제
6)각 식민지에 대한 FF 결과 계산
7)후손 개체의 결과와 기준 결과의 비교 및 가능한 교체. 교체시 카운터 "기준 값의 변경이없는 에포크"가 재설정됩니다.
8) 모든 개인을 최고에서 최악으로 정렬합니다.
9) -->항목 4
10)Y의 변화가 없는 에포크가 발생하면 종료하고 찾은 기준값을 출력합니다.
튜토리얼이 아닌 토론 스레드이지만 조언을 구할 곳이 없어서 미리 사과드립니다. 저는 사실 GA를 님의 글에서 처음 만났기 때문에 (님의 글 이전에는 터미널 테스터에서 "빠른(유전 알고리즘)"이라는 단어가 무슨 뜻인지도 몰랐습니다) 제 지식과 경험 (약 2 개월 전에 MQL5로 프로그래밍을 시작했습니다)이 약간 제한적입니다.
GA 알고리즘을 이해하면 OOP에 이식하려고 노력할 것입니다. 사실, 나는 그것을 공부하기 시작했습니다. 나는 이미 직접 검색으로 자체 최적화하는 거래 모델을 구현했지만 아직 GA를 사용하지 않았습니다. ( https://www.mql5.com/ru/articles/217 기사에 설명 된 원칙에 따른 모델 ).
В статье автор расскажет об эволюционных вычислениях с использованием генетического алгоритма собственной реализации. Будет показано на примерах функционирование алгоритма, даны практические рекомендации по его использованию.
double Chromosome[]; //최적화된 함수 인자 집합 - 유전자//(예: 신경망 가중치 등) - 염색체int GeneCount =0; // 염색체 내 유전자 수double RangeMinimum =0.0;//최소 검색 범위double RangeMaximum =0.0;//검색 범위의 최대값double Precision =0.0;//검색 단계int OptimizeMethod =0; //1-최소, 기타-최대
여기서 염색체 배열은 무엇입니까? 최적화 된 매개 변수의 가능한 값은 무엇입니까?
예를 들어 "최소 로트 크기"를 0.1에서 1 범위(최소 로트 단계 0.1)로 최적화하는경우 ,
배열은 {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, 염색체 1의 유전자 수, 최소 0.1 최대 1.0, 스텝 0.1 ? 맞나요?
그리고 관련 질문으로, 이러한 배열에 입력하는 방법(예: 최적화 손절매 [10...500], 이익 실현 [10...500], 최소 로트 크기 [0.1...1.0] 및 추적 플래그(추적 사용 여부) [0...1])은 어떻게 입력할까요?
일반적으로 가능한 값의 유형, 최소값 및 최대값이 다른 매개 변수를 최적화 할 때 입력 데이터는 어떻게 표시되어야합니까?
그러나 이 경우 실제 유전자가 아닌 값의 정확성 처리는 FF에서 수행해야 합니다. 즉, 긴, 두 배, 부울 유형을 최적화하면 UGA는 모든 유형에 대해 실제 값을 생성하며, 부울의 경우 RangeMinimum에서 RangeMaximum까지의 범위에는 많은 유전자 변형이 있으며 실제로는 1과 0 두 값만 사용할 수 있습니다. 제가 올바르게 이해했나요? 그리고 이미 FF에서 올바른 값의 선택이 이루어질까요?
mi__x__an: 그러나 이 경우 실제 유전자가 아닌 값의 정확성 처리는 FF에서 수행해야 합니다. 즉, 긴, 두 배, 부울 유형을 최적화하면 UGA는 모든 유형에 대해 실제 값을 생성하며, 부울의 경우 RangeMinimum에서 RangeMaximum까지의 범위에는 많은 유전자 변형이 있으며 실제로는 1과 0 두 값만 사용할 수 있습니다. 제가 올바르게 이해했나요? 그리고 이미 올바른 값의 선택은 FF에서 수행됩니까?
정답, 이것이 적합하지 않은 경우 이진 유전 알고리즘 (예 : 테스터에서 구현 된 것과 같은)을 사용해야합니다. 네 번째 포럼에 이에 대한 기사가 있습니다.
Urain: 맞습니다. 이것이 적합하지 않은 경우 이진 유전 알고리즘 (예 : 테스터에서 구현 된 것과 같은)을 사용해야합니다. 네 번째 포럼에 이에 대한 기사가 있습니다.
아니요, 요점은 다릅니다. 이 알고리즘은 이러한 경우에도 완벽하게 사용할 수 있습니다.
mi__x__an:
그러나이 경우 실제 유전자가 아닌 값의 정확성 처리는 FF에서 수행해야합니다. 즉, 긴, 이중, 부울 유형을 최적화하면 UGA는 모든 유형에 대해 실제 값을 생성하고, 부울의 경우 RangeMinimum에서 RangeMaximum까지 다양한 범위의 유전자가 있으며 실제로는 1과 0 두 값만 사용할 수 있습니다. 제가 올바르게 이해했나요? 그리고 이미 FF에서 올바른 값의 선택이 이루어질까요?
표현형을 사용한 모든 연산은 FF에서 수행해야 합니다. 그것은 유전자형에서 표현형으로 디코딩하는 문제입니다.
최적화된 매개변수가 부울 유형이고 참과 거짓의 두 가지 변형만 가능하다고 가정해 봅시다. 그러면 디코딩은 다음과 같이 됩니다:
이 유전자의 가능한 모든 다양한 변이(유전자형)를 통해 우리는 단 두 가지 표현형만 얻을 수 있습니다. 이것은 살아있는 자연에서도 마찬가지입니다.
그러나 이로부터 자연스러운 결과는 문제를 해결하는 데 필요한 것보다 더 많은 염색체 변이가 생성되고 (따라서 FF가 계산되는 횟수가 더 많아집니다). 즉, 최적화에 시간이 더 오래 걸립니다. 이미 언급했습니다. 염색체 바이너리 인코딩의 경우에도 마찬가지입니다. 여전히 작업별 표현형으로 디코딩해야 합니다.
하지만. 바이너리 코딩의 경우와 실수로 유전자를 표현하는 경우 모두 각 최적화된 매개변수에 대해 검색 단계와 단계를 설정하면 불필요한 FF 계산(가능한 염색체 변이체 수를 줄이기 위해)을 피하는 것이 매우 쉽습니다. 즉, 불필요한 염색체 변형을 미리 차단합니다(이는 이진 코딩을 사용하는 표준 옵티마이저에서 이미 수행됨). 이 작업은 문서에서 GA에 대해서도 수행할 수 있으며, 각 유전자에 대한 경계와 단계를 설정하는 기능, 즉 GA가 표현형과 직접 작업할 수 있도록 적절한 기능을 추가하기만 하면 됩니다.
하지만 라이브러리에서 각 유전자에 대한 경계와 단계를 지정해야 하기 때문에 유연성이 떨어집니다.
트레이딩 모델 옵티마이저에서 제가 사용한 방법은 최선도, 최악도 아닐 것입니다:
1 - 최적화된 파라미터의 클래스 - CObject 상속자
class COptimizatedParam: public CObject
{
public:
string name; //имя оптимизируемого параметра, требуется для выполнения ФФ(в моем случае у меня модель полностью так и работает как работала, только с виртуальным аккаунтом)
string type; //тип оптимизируемого параметра, требуется для см. выше
string on; //с какого значения начать выполнение -минимум
string step; //шаг
string end; //максимум
stringvalue; //в моем случае инициализация модели происходит по тому же CList, который передан функции оптимизации и value -текущее значение оптимизируемого параметра
이제 질문: 최적화된 파라미터에 대한 정보가 이 최적화된 파라미터 클래스를 통해 전달되는 입력 데이터로 CList를 만들고, UGA 라이브러리 자체에서 각 유전자에 필요한 만큼의 경계와 단계를 생성하는 것이 합리적일 것입니다. 이렇게 하면 더 많은 유연성을 제공하고 유전형이 아닌 표현형 클론을 생성하기 위해 불필요하게 FF를 실행하는 횟수를 줄일 수 있습니다.
기사의 무료 라이브러리에서 유전자형으로 작업하세요. FF에서 표현형으로 작업합니다(예 2에서와 같이).
위의 내용은 표현형을 FF에서 처리하는 경우에도 라이브러리가 똑같이 효율적으로 작동하지만, 반복 횟수(FF 실행)는 GA가 표현형으로 직접 작업하는 경우보다 훨씬 더 많아집니다(검색 공간 세부 사항이 증가하기 때문에). 한계에서는 (표현형 세분화 없이) 검색이 연속적인 검색 공간으로 향하는 경향이 있습니다.
좋은 밤 되세요.
훌륭한 기사에 감사드립니다.
처음에는 조금 복잡했지만 어느 정도 알아 냈습니다.
이 포럼 스레드에 글을 쓰기 전에 귀하의 기사와 UGA 알고리즘의 과정을 올바르게 이해했는지 스스로 명확히하고 싶습니다:
1) 특정 작업에 대한 UGA의 입력 매개 변수 설정.
---UGA
2) 유전자를 무작위로 결합하여 부모의 초기 식민지 만들기
2.2)이 식민지 각각에 대한 FF 결과 계산
2.3)클론 제거.
3)해당 군집의 모든 개체에서 최상의 FF 결과 결정
4) 첫 번째 식민지에서 자손의 식민지를 만드는 주기를 시작합니다. 자손은 도구를 사용하여 생성됩니다: 크로스오버, 인공 및 자연 돌연변이, 유전자 복제 및 유전자 차용, 여기서 다음과 같은 도구를 사용합니다.
크로스오버 - 부모 염색체의 일부를 교환합니다,
인공 돌연변이 - 범위를 벗어난 유전자 선택 (부모 1의 유전자, 부모 2의 유전자).
Est. 돌연변이 - 범위에서 유전자 선택 (유전자 범위의 최소 , 유전자 범위의 최대).
복제 - 부모 유전자의 값에 가깝지만 특정 오프셋이있는 범위의 유전자 선택.
유전자 차용 - 유전자 수와 동일한 수의 부모로부터 "조립 된 개체"를 생성합니다.
5)클론 삭제
6)각 식민지에 대한 FF 결과 계산
7)후손 개체의 결과와 기준 결과의 비교 및 가능한 교체. 교체시 카운터 "기준 값의 변경이없는 에포크"가 재설정됩니다.
8) 모든 개인을 최고에서 최악으로 정렬합니다.
9) -->항목 4
10)Y의 변화가 없는 에포크가 발생하면 종료하고 찾은 기준값을 출력합니다.
튜토리얼이 아닌 토론 스레드이지만 조언을 구할 곳이 없어서 미리 사과드립니다. 저는 사실 GA를 님의 글에서 처음 만났기 때문에 (님의 글 이전에는 터미널 테스터에서 "빠른(유전 알고리즘)"이라는 단어가 무슨 뜻인지도 몰랐습니다) 제 지식과 경험 (약 2 개월 전에 MQL5로 프로그래밍을 시작했습니다)이 약간 제한적입니다.
GA 알고리즘을 이해하면 OOP에 이식하려고 노력할 것입니다. 사실, 나는 그것을 공부하기 시작했습니다. 나는 이미 직접 검색으로 자체 최적화하는 거래 모델을 구현했지만 아직 GA를 사용하지 않았습니다. ( https://www.mql5.com/ru/articles/217 기사에 설명 된 원칙에 따른 모델 ).
미리 감사드립니다.
mi__x__an:
...귀하의 기사와 UGA 알고리즘의 과정을 올바르게 이해했는지 직접 확인하고 싶습니다.
안녕하세요 .
신속한 답변에 감사드립니다.
몇 가지 질문이 있습니다.
여기서 염색체 배열은 무엇입니까? 최적화 된 매개 변수의 가능한 값은 무엇입니까?
예를 들어 "최소 로트 크기"를 0.1에서 1 범위(최소 로트 단계 0.1)로 최적화하는경우 ,
배열은 {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, 염색체 1의 유전자 수, 최소 0.1 최대 1.0, 스텝 0.1 ? 맞나요?
그리고 관련 질문으로, 이러한 배열에 입력하는 방법(예: 최적화 손절매 [10...500], 이익 실현 [10...500], 최소 로트 크기 [0.1...1.0] 및 추적 플래그(추적 사용 여부) [0...1])은 어떻게 입력할까요?
일반적으로 가능한 값의 유형, 최소값 및 최대값이 다른 매개 변수를 최적화 할 때 입력 데이터는 어떻게 표시되어야합니까?
답변해 주셔서 감사합니다.
여기서 염색체 배열이란 무엇인가요? 최적화된 파라미터의 가능한 값은 무엇인가요?
예를 들어 '최소 로트 크기'를 0.1에서 1 범위(최소 로트 단계는 0.1)로 최적화하는경우 ,
배열은 {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, 염색체 1의 유전자 수, 최소 0.1 최대 1.0, 스텝 0.1 ? 맞나요?
그리고 관련 질문으로, 이러한 배열에 입력하는 방법(예: 최적화 손절매 [10...500], 이익 실현 [10...500], 최소 로트 크기 [0.1...1.0] 및 추적 플래그(추적 사용 여부) [0...1])은 어떻게 입력할까요?
일반적으로 가능한 값의 유형, 최소값 및 최대값이 다른 매개 변수를 최적화 할 때 입력 데이터는 어떻게 표시되어야합니까?
답변해 주셔서 감사합니다.
아니요,
염색체[]는 주석이 말하는 것과 정확히 일치합니다.
첫 번째 인덱스 [0]은 개인의 피트니스 값입니다. 나머지는 주어진 범위 내에서 최적화된 매개 변수입니다. 이것이 유전자형입니다.
표현형(손절, 이익 실현, 거래량, 지표 등)은 FF(염색체 유전자 범위에서 최적화된 파라미터의 스케일링)로 작업합니다:
예를 들어, 유전자가 [-1;1] 범위로 설정되면 다음과 같습니다.
인덱스 0: FF 값 <---------------------------------------------------------[8;8]//파이/2 8로 피벗.
첫 번째 지수: 스톱로스 [10..500] <------------------------------------------------ [-1;1]
2차 지수: 테이크프로핏 [10..500] <--------------------------------------------- [-1;1]
세 번째 지수: 최소 랏 거래량 [0.1...1.0] <--------------------------------------- [-1;1]
4번째 지수: 후행 플래그(후행 사용 여부)[0..1] <------ [-1;1]
또한 Chromosome[] 배열에는 5개의 셀이 있습니다. 예를 들어, 염색체는 {0.2, 0.3, -0.8, 0.1, 0.9;}와 같이 보일 수 있습니다.
그러나 이 경우 실제 유전자가 아닌 값의 정확성 처리는 FF에서 수행해야 합니다. 즉, 긴, 두 배, 부울 유형을 최적화하면 UGA는 모든 유형에 대해 실제 값을 생성하며, 부울의 경우 RangeMinimum에서 RangeMaximum까지의 범위에는 많은 유전자 변형이 있으며 실제로는 1과 0 두 값만 사용할 수 있습니다. 제가 올바르게 이해했나요? 그리고 이미 올바른 값의 선택은 FF에서 수행됩니까?
그렇다면 개인적으로 이 단점을 없애는 가장 좋은 방법은 염색체 유전자 값을 FF에서 사용할 수 있는 값으로 보정하는 서비스 기능을 도입하는 것입니다.
-->후손 생성 -->유전자 값을 실제 사용 가능한 값으로 조정 -->클론 삭제 --> FF 호출.
이 과정을 거치면 UGA 성능에 큰 영향을 미칠 것이라고 생각하시나요? 이론적으로는 한 파라미터를 최적화하는 단계가 다른 파라미터보다 크면 FF 실행 횟수를 줄여야 합니다.
맞습니다. 이것이 적합하지 않은 경우 이진 유전 알고리즘 (예 : 테스터에서 구현 된 것과 같은)을 사용해야합니다. 네 번째 포럼에 이에 대한 기사가 있습니다.
아니요, 요점은 다릅니다. 이 알고리즘은 이러한 경우에도 완벽하게 사용할 수 있습니다.
mi__x__an:
그러나이 경우 실제 유전자가 아닌 값의 정확성 처리는 FF에서 수행해야합니다. 즉, 긴, 이중, 부울 유형을 최적화하면 UGA는 모든 유형에 대해 실제 값을 생성하고, 부울의 경우 RangeMinimum에서 RangeMaximum까지 다양한 범위의 유전자가 있으며 실제로는 1과 0 두 값만 사용할 수 있습니다. 제가 올바르게 이해했나요? 그리고 이미 FF에서 올바른 값의 선택이 이루어질까요?
표현형을 사용한 모든 연산은 FF에서 수행해야 합니다. 그것은 유전자형에서 표현형으로 디코딩하는 문제입니다.
최적화된 매개변수가 부울 유형이고 참과 거짓의 두 가지 변형만 가능하다고 가정해 봅시다. 그러면 디코딩은 다음과 같이 됩니다:
여기서 유전자는 염색체의 특정 유전자입니다.
이 유전자의 가능한 모든 다양한 변이(유전자형)를 통해 우리는 단 두 가지 표현형만 얻을 수 있습니다. 이것은 살아있는 자연에서도 마찬가지입니다.
그러나 이로부터 자연스러운 결과는 문제를 해결하는 데 필요한 것보다 더 많은 염색체 변이가 생성되고 (따라서 FF가 계산되는 횟수가 더 많아집니다). 즉, 최적화에 시간이 더 오래 걸립니다. 이미 언급했습니다. 염색체 바이너리 인코딩의 경우에도 마찬가지입니다. 여전히 작업별 표현형으로 디코딩해야 합니다.
하지만. 바이너리 코딩의 경우와 실수로 유전자를 표현하는 경우 모두 각 최적화된 매개변수에 대해 검색 단계와 단계를 설정하면 불필요한 FF 계산(가능한 염색체 변이체 수를 줄이기 위해)을 피하는 것이 매우 쉽습니다. 즉, 불필요한 염색체 변형을 미리 차단합니다(이는 이진 코딩을 사용하는 표준 옵티마이저에서 이미 수행됨). 이 작업은 문서에서 GA에 대해서도 수행할 수 있으며, 각 유전자에 대한 경계와 단계를 설정하는 기능, 즉 GA가 표현형과 직접 작업할 수 있도록 적절한 기능을 추가하기만 하면 됩니다.
하지만 라이브러리에서 각 유전자에 대한 경계와 단계를 지정해야 하기 때문에 유연성이 떨어집니다.
트레이딩 모델 옵티마이저에서 제가 사용한 방법은 최선도, 최악도 아닐 것입니다:
1 - 최적화된 파라미터의 클래스 - CObject 상속자
2-주요 일반 모델의 가상 기능:
virtual CList *OptimizatedParams()각 특정 모델이 자체적으로 최적화 된 매개 변수 목록을 만들 수 있습니다.
3. 최적화 함수 - 필요한 모든 값을 재귀적으로 열거합니다.
열거된 모든 유형은 최적화 함수로 처리할 수 있습니다.
이제 질문: 최적화된 파라미터에 대한 정보가 이 최적화된 파라미터 클래스를 통해 전달되는 입력 데이터로 CList를 만들고, UGA 라이브러리 자체에서 각 유전자에 필요한 만큼의 경계와 단계를 생성하는 것이 합리적일 것입니다. 이렇게 하면 더 많은 유연성을 제공하고 유전형이 아닌 표현형 클론을 생성하기 위해 불필요하게 FF를 실행하는 횟수를 줄일 수 있습니다.