본문 바로가기
Python

파이썬 최적화 알고리즘 변수 범위 설정 예제 (Python Scipy Optimization w/ Bounds)

by 무적물리 2020. 8. 28.

최근 파이썬을 사용해서 최적화를 수행하면서 변수의 범위를 설정하고 그 안에서 최적점을 찾는 방법을 사용하고자 변수 범위 설정이 가능한 파이썬 최적화 알고리즘에 대해 스터디하고 있습니다. 간단한 방법이지만 모르면 사용하지 못하기 때문에 아래 코드를 확인해보십시오.


썸네일


이번 포스팅에서는 파이썬 최적화 알고리즘 변수 범위 설정 예제에 대해 여러분과 공유하고자 합니다. 이미 이전에 Scipy 패키지를 사용한 간단한 최적화 예제를 작성한바 있으니 아래 포스팅을 참고하시면 되겠습니다. 해당 포스팅을 기본으로 작성된 코드입니다.




파이썬 최적화 알고리즘 범위 설정 예제

이전 포스팅과 같은 코드를 사용하였지만 최근에 사용하고 있는 민감도 기반 최적화 알고리즘인 SQP의 파이썬 버전인 SLSQP를 사용하여 예제 구성했습니다. 함수모델에 따라 최적화 알고리즘의 성능이 상이하지만 SQP는 네임드 최적화 알고리즘입니다.


이번 포스팅이 이전 포스팅과 다른 점은 변수 범위(Bounds)를 설정할 수 있다는 것입니다. 수식을 잘 활용하시면 Constraints도 자유자재로 사용할 수 있습니다. 아래 코드를 확인해보시면 간단하게 변수 범위(Bounds)를 설정한 최적화 알고리즘 예제를 확인할 수 있습니다.


# 패키지 Import

from scipy.optimize import minimize


# 함수선언

def function(x):

    return x[0]**2 + x[1]**2 + 1


# 시작점 설정

Init_Point = (1.,1.)

# 변수 범위 설정

bnds = ((0.5, 2.), (-1.,1.))


# 최적화 알고리즘 적용

Optimum = minimize(function, Init_Point, method='SLSQP', bounds=bnds, options={'ftol': 1e-8, 'maxiter': 1000})


print(Optimum)


위 코드를 확인해보시면 최대 Iteration 횟수를 1000번, 결과의 Tolerance는 1e-8이 되면 최적화 알고리즘을 종료하도록 설정했습니다. 위에서 설명한 바와 같이 최적화 알고리즘은 SLSQP를 사용하였으며 이번 포스팅의 핵심인 변수 범위(Bounds)는 bnds로 변수화하여 사용했습니다.



파이썬 최적화 알고리즘 실행 결과

위와 같이 변수 범위를 포함하는 파이썬 최적화 SQP 알고리즘을 실행하면 결과가 어떻게 나올까요? 매우 심플하게 아래와 같이 결과를 도출할 수 있습니다.


     fun: 1.25

     jac: array([1.00000001, 0.        ])

 message: 'Optimization terminated successfully.'

    nfev: 16

     nit: 4

    njev: 4

  status: 0

 success: True

       x: array([ 5.00000000e-01, -8.10798451e-09])


변수 범위(Bounds)가 없다면 당연히 (0, 0)에서 1이라는 최소값이 찾아질텐데, 변수의 범위가 존재하기 때문에 (0.5, 0)에서 1.25의 값이 최소값으로 찾아졌습니다. 대충 계산해보시면 위 알고리즘이 정상적으로 최적값을 찾은 것이 확인됩니다.


마치며

이번 포스팅에서는 파이썬 최적화 알고리즘 변수 범위 설정 예제에 대해 알아보았습니다. 많은 분들이 파이썬 Scipy 패키지를 사용해서 최적값을 찾고자하는 것으로 보여서 변수 범위를 포함한 파이썬 최적화 방법에 대해 공유합니다. 위 코드 참고하시고 즐거운 코딩되십시오.


댓글