Main Content

최적화 문제 해결과 팁

다음 표에는 흔히 발생하는 최적화 문제와 이 문제를 해결하기 위한 권장 사항이 나와 있습니다.

문제

권장 사항

fminbnd 또는 fminsearch로 구한 해가 전역 최솟값이 아닙니다. 전역 최솟값은 검색 공간에 있는 모든 점 중에서 가장 작은 목적 함수 값을 가집니다.

문제가 연속적이지 않고 최솟값을 여러 개 가지는 경우라면 해가 전역 최솟값이 아닐 수 있습니다. 전역 최솟값을 검색하려면 여러 개의 시작점(또는 fminbnd의 경우 구간)에서 최적화를 시작하십시오.

일부 점 x에서 목적 함수 f(x)를 계산할 수 없습니다. 이러한 점을 실현불가능점이라고 합니다.

실현불가능점 x에서 f(x)에 대해 큰 양수 값을 반환하도록 함수를 수정하십시오.

최소화 루틴이 무한 루프에 빠지는 것처럼 보이거나 최솟값이 아닌 해(또는 fzero의 경우 영점이 아닌 해)를 반환합니다.

목적 함수가 NaN 값이나 복소수 값을 반환하는 것 같습니다. 솔버는 목적 함수 값으로 실수 값만 예상합니다. 기타 모든 값은 예기치 못한 결과를 초래할 수 있습니다. NaN 값이나 복소수 값이 있는지 확인하려면 다음을 설정하고,

options = optimset('FunValCheck','on')

options를 입력 인수로 사용하여 최적화 함수를 호출하십시오. 목적 함수가 NaN 값이나 복소수 값을 반환하는 경우, 이와 같이 설정하면 솔버가 오류를 발생시킵니다.

솔버를 실행하는 데 시간이 오래 걸립니다.

대부분의 최적화 문제는 시작점이 좋은 경우 이점을 얻습니다. 문제의 특성에 따라, 해에 가까울 수 있는 영역에서 임의 시작점을 사용해 보십시오.

복잡한 문제는 경우에 따라 진화적인 접근 방식을 통해 효과적으로 풀 수 있습니다. 먼저, 독립 변수의 수가 상대적으로 적은 문제부터 풉니다. 이렇게 더 단순한 문제의 해를 적합한 매핑을 거쳐 더 복잡한 문제에 대한 시작점으로 사용합니다. 또한, 경우에 따라 최적화 문제의 초기 단계에 더 간단한 목적 함수와 덜 엄격한 중지 조건을 사용하여 해를 더 빠르게 구할 수도 있습니다.

솔버가 무슨 작업을 하고 있는지 확실하지 않습니다.

솔버가 반복 실행되면서 무슨 작업을 하는지 확인하려면 다음과 같이 하십시오.

fminsearch가 해에 도달하지 못합니다.

fminsearch는 다양한 이유로 인해 해에 도달하지 못할 수 있습니다.

  • 스케일링이 제대로 되지 않음. 문제가 적절하게 정규화되지 않으면 솔버가 올바르게 수렴하지 못할 수 있습니다. 각 좌표가 목적 함수에 비슷한 정도의 영향을 주도록 설정하고, 가능한 해 가까이에서 각 좌표의 스케일링이 너무 크거나 작지 않도록 하십시오. 이렇게 하려면 목적 함수를 편집하고 각 좌표에 대해 적절한 상수를 더하거나 곱하십시오.

  • 중지 조건이 적절하지 않음. TolFun 또는 TolX에 지정한 값이 너무 작을 경우 fminsearch는 해에 도달했을 때 이를 인식하지 못할 수 있습니다. 값이 너무 큰 경우 fminsearch는 해에서 멀리 떨어진 지점에서 중단될 수 있습니다.

  • 초기점이 적절하지 않음. 다양한 초기점에서 fminsearch를 시작해 보십시오.

  • 반복 횟수가 충분하지 않음. 솔버가 반복을 모두 마치거나 중지되는 경우, 더 나은 해에 도달할 수 있도록 그 최종점에서 fminsearch를 다시 시작해 보십시오. 경우에 따라 fminsearchMaxFunEvals 옵션과 MaxIter 옵션의 값을 디폴트 값인 200*length(x0)보다 더 큰 값으로 늘릴 경우 더 나은 해에 도달할 수 있습니다.

참고

최적화 솔버는 실수 값 함수에 적용됩니다. 복소수 값은 최적화할 수 없습니다. 단, 노름과 같은 복소수 값의 실수 값 함수는 예외입니다.

관련 항목