비선형 최적화 문제 풀이 [algorithm] by 바죠

한 교수가 있고, 그 랩에 들어 오는 학생들이 뭔가를 하고 가고, 다시 다른 학생이 오면 또 뭔가를 하고 가버리는 상황이 계속된다. 이러한 상황들이 또 다시 반복될 수도 있고, 결코 남는것이 없다는 사실에 직면한다.

급기야, 하나 하나 정리를 해 두지 않으면 정말 남는 것도 없고 큰 의미가 없다는 것을 파악하게 된다.
물론, 매 학생들 입장에서는 뭔가를 하고 갈 것이다.  남아 있는 교수 입장에서는 늘 똑같은것을 하는 느낌을 받게 된다.

그래서 그 교수가 직접 팔을 걷어 붙이고, 하나 하나 정리하게 된다. 웹페이지를 만들고 모든 프로그램들을 공개한다.

사실, 많은 학교에서 일어나는 일이다.

적어도 비선형 최적화 문제들을 풀고자 할 때, 참고를 해야하는 싸이트가 생겼다.


다양한 컴퓨터 언어들을 동시에 지원한다. 상당한 수준의 일반적인 최적화 문제를 다양한 알고리듬 다양한 컴퓨터 언어로 풀 수 있게 했다.

이 얼마나 가치있는 일인가?


아무튼, 최적화 문제에 직면했다면 한 번쯤 방문해 볼 필요가 있다.

특히, 많은 컴퓨터 언어들을 동시에 지원하는 점은 놀랍다.
굉장한 수준이다. 진짜 한 프로그래밍하는 사람이다.



http://ab-initio.mit.edu/wiki/index.php/NLopt
http://ab-initio.mit.edu/wiki/index.php/NLopt_Tutorial

!          ifort -I/usr/local/include/nlopt.f a.f90 -lnlopt

!          ifort -I/usr/local/include/nlopt.f a.f90 -lnlopt
!234567890
       program main
       implicit none
       external myfunc, myconstraint
       integer*8 opt
       real*8 lb(2)
       real*8 d1(2), d2(2)
       real*8 x(2), fmin
       integer ires
       integer major,minor,bugfix
       include 'nlopt.f'

       call nloptv(major, minor, bugfix)
       print*, major,minor,bugfix
       call nlo_create(opt, NLOPT_LD_MMA, 2)
       call nlo_get_lower_bounds(ires, opt, lb)
       lb(1) = -huge(lb(1))
       lb(2) = 0.0d0
       call nlo_set_lower_bounds(ires, opt, lb)
       call nlo_set_min_objective(ires, opt, myfunc, 0)

       d1(1) = 2.d0
       d1(2) = 0.d0
       call nlo_add_inequality_constraint(ires, opt,  myconstraint, d1, 1.d-8)
       d2(1) = -1.
       d2(2) = 1.
       call nlo_add_inequality_constraint(ires, opt,    myconstraint, d2, 1.d-8)

       call nlo_set_xtol_rel(ires, opt, 1.d-4)

       x(1) = 1.234d0
       x(2) = 5.678d0
       call nlo_optimize(ires, opt, x, fmin)
       if (ires.lt.0) then
          write(*,*) 'nlopt failed!'
       else
          write(*,*) 'found min at ', x(1), x(2)
          write(*,*) 'min val = ', fmin
       endif

       call nlo_destroy(opt)
       end
       subroutine myfunc(val, n, x, grad, need_gradient, f_data)
       implicit none
       integer n, need_gradient
       real*8 val, x(n), grad(n)
       real*8 f_data
       if (need_gradient .ne. 0) then
       grad(1) = 0.0d0
       grad(2) = 0.5d0 / dsqrt(x(2))
       endif
       val = dsqrt(x(2))
       end
       subroutine myconstraint(val, n, x, grad, need_gradient, d)
       implicit none
       integer need_gradient,n
       real*8 val, x(n), grad(n), d(2), a, b
       a = d(1)
       b = d(2)
       if (need_gradient .ne. 0) then
         grad(1) = 3.d0 * a * (a*x(1) + b)**2
         grad(2) = -1.0d0
       endif
       val = (a*x(1) + b)**3 - x(2)
       end



 ./a.out
           2           4           0
 found min at   0.333333334213969       0.296296289513382    
 min val =   0.544331047721312    

http://ab-initio.mit.edu/wiki/index.php/NLopt_Tutorial


덧글

  • 2013/11/16 13:59 # 답글 비공개

    비공개 덧글입니다.
  • 바죠 2013/11/27 11:39 # 답글

    오랜만이군요.

    어떻게 미국은 친절하게 대해주나요?

댓글 입력 영역

최근 포토로그



MathJax