기고글 토론 "모집단 최적화 알고리즘: 묘목 파종 및 성장(SSG)" - 페이지 12

[삭제]  
Andrey Dik #:

예, 매우 흥미로운 유기체입니다.)))

하지만 민달팽이는 2차원만 사용하며 가장 단순한 AO도 2차원에 대처할 수 있습니다. 문제의 복잡성이 차원 수에 따라 비선형적으로 증가하기 때문에 1000차원에서 어떻게 작동할지는 큰 문제입니다.

Ant는 동일하지만 다차원 사례에 대해 일반화합니다.

여기 chattgpt가 물었습니다.)

슬라임 몰드 알고리즘은 슬라임 몰드의 동작을 기반으로 한 휴리스틱 최적화 방법입니다. 이 알고리즘은 Chiaro D'Ambrosio가 개발했으며 "자연적" 최적화 알고리즘 그룹에 속합니다.


이 알고리즘의 핵심은 특정 지점에 '슬러그'를 배치하고 최대 먹이를 찾기 위해 그 지점을 중심으로 어떻게 퍼져 나가는지 관찰하는 것입니다. 이 알고리즘이 진행되는 동안 민달팽이는 흔적을 남기고 서서히 증발합니다. 한 지역에 흔적이 많이 남을수록 다른 '민달팽이'가 그 흔적을 더 많은 먹이가 있는 경로로 채택할 가능성이 높아집니다.


최적화의 맥락에서 이 슬러그 행동은 매개변수 공간에서 최적의 솔루션을 찾는 데 사용됩니다. 예를 들어, 이 알고리즘을 사용하여 주어진 매개변수 범위 내에서 함수의 최소값을 찾을 수 있습니다.


이 알고리즘의 장점은 단순성과 다차원 공간에서 최적의 해에 빠르게 수렴할 수 있다는 점입니다. 그러나 더 복잡하고 비선형적인 문제에서는 최적의 해에 수렴하는 데 문제가 있을 수 있습니다.

 
Maxim Dmitrievsky #:
개미 알고리즘은 동일하지만 다차원의 경우로 일반화되었습니다.

개미의 수렴은 차원이 증가함에 따라 감소하고 빠르게 감소합니다. 모든 알고리즘은 일반적으로 동일한 방식으로 작동합니다. 검색 전략에 따라 다르며 슬러그의 전략은 알 수 없습니다))).

수렴은 차원이 증가함에 따라 복잡성 증가보다 느리게 감소합니다 - 저는 이를 AO 확장성이라고 생각합니다. 확장성은 함수 유형에 따라 다르며 알고리즘에 따라 함수마다 다르게 확장됩니다.

 
Maxim Dmitrievsky #:

여기 chattgpt가 물었습니다.)

슬라임 몰드 알고리즘은 슬라임 몰드의 동작을 기반으로 한 휴리스틱 최적화 방법입니다. 이 알고리즘은 Chiaro D'Ambrosio가 개발했으며 "자연적" 최적화 알고리즘 그룹에 속합니다.

이 알고리즘의 핵심은 특정 지점에 '슬러그'를 배치하고 그 지점을 중심으로 최대한의 먹이를 찾아 어떻게 퍼져나가는지 관찰하는 것입니다. 이 알고리즘이 진행되는 동안 민달팽이는 흔적을 남기고 서서히 증발합니다. 한 지역에 흔적이 많이 남을수록 다른 '민달팽이'가 그 흔적을 더 많은 먹이가 있는 경로로 채택할 가능성이 높아집니다.

최적화의 맥락에서 이 슬러그 행동은 매개변수 공간에서 최적의 솔루션을 찾는 데 사용됩니다. 예를 들어, 이 알고리즘을 사용하여 주어진 매개변수 범위 내에서 함수의 최소값을 찾을 수 있습니다.

이 알고리즘의 장점은 단순성과 다차원 공간에서 최적의 해에 빠르게 수렴할 수 있다는 점입니다. 그러나 더 복잡하고 비선형적인 문제에서는 최적의 해에 수렴하는 데 문제가 있을 수 있습니다.

와우, 정말 흥미롭네요. 이 알고리즘을 찾아볼게요, 물론 분해해서 조립하는 것도 재미있겠죠............................)))))))

 
손에 넣는 즉시 문제의 차원, 세 가지 유형의 문제에 대해 알려진 모든 알고리즘의 수렴 비교 그래프를 만들 것입니다. 이 트릭은 시간이 많이 걸리는 것 같습니다.
[삭제]  
Andrey Dik #:

와우, 정말 흥미롭네요. 이 알고리즘을 찾아볼게요, 물론 분해하는 것도 재미있어요. 그리고 어셈블리))))))

다음은 MQL 프로그래밍 언어로 슬러그 알고리즘을 구현한 예제입니다:


```

double slimeMouldAlgorithm(double(*f)(double[]), double x[], int n, double LB[], double UB[], int maxIter, int N)

{

const double k = 0.1; // 미량 증발 계수

const double stepSize = 0.001; // "슬러그" 이동 단계의 크기

double trail[N]; // 각 파티클의 트레이스 배열

double bestTrail[N]; // 최상의 트레일 배열

double bestFitness = DBL_MAX; // 최적 피트니스 함수의 초기값

double bestX[N]; // 최적의 트레일에 해당하는 파라미터 값의 배열

for (int i = 0; i < N; i++) {

for (int j = 0; j < n; j++) {

x[j] = LB[j] + (UB[j] - LB[j]) * (double)rand() / RAND_MAX; // 지정된 범위의 파라미터에 무작위로 "슬러그" 배치

}

trail[i] = f(x); // 이 파라미터에 대한 적합도 함수 값을 계산합니다.

if (trail[i] < bestFitness) { // 피트니스 함수 값이 현재 최적값보다 나은 경우, 새로운 최적값으로 저장합니다.

bestFitness = trail[i];

memcpy(bestX, x, sizeof(bestX)); // 찾은 파라미터의 값을 최적값 배열에 복사합니다.

memcpy(bestTrail, trail, sizeof(bestTrail)); // 찾은 매개변수의 함수 값을 최적 함수 값 배열에 복사합니다.

}

}

for (int iter = 0; iter < maxIter; iter++) { // 반복 횟수만큼 반복합니다.

for (int i = 0; i < N; i++) {

double r[n], d[n];

for (int j = 0; j < n; j++) {

r[j] = (double)rand() / RAND_MAX - 0.5; // 랜덤 증분 벡터

d[j] = r[j] * stepSize * (UB[j] - LB[j]); // 스텝 폭 계산

x[j] += d[j]; // 파라미터에 스텝을 추가합니다.

if (x[j] < LB[j]) { // 매개변수가 범위를 벗어난 경우 경계에 남겨둡니다.

x[j] = LB[j];

} else if (x[j] > UB[j]) { {

x[j] = UB[j];

}

}

double newTrail = f(x); // 새 파라미터에 대한 함수값을 계산합니다.

if (newTrail <= trail[i]) { // 함수 값이 개선되었거나 변경되지 않은 경우, 새 파라미터와 함수 값을 저장합니다.

memcpy(bestX, x, sizeof(bestX)); // 새 파라미터를 최상의 파라미터 값 배열에 복사합니다.

memcpy(bestTrail, &newTrail, sizeof(newTrail)); // 새 함수 값을 최적의 함수 값 배열에 복사합니다.

trail[i] = newTrail; // 모든 "슬러그"에 대한 함수 값 배열에 새 매개변수에 대한 함수 값을 저장합니다.

if (bestTrail[i] < bestFitness) { // 현재 최적 솔루션이 현재 최적 솔루션보다 나은지 확인합니다.

bestFitness = bestTrail[i];

}

} else { // 함수 값이 나빠진 경우 이전 파라미터로 돌아갑니다.

memcpy(x, bestX, sizeof(bestX));

trail[i] = bestTrail[i];

}

}

for (int i = 0; i < N; i++) { {

trail[i] *= (1.0 - k); // 로컬 최대값에 갇히지 않도록 슬러그 트레일을 증발시킵니다.

}

}

bestFitness를 반환합니다;

}

```


이 코드는 선택한 파라미터의 임의 값을 시작점으로 사용한 다음 각 파티클을 순차적으로 처리합니다. 각 파티클에 대해 무작위 증분 벡터를 생성하고 단계 크기를 계산하여 각 파라미터에 추가합니다. 그런 다음 새 매개변수에 대한 함수 값을 계산하고 값이 감소하거나 동일하게 유지되면 이를 저장합니다. 각 사이클이 끝날 때마다 슬러그 트레이스를 증발시켜 로컬 최대값에 멈추지 않도록 합니다.


아마도 거기서 조정해야 할 것입니다 😀 GPT 발행

[삭제]  
정정합니다:

맞습니다. MQL에는 `memcpy` 함수가 없습니다. 한 변수에서 다른 변수로 값을 복사하려면 할당 연산자 `=`를 사용할 수 있습니다. 다음은 `memcpy` 함수를 사용하지 않고 수정한 코드의 예입니다:


```

double slimeMouldAlgorithm(double(*f)(double[]), double x[], int n, double LB[], double UB[], int maxIter, int N)

{

const double k = 0.1; // 미량 증발 계수

const double stepSize = 0.001; // "슬러그" 이동 단계의 크기

double trail[N]; // 각 파티클의 트레이스 배열

double bestTrail[N]; // 최상의 트레일 배열

double bestFitness = DBL_MAX; // 최적 피트니스 함수의 초기값

double bestX[N]; // 최적의 트레일에 해당하는 파라미터 값의 배열

for (int i = 0; i < N; i++) {

for (int j = 0; j < n; j++) {

x[j] = LB[j] + (UB[j] - LB[j]) * (double)rand() / RAND_MAX; // 지정된 범위의 파라미터에 무작위로 "슬러그" 배치

}

trail[i] = f(x); // 이 파라미터에 대한 적합도 함수 값을 계산합니다.

if (trail[i] < bestFitness) { // 피트니스 함수 값이 현재 최적값보다 나은 경우, 새로운 최적값으로 저장합니다.

bestFitness = trail[i];

for (int j = 0; j < n; j++) { {

bestX[j] = x[j]; // 찾은 파라미터의 값을 최적값 배열에 복사합니다.

}

bestTrail[i] = trail[i]; // 찾은 파라미터의 함수값을 최적의 함수값 배열에 복사합니다.

}

}

for (int iter = 0; iter < maxIter; iter++) { // 반복 횟수만큼 반복합니다.

for (int i = 0; i < N; i++) {

double r[n], d[n];

for (int j = 0; j < n; j++) {

r[j] = (double)rand() / RAND_MAX - 0.5; // 랜덤 증분 벡터

d[j] = r[j] * stepSize * (UB[j] - LB[j]); // 스텝 폭 계산

x[j] += d[j]; // 파라미터에 스텝을 추가합니다.

if (x[j] < LB[j]) { // 매개변수가 범위를 벗어난 경우 경계에 남겨둡니다.

x[j] = LB[j];

} else if (x[j] > UB[j]) { {

x[j] = UB[j];

}

}

double newTrail = f(x); // 새 파라미터에 대한 함수값을 계산합니다.

if (newTrail <= trail[i]) { // 함수 값이 개선되었거나 변경되지 않은 경우, 새 파라미터와 함수 값을 저장합니다.

for (int j = 0; j < n; j++) { {

bestX[j] = x[j]; // 새 파라미터를 최적의 파라미터 값 배열에 복사합니다.

}

bestTrail[i] = newTrail; // 새 함수 값을 최적의 함수 값 배열에 복사합니다.

trail[i] = newTrail; // 모든 "슬러그"에 대한 함수값 배열에 새 매개변수에 대한 함수값을 저장합니다.

if (bestTrail[i] < bestFitness) { // 현재 최적 솔루션이 현재 최적 솔루션보다 나은지 확인합니다.

bestFitness = bestTrail[i];

}

} else { // 함수 값이 나빠진 경우 이전 파라미터로 돌아갑니다.

for (int j = 0; j < n; j++) {

x[j] = bestX[j];

}

trail[i] = bestTrail[i];

}

}

for (int i = 0; i < N; i++) {

trail[i] *= (1.0 - k); // 로컬 최대값에 걸리지 않도록 슬러그 흔적을 증발시킵니다.

}

}

bestFitness를 반환합니다;

}

```


보시다시피 루프를 사용하여 배열 값을 요소별로 복사하고 있습니다.

 


이 아이언은 모든 것을 알고 있습니다...))))

일반적인 경우, 아마도 하드웨어를 신뢰하여 작업에 대한 알고리즘을 선택할 수 있지만, 나는 오히려 내 등급 표를보고 싶습니다))))

 
Maxim Dmitrievsky #:

```

double slimeMouldAlgorithm(double(*f)(double[]), double x[], int n, double LB[], double UB[], int maxIter, int N)

기사의 모든 알고리즘이 완료되었으므로 이를 체계로 분해할 필요가 있습니다.

[삭제]  
Andrey Dik #:

기사의 모든 알고리즘이 완료되었으므로 계획에 따라 분해해야합니다. 이 양식에서는 쓸모가 없습니다.

채팅을 통해 시도해보십시오. 그런 작업을 처리 할 수 있는지 궁금합니다 :) 토큰이 부족해서 가끔씩 손을 댑니다. 그에게 기사의 예를 제공하고 스타일을 유지하십시오. 그건 그렇고, 페니를위한 훌륭한 스타트 업은 카트에있는 봇입니다.
 
Maxim Dmitrievsky #:
채팅을 통해 시도해보면 그런 작업을 처리할 수 있을지 궁금합니다 :) 토큰이 다 떨어져서 가끔 시도해봅니다. 샘플 기사를 피드하고 스타일을 따르도록합니다. 그건 그렇고, 페니를위한 훌륭한 스타트 업은 카트 속의 봇입니다.

불행히도 또는 다행스럽게도 봇은 새로운 정보를 생성하지 않으며 공개적으로 사용 가능한 정보는 종종 왜곡됩니다. 나는 이것이 정보 보간 메커니즘 때문이라고 생각합니다. 거짓말을하고 존재하지 않는 알고리즘의 약어를 구성하고 심지어 저자 이름과 알고리즘 등장 날짜를 즉석에서 구성합니다))). 그러한 정보에 매우주의해야합니다.

텍스트 편집, 문체 수정 및 기사 작성 시 참고할 수 있는 조력자로서, 네, 없어서는 안 될 조력자입니다.