티스토리 뷰

Study/AI

[Optimization] JuliaBox

생각많은 소심남 2016. 10. 18. 00:33


이런 문제를 아마 어디서 본적이 있을 것이다. 아마 눈보다 손이 빠른 사람은 벌써 연습장을 꺼내서 변수를 통일하고 미지수를 줄이려 노력할 것이다. 아쉽게도 이문제는 해가 정해진 문제가 아니다. 따라서 손으로 계산한다고 해도 그 답을 쉽게 구할 수 없다. 보통 이런식의 문제를 NLP(Non-linear Programming) 이라고 하는데, 말그대로 비선형적인 문제에 대한 답을 구하는 절차라고 이해하면 좋을 듯 하다. ( 사실 처음에 Programming이란 말이 들어가서 진짜 코딩하고 그런건가 싶었는데, 그게 전혀 아니었다.)

 아무튼 이런 문제의 목적은 solution, 그중에서도 가장 최적의 solution(optimal solution)을 구하는 것이다. 앞에서도 언급했다시피 손으로 풀기 힘든 문제이니, 이 NLP의 optimal solution을 구하기 위해서는 컴퓨터의 도움이 필요하다. 물론 이를 해주는 툴들도 많고, 다양한 알고리즘들이 있다. 심지어 구글 스프레드시트를 사용해도 이런 식의 solution을 추출할수 있다.(NLP도 풀수 있는지는 확인해보지 않았다.) 가장 대표적으로 쓰이는 툴이 gurobi 라는 건데, 내가 들은 강의에서는 JuliaBox라는 것을 사용했다. syntax도 python에서 차용해서 쓰기 때문에 배우기도 쉬웠고, 응용하기도 좋았다. 

 다시 원론으로 돌아가 위의 NLP문제를 풀기위한 juliaMP code는 다음과 같다.

using JuMP


m = Model()


@variable(m, x[1:3] >= 0)


@NLconstraint(m, 10x[1] + 11x[2] + 12x[3] <= 60)

@NLconstraint(m, 21x[1] + 22x[2] + 23x[3] <= 150)

@NLconstraint(m, 21x[1] + 22x[2] - 23x[3] >= 110)

@NLconstraint(m, 19x[1] + 34x[2] - 32x[3] == 180)


@objective(m, Min, (2x[1] + 3x[2] + 4x[3])^2)


solve(m)


getvalue(x)

getobjectivevalue(m)

이게 다다. 사실 단순한 Linear Programming 문제를 푸는 게 아니라 NLP를 푸는 것이기에 이에 대한 constraint도 NLconstraint라고 사용했지만, 전체적인 문법이 위와 같다.

 그러면 해는 다음과 같다.


 참 쉽다. 사실 이게 시사하는 바는 무척 크다. 우리가 아무리 미지의 변수와 환경을 가지고 있더라도, 혹은 이를 뒷바침할 constraint가 적다 하더라도, 이런식의 solution을 찾게된다면 얼마든지 문제를 해결할 수 있다는 것이다. 예를 들어 주식이 내일 어떻게 변할지 모르더라도, 어떤 변수를 찾아내고 이와 연관된 상황을 수식으로 표현할 수 있다면 얼마든지 이런 툴을 사용해서 예측할 수도 있는 것이다. 이게 optimization의 힘이라고 생각한다.

댓글