기고글 토론 "유전 알고리즘-쉬워요" - 페이지 4

 
shurick:

라이브러리 작성자에게 많은 감사를 드립니다!

부모 검색 함수의 루프에 "cnt++;" 줄을 추가하지 않으면 무한 루프로 들어갈 수 있습니다!

실제로 어떤 경우에는 인구에 개인이 한 명뿐인 경우 루프가 무한대가 될 수있는 상황이있을 수 있습니다.

게시해 주셔서 감사합니다. 곧 변경하겠습니다.

추신 : 아마도 cnt++를 삽입하는 것을 잊어 버렸기 때문에이 변수를 입력 한 것 같습니다. :)

다른 부모를 찾는 "지속성"을 조절할 수 있도록 for () 연산자로 루프를 만들고 싶었지만 그다지 의미가 없다고 생각하여 마음을 바꿨습니다.

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 
joo 라이브러리를 사용하여 이시모쿠, MAKD 등 지표의 파라미터를 컴파일할 수 있나요?
 
Graff:
joo 이시모쿠, MAKD 등 지표의 매개변수 선택에 라이브러리를 사용할 수 있나요?

"어떤 트레이더의 최적화 작업에 라이브러리를 사용할 수 없나요?"라고 묻는다면. - 어떻게 대답해야 할지 모르겠습니다.

물론 가능합니다.

 
joo:

"어떤 트레이더의 최적화 작업에는 라이브러리를 사용할 수 없나요?"라고 묻는다면. - 어떻게 대답해야 할지 모르겠습니다.

물론 가능합니다.

바보 같은 질문이라 죄송하지만 저는 프로그래머가 아닙니다. 가능하다면 라이브러리가 여러 매개 변수를 하나의 지표(예: 이시모쿠, MAKD)에 일치시키는 데 사용되는 코드를 공유하여 그 작업을 명확히 해주시기 바랍니다.
 
Graff:
멍청한 질문이라 죄송합니다. 저는 프로그래머가 아닙니다. 가능하다면 라이브러리가 여러 매개 변수를 하나의 지표(예: 이시모쿠, MAKD)로 선택하는 데 사용되는 코드를 공유하여 작업을 명확하게 설명해 주세요.

질문은 전혀 어리석지 않습니다.

기사의 두 번째 예제를 사용하세요. ZZ 표시기 대신 다른 표시기로 대체하십시오. ZZ 상단을 읽는 대신 자신의 조건을 작성해야합니다 (예 : MACD, 예를 들어 동일한 대체 지그재그를 얻을 수 있지만 설정 한 규칙에 따라). 복잡한 것은 없습니다. 코드를 작성해 보세요. 실패하면 코드에서 문제가 있는 부분을 보여주면서 질문하세요. 관심이 있는 사람들은 자신의 작업을 해결하는 방법을 알게 될 것이고, 여러분과 모두에게 도움이 될 것입니다. 언어를 배우고 싶지 않으시면"작업"에 문의하세요.

 

2joo:

RemovalDuplicates() 함수의 본질을 알려주실 수 있나요? 질문은 다음과 같습니다. 동일한 염색체가 두 개 있는 경우 둘 다 중복으로 표시해야 하는지, 아니면 나중에 사용하기 위해 한 개를 중복으로 표시하지 않고 남겨둬야 하는지입니다.

또한 이 함수의 속도를 높이려면 Ch2 루프가 0에서 시작하는 점이 없기 때문에 Ch2 루프가 Ch+1 값으로 시작하는 것이 좋습니다:

      //Выбираем второй из пары...

      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)

그리고 내 질문에 대한 대답이 두 염색체가 모두 중복으로 표시되어 있다는 것입니다:

          if(cnt==GeneCount)
            chromosomeUnique[Ch2]=0;

합니다:

          if (cnt==GeneCount) {
            chromosomeUnique[Ch]=0;
            chromosomeUnique[Ch2]=0;
          }

그리고 하나의 염색체가 중복으로 표시되지 않도록 남겨 두어야한다는 것이 정답이라면 Ch2 루프는 어쨌든 Ch+1 값으로 시작해야합니다.

 
shurick:

2joo:

RemovalDuplicates() 함수의 핵심을 알려주실 수 있나요? 질문은 동일한 염색체가 두 개 있는 경우 둘 다 중복으로 표시해야 하는지, 아니면 그 중 하나를 중복으로 표시하지 않고 계속 사용해야 하는지입니다.

이 기능의 알고리즘은 다음과 같습니다:

모든 염색체에 고유성 기능 '1'을 표시합니다. 모든 염색체는 고유하다고 생각합니다.

동일한 염색체가 있는지 확인합니다. 이를 위해 모집단을 가상으로 복제하고 모든 염색체를 서로 비교하면서 염기서열 번호가 같은 쌍은 건너뜁니다. 중복이 발견되면 중복 기능 "0"으로 표시됩니다.

그런 다음 '0'으로 표시되지 않은 나머지 염색체를 모두 임시 배열에 복사합니다. 빈틈 없이 채워진 임시 배열을 얻었으며, 모집단에 얼마나 많은 고유 염색체가 남아 있는지 이미 알고 있습니다.

이제 남은 일은 염색체를 모집단에 다시 복사하는 것입니다. 보시다시피, 염색체 삭제는 없으며 고유 염색체는 모집단의 시작 부분으로만 이동합니다.


이 기능을 테스트하려면 스크립트를 작성하고 채워진 배열의 까다로운 조합을 수동으로 입력해 보세요. 함수가 얼마나 효율적으로/비효율적으로 작동하는지 확인할 수 있습니다. 배열에서 가능한 가장 작은 열 검사 횟수를 계산하고 이를 RemovalDuplicates() 함수가 열을 검사하는 횟수와 비교합니다.

 
joo:

ZY 이 함수를 테스트하려면 스크립트를 작성하고 채워진 배열의 까다로운 조합을 수동으로 입력해 보세요. 이 함수가 얼마나 효과적인지/비효율적인지 확인할 수 있습니다. 배열의 열을 검사하는 가능한 최소 횟수를 계산하고 이를 RemovalDuplicates() 함수가 열을 검사하는 횟수와 비교합니다.

"for (Ch2=Ch+1)" 루프를 시작하면 필요하고 충분한 반복 횟수가 2.5배 감소하고 중복 중 하나가 중복으로 표시되지 않습니다. 여기서 중복의 염색체 하나를 고유하게 남겨 두는 것이 얼마나 더 정확할지 궁금합니다! 즉, 함수의 임무는 동일한 염색체를 제거하는 것이지만 중복 된 염색체의 한 사본은 중복의 존재가 그 활력을 증명하지 않기 때문에 인구로 돌아가는 것이 더 나은 것 같습니다. 예를 들어, {1,3,4,7,7,7,6,7,8,8} 염색체 배열이 있는 경우 최적의 중복 제거는 다음과 같은 결과라고 생각합니다: {1,3,4,7,6,8}. 따라서 7번과 8번 염색체를 더 고려할 것입니다.
 
shurick:
"for (Ch2 = Ch+1)"루프의 시작 부분에서 필요하고 충분한 반복 횟수가 2 번 줄어들고 중복 된 염색체 중 하나는 중복으로 표시되지 않습니다. 여기서 중복된 염색체 중 하나의 염색체를 고유하게 남겨두는 것이 얼마나 더 정확한지 궁금합니다! 즉, 함수의 임무는 동일한 염색체를 제거하는 것이지만 중복 된 염색체의 한 사본은 중복의 존재가 그 활력을 증명하지 않기 때문에 인구로 돌아가는 것이 더 나은 것 같습니다. 예를 들어, {1,3,4,7,7,7,6,7,8,8} 염색체 배열이 있는 경우 최적의 중복 제거는 다음과 같은 결과라고 생각합니다: {1,3,4,7,6,8}. 따라서 7번과 8번 염색체를 더 고려할 것입니다.

cnt++에 대한 이전 발언은 타당했습니다. 하지만 이번에는 틀렸습니다. "만약에...?"라고 추측하지 말고 스크립트를 작성하고 함수를 테스트하고 결과를 보여줄 것을 제안합니다.

하나의 고유 한 염색체 만 남아 있고 나머지 정확한 사본은 중복으로 인식되어 "삭제"됩니다.

이것은 아마도 전체 UGA 알고리즘 중에서 가장 획기적인 기능 중 하나일 것입니다. 가장 많은 시간이 걸렸습니다. 그러나 그 안에는 오류가 없습니다.


추신 가장 중요한 것은 동일한 염색체를 반복적으로 확인하지 않아야한다는 것입니다.

고유성 검사 횟수는 필요한 최소한의 것입니다. for() 연산자의 실행 횟수에 대해 이야기하는 경우 중첩 된 변수에 매번 하나씩 증가하는 추가 변수를 도입하여 고유성 검사 횟수는 동일하게 유지하면서 (가능한 최소값으로) 줄일 수 있습니다. 이렇게 하면 함수 속도가 느려집니다.

PPS를 강조한다면

shurick:

....

중복된 염색체에서 하나의 염색체를 고유하게 남겨두는 것이 얼마나 더 정확할까요! 즉, 함수의 임무는 동일한 염색체를 제거하는 것이 지만 중복 된 염색체의 한 사본은 중복의 존재가 그 활력을 증명하지 않기 때문에 인구로 돌아가는 것이 더 나은 것 같습니다.

이 함수의 임무는 중복을 제거하는 것입니다. 그것이 바로 그 기능의 이름입니다. 동일한 염색체를 제거하는 것이 아닙니다. 차이점이 보이시나요? 이 기능은 염색체의 생존력을 기준으로 염색체를 구분하지 않습니다. 따라서 중복된 염색체 없이 고유한 염색체만 남게 됩니다.

만약을 대비해 한 가지 더 설명하겠습니다.

최대화 문제인 20개의 염색체로 구성된 집단이 있다고 가정해 보겠습니다(단순함과 명확성을 위해 단일 정수의 유전자로 설명하겠습니다):

|7|2|3|9|2|4|5|3|3|5|6|2|4|3|5|10|6|7|7|2|

즉, 유전자를 포함하는 염색체 집단에서

2 - 4개

3 - 4 조각

4 - 2 조각

5 - 3 조각

6 - 2 개

7 - 3개

9 - 1개

10 - 1 조각.

총 - 20개의 염색체 조각.

중복을 제거한 후 모집단은 다음과 같이 8개 염색체가 남게 됩니다:

|7|2|3|9|4|5|6|10|

따라서 고유한 염색체는 하나만 남고 나머지는 중복된 것으로 함수 호출 후 "삭제"됩니다.

삭제됩니다.

PopulationRanking();

를 함수 끝에 추가합니다.

RemovalDuplicates()

모집단은 다음과 같이 보일 것입니다:

|10|9|7|6|5|4|3|2|

 
joo:

PPPS 혹시 모르니 다시 한 번 설명하겠습니다.

중복 제거에 대한 질문에 대해 만족스럽게 답변해 주셔서 감사합니다. 루프의 패스 횟수 감소를 보여주는 원본 및 최적화 된 기능을 보여주는 스크립트 코드를 첨부합니다. 현재 댓글에서 저는 함수의 버그를 지적하는 것이 아니라 최적화를 제안하고 있으며, 저의 주요 목표는 중복 제거의 원리를 알아내는 것이었고 이에 대한 포괄적 인 답변을 받았습니다. 라이브러리와 기능에 대한 설명에 다시 한 번 감사드립니다.

기능 최적화 점검 스크립트 결과

파일: