Mac OSX에 lp_solve를 설치하고 파이썬으로 호출합니다.

Mac OSX에 lp_solve를 설치하고 파이썬으로 호출합니다.

2022-10-04 last update

11 minutes reading python2.7 파이썬 MacOSX lp_solve
선형 계획 문제를 해결하는 무료 소프트웨어 lp-solve.
이것을 Mac의 터미널에서 움직이기까지의 단계, 그리고 Python에서 호출하기까지의 순서가 어디에도 정리되어 있지 않았기 때문에, 기록해 둡니다.
또, 설치가 끝난 뒤에 사용법을 모르기 때문에, 마지막에 간단한 사례로 Python의 코드도 적습니다.

환경



Mac OS X El Capitan 10.11.6
파이썬 2.7.12

※주의
homebrew에서 설치 방법을 설명했지만,
그 방법으로는 최신판이 설치되지 않기 때문에 재작성했습니다.
lp_solve만 설치할 수 있으면 좋다고 하는 분은, 이하를 시험해 주세요.
$ brew tap homebrew/science
$ brew install lp_solve

lp_solve 본체, Python 인터페이스 설치



먼저 h tps://그래서 r세훗r게. 네 t/p로지ぇcts/lp소lゔぇ/후ぃぇs/lp소lゔぇ/에서 최신 버전의 파일을 다운로드하십시오. 필요한 파일은 다음 두 가지입니다.
(2016/10/10 시점 최신:5.5.2.5)
  • lp_solve_5.5.2.5_source.tar.gz
  • lp_solve_5.5.2.5_Python_source.tar.gz

  • 압축을 풀고 ($tar xfvz) lp_solve_5.5.2.5_Python_source.tar.gz의/extra 다음을 lp_solve_5.5.2.5_source.tar.gz의/lp_solve_5.5에 복사합니다.

    디렉토리 계층이 이런 ↓ 느낌이되면,
    lp_solve_5.5/
    ├ lp_solve
    ├ lpsolve55
    ├ extra
    ├ :
    └ demo

    lp_solve/및 lpsolve55/내에서,
    $ sh ccc.osx
    

    합니다. 이때 환경에 따라서는 대량으로 에러가 나오지만, 필요한 파일은 생성됩니다.
    lp_solve/→ lpsolve55/와 sh ccc.osx를 사용하면 lpsolve55/bin이 생성되었다고 생각합니다.
    생성되면/lpsolve55/bin/osx64/에 있는 liblpsolve55.a 및 liblpsolve55.dylib를/usr/loca/lib에 복사합니다.

    마지막으로/lp_solve_5.5/extra/Python에서 setpy.py를 이동합니다. 하지만 그 전에 setpy.py의 다음 부분을 수정합니다.

    setpy.py
    :
    :
    windir = getenv('windir')
    if windir == None:
      WIN32 = 'NOWIN32'
      LPSOLVE55 = '../../lpsolve55/bin/ux32' #→ lpsolve55/bin/osx64 に修正
    else:
      WIN32 = 'WIN32'
      LPSOLVE55 = '../../lpsolve55/bin/win32'
    setup (name = "lpsolve55",
           version = "5.5.0.9",
           description = "Linear Program Solver, Interface to lpsolve",
           author = "Peter Notebaert",
    
    :
    :
    

    저장하면 나머지는 터미널에서
    $ python setpy.py install
    

    그러면 모든 설치가 완료됩니다.

    여기서 'malloc.h' file not found 오류가 발생하면 지정된 행 (아마도 #include)을 #include로 다시 씁니다. 이미 stdlib.h가 include되어 있으면 삭제.
    (참고: malloc.h on OS X )

    성공적으로 파이썬에서 작동하는지 확인해 봅시다.
    $python
    Python 2.7.12 (default, Aug  3 2016, 23:22:34) 
    [GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from lpsolve55 import *
    >>> lpsolve()
    lpsolve  Python Interface version 5.5.0.9
    using lpsolve version 5.5.2.5
    
    Usage: ret = lpsolve('functionname', arg1, arg2, ...)
    >>> 
    

    이런 느낌이 되면 성공입니다.

    파이썬 내에서 lp_splve 표기법



    예를 들어 다음과 같은 문제를 해결하고 싶다면,

    목적 함수
    min -400x1 -300x2 + 100x3
    

    제약
    s.t. \qquad\qquad\qquad\qquad\qquad\\
    60x1 +40x2 + 10x3 \le 3800\\ 
    30x1 +20x2 -40 x3 \ge 1200\\ 
    5 \ge x1 \ge -\infty \\ 
    20 \ge x2, x3\\ 
    int\ x1,x2,x3
    

    다음과 같이 제약식을 추가합니다.
    from lpsolve55 import *
    
    # 0,3 →制約式が0行、変数が3このLPを作る
    lp = lpsolve('make_lp',0,3) 
    
    # 目的関数追加 「min : -400x1 -300x2 +100x3」
    lpsolve('set_obj_fn', lp, [-400, -300, 100] ) 
    
    # 制約式追加 「60x1 +40x2 +10x3 =< 3800」, 「LE」 = 「<=」、 「GE」 = 「>=」、 「EQ」 = 「=」
    lpsolve('add_constraint', lp, [60,40,10], LE, 3800) 
    
    # 30x1 +20x2 -40x3 => 1200
    lpsolve('add_constraint', lp, [30,20,-40], GE, 1200) 
    
    # 変数の下限設定、 "Infinite"で無限を表現
    lpsolve('set_lowbo',lp,1,-Infinite)
    
    # 変数の上限設定、リストで同時に複数設定可
    lpsolve('set_upbo',lp,[5,20,20]) 
    
    # 整数制約、 0-1制約は "set_binary"
    lpsolve('set_int'lp,[1,2,3]) 
    
    # const.lpが生成され、定式化を出力
    lpsolve('write_lp',lp,'const.lp') 
    
    # 問題を解く 
    lpsolve('solve',lp) 
    
    # 最適解の出力、変数に代入可。型はリスト
    print lpsolve('get_variables',lp) 
    

    얼마 지나지 않아, 자주(잘) 사용할 것 같은 명령을 나란히 해 보았습니다. 다른 명령은 lp_solve API reference에서 찾아보십시오. 저도 공부중입니다.

    미래



    지금 현재 신경이 쓰이고 있는 것은, lp_solve의 계산을 어느 정도의 곳에서 멈추는 기능이 없는가, 라고 하는 것입니다.
    예를 들면 「20s로 끝나지 않으면, 그 시점에서의 잠정해를 출력한다」같은 일이 생기면 좋다고 생각하면서, 찾고 있습니다.

    (추기:2016/10/7) 있었습니다.
    lpsolve('set_timeout',lp,TIME) # TIMEには秒数-1を設定。1分なら TIME = 59
    

    에서 가능합니다.

    참고문헌



    선형 계획 솔버
    Python 용 lpsolve driver 설치
    lp_solve API reference
    INSTALL LPSOLVE FOR PYTHON

    lp_solve에서 추천하는 라이브러리



    Python은 더 유연한 수리 최적화 라이브러리로 PuLP라고합니다.
    @ 사이토 토무 씨의 이 기사가 매우 도움이 됩니다.
    함께 봐주세요.
    초보에서 수리 모델
    최적화에서 파이썬
    수리 최적화 모델러 (PuLP) 치트 시트 (Python)