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

 
joo:

1) 스토리텔러? 흠, 안타깝게도 유머를 이해하지 못했습니다. 데이터베이스 확인은 GetFitness(historyHromosomes) 에서 호출되는 CheckHistoryChromosomes(chromos,historyHromosomes ) 함수에서 이루어집니다. 그렇기 때문에 FF를 반복적으로 실행하지 않는다고 정확하게 말한 것입니다.

2) 데이터베이스와의 조정은 유전자별 확인을 통해 이루어집니다. 그리고 각 유전자는 새로운 염색체가 나타나면 SelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) 에 의해 정규화됩니다. 따라서 여기에도 "동화"는 없습니다.

3) 2) 참조

1,2,3) 알겠습니다. 거의. 정규화는 실제로 존재합니다. 그러나 여전히 "간격이 없는" 실수를 비교하여 동등성을 비교할 이유는 없습니다. :)

SelectInDiscreteSpace()가 약간 수정되었습니다. 내부적으로 Step을 수정하는 것이 마음에 들지 않았습니다. 사용자를 수정하는 것은 왕실의 일이 아니니까요. 적어도 이번에는 아니죠.

사용자는 유전자 변경 범위와 관련하여 Step을 "비합리적"으로 만들기 위해 합리적인 고려 사항이 있을 수 있습니다.

이렇게 해결되었습니다:

double SelectInDiscreteSpace
(
double In, 
double InMin, 
double InMax, 
double step, 
int    RoundMode
)
{
  if (step==0.0)
    return(In);
  // 경계가 올바른지 확인
  if ( InMax < InMin )
  {
    double temp = InMax; InMax = InMin; InMin = temp;
  }
  // 위반한 경우 위반한 경계를 반환합니다.
  if ( In < InMin ) return( InMin );
// if ( In > InMax ) return( InMax ); // 그리고 마지막에 이 작업을 수행합니다., всё равно придётся
  if ( InMax == InMin || step <= 0.0 ) return( InMin );
  // 주어진 스케일로 가져오기
// step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );  // 아니, "주어진 스케일"로 가져오지 않겠습니다.
  switch ( RoundMode )
  {
  case 1:  In = ( InMin + step * MathFloor ( ( In - InMin ) / step ) );
  case 2:  In = ( InMin + step * MathCeil  ( ( In - InMin ) / step ) );
  default: In = ( InMin + step * MathRound ( ( In - InMin ) / step ) );
  }
  return fmin(In,InMax);
}
 
MetaDriver:

SelectInDiscreteSpace()가 약간 수정되었습니다. Step inside를 수정한 것이 마음에 들지 않습니다. 사용자를 수정하는 것은 왕이 할 일이 아니니까요. 적어도 이번에는 아니죠.

사용자는 유전자 변경 범위와 관련하여 Step을 "비합리적"으로 만드는 데 합리적인 고려 사항이 있을 수 있습니다.

이해하세요:

요점은 단계가 공간을 정수가 아닌 수의 섹션으로 나눌 수 있으며, 입력 번호의 어느 쪽에서 숫자 선의 값을 "잡을"( "오른쪽", 오른쪽 또는 왼쪽이 무엇인지 알 수 없음) 즉시 질문이 발생하기 때문에 이것은 좋지 않습니다-내 알고리즘은 적절한 답을 제공하지만 아쉽게도 귀하의 알고리즘은 적절한 답을 제공합니다. 그렇기 때문에 이런 식으로 해야 합니다:

step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );

다음은 여러분의 코드와 제 코드의 결과를 비교한 몇 가지 예입니다:



결과


Mine Yours
In 2,2 2 2
InMIN 2
InMAX 3
단계 0,8






결과


My Yours
In 2,8 3 2,8
InMIN 2
InMAX 3
Step 0,8






결과


My Yours
In 2,2 2,25 2,3
InMIN 2
InMAX 3
Step 0,3
 
이러한 정규화의 의미는 NormalizeDouble ()과는 다르지만, 마음에 들지 않는 소유자는 SelectInDiscreteSpace()에서처럼 지정된 단계가 아닌 필요한 부호로 정규화를 사용할 수 있습니다.
 
joo:
이러한 정규화의 의미는 NormalizeDouble ()과는 다르지만, 마음에 들지 않는 소유자는 SelectInDiscreteSpace()에서처럼 지정된 단계가 아닌 필요한 부호로 정규화를 사용할 수 있습니다.

이전 게시물과 마찬가지로 모든 것이 명확합니다.

안드레이, 나열된 모든 변형은 여기에 존재할 권리가 있습니다. 물론 여러분도 마찬가지입니다. 최적화 중에 유동적이고 변화하는 이산성은 세심한 주의가 필요합니다.

--

일반적으로 모든 것에 대해 :

설정, 유전 연산자 라이브러리 등을 추가해야 합니다. 그리고 편리한 확장 및 사용법에 대해 미리 생각해야 합니다.

객체에 대한 모든 것을 다시 작성하고 프로그램과 사용자 모두에게 더 강력한 인터페이스(탭에 많은 설정이 있는 그래픽)를 만들 생각입니다. 추가해야 할 것도 있고, 최적화해야 할 것도 있습니다.

더 정확히 말하면, 여러분의 코드를 기반으로 만들지(조각 사용) 아니면 처음부터 다시 작성할지 아직 고민 중입니다.

참여하고 싶으시면 비공개로 작성해 주세요.

공개할지 여부는 확실하지 않습니다. 두고 봐야죠. 지금은 저 혼자서 해보고 싶어요.

 
MetaDriver:

일반적으로 모든 것에 대해 :

1) 좋은 방법으로-사용자 정의, 유전자 연산자 라이브러리 등을 추가하고 편리한 확장 및 사용에 대해 미리 생각해야합니다.

2) 더 정확하게는 코드를 기반으로 만들지 (조각 사용) 아니면 다시 다시 작성할지 아직 고민 중입니다.

3) 참여하고 싶으시면 비공개로 작성하세요.

1) 반대로 제어 유연성을 줄이지 않고 UGA 매개 변수의 수를 줄이려고 노력하고 있습니다.

2) 프로젝트에서 이 글의 코드를 그대로 사용하는 분들과 0에서 코드를 다시 작성한 분들을 여러 명 알고 있습니다.

3) 비공개 메시지로 글을 썼습니다.

 
MetaDriver:

이전 게시물과 마찬가지로 모두 이해할 수 있습니다.

안드레이, 여기에 나열된 모든 옵션은 존재할 권리가 있습니다. 물론 여러분도 마찬가지입니다. 최적화 프로세스 중에 변경되는 유동적인 개별성은 세심한 주의가 필요합니다.

--

일반적으로 모든 것에 대해 :

설정, 유전자 연산자 라이브러리 등을 추가해야 하고 편리한 확장 및 사용법을 미리 생각해야 합니다.

객체에 대한 모든 것을 다시 작성하고 프로그램과 사용자 모두에게 더 강력한 인터페이스 (그래픽, 탭에 많은 설정 포함)를 만들 생각입니다. 추가해야 할 것도 있고, 최적화해야 할 것도 있습니다.

더 정확히 말하면, 코드를 기반으로 만들지(조각 사용) 아니면 처음부터 다시 작성할지 아직 고민 중입니다.

...

블라디미르, 타고 싶어요, 운전하고 싶어요?

아름다운 코드를 원하시나요, 아니면 테스터보다 더 멋진 GA를 만들고 싶으신가요?

개인적으로 테스터가 꽤 멋지다고 생각하지만 매개 변수가 거의 없습니다.
.

 
Urain:

블라디미르, 타고 싶나요, 운전하고 싶나요?

아름다운 코드를 원하십니까 아니면 테스터보다 더 멋진 GA를 구축 하시겠습니까?

나는 개인적으로 테스터가 꽤 멋지다고 생각하고 하나의 뉘앙스 만으로는 매개 변수가 충분하지 않습니다.
.

편리한 코드를 원합니다. 사용, 확장, 수정 및 임베드하기 쉽습니다.

 
MetaDriver:

편리한 코드를 원합니다. 사용, 확장, 수정 및 임베딩이 쉬워야 합니다.

그런 다음 GA의 객체 모델을 설명합니다. 설명한 모델에 따라 빈 클래스를 만든 다음 코드로 채우고 상호 작용을 규정합니다.
 

175 줄을 다음과 같이 바꿨습니다.

        NormalizeDouble((double)SumOfCurrentEpoch/MathMax(1,(double)resetCounterFF),2),

이 줄이 없으면 작업 보고서가 오류와 함께 실패합니다.

 
Rich:

175 줄을 다음과 같이 바꿨습니다.

이것이 없으면 연산 보고서가 오류와 함께 실패합니다.

예, 생성 연산자 루프를 처음 실행한 이후 주어진 에포크 수 동안 개선이 없는 경우 0으로 나누기 오류가 발생합니다.

가장 간단하고 논리적으로 올바른 방법은 초기화 시 즉시 resetCounterFF 변수에 1을 할당하는 것입니다:

int    resetCounterFF   =1;// "개선되지 않은 에포크" 초기화 카운터