Pythhon에서 CPEX(Docplex) 호출
15273 단어 CPLEXPythonOptimization
1. 시작
Qiita의 첫 기고입니다.본 보도는 비망록으로 기록되어 잘못된 부분이 있을 수 있습니다.
IBM ILOG가 제공하는 최적화 솔루션의 개발 환경을 IBM ILOG CPLEX Optimization Studio라고 합니다.
CPLEX의 개발 언어는 C/C++/Java/Python 등이 있고, 다른 언어는 Eclipse의 Plugin의 OPL 언어로 최적화 문제를 기술할 수 있다.
CPEX 스튜디오의 통합개발환경(IDE)에서는 기본적으로 OPL 언어로 최적화된 문제를 개발하고 상호작용으로 해결할 수 있지만, 다기능 최적화 문제를 해결하고 CPEX에서 얻은 솔루션을 다른 문제에 적용하는 경우에는 다소 사용하기 어려워 보인다.
이에 따라 이번에는 파이썬 API 개발 환경 구축의 의미를 메모로 담아 기사를 쓰기 시작했다.
여기서 CPPLEX Pythhon API는 두 개의 큰 DOCplex[1]와 Pythhon-API(Legacy)[2]가 있지만 전통판은 머지않아 폐지될 것이기 때문에 DOCplex를 이용하여 개발 환경을 구축할 것이다.
2. 작업 환경
동작 확인
·Ubuntu 18.04 바이오닉(64비트, 8GB, on VMWare)
・CPEX Optimization Studio 12.9
・Python 3.7.3
진행됐습니다.
동작 확인
·Ubuntu 18.04 바이오닉(64비트, 8GB, on VMWare)
・CPEX Optimization Studio 12.9
・Python 3.7.3
진행됐습니다.
또한, 파이톤은 파이톤2*(≥파이톤2.7.9) 또는 파이톤3*(≥파이톤3.6)이다.
(단, 파이썬 3.8 이상은 지원되지 않는 것 같다)
3. CPEX Studio 12.9 설치 단계
먼저 DL CPEXStudio를 시작하십시오.
웹 사이트에서 오다.bin을 미리 다운로드합니다.
다운로드 방법이지만 [3]를 읽으면 쉽게 다운로드할 수 있기 때문에 생략합니다.
다운로드가 끝난 후 설치를 시작합시다.
작업을 위해 ~/Downloads로 이동합니다.
$cd ~/Downloads
일단bin 파일에 실행 권한을 부여합니다.$chmod +x CPLEX_OPT_STUD_129_LNX_X86-64.bin
그 다음.bin 파일을 실행합니다.$sudo ./CPLEX_OPT_STUD_129_LNX_X86-64.bin
어떤 언어에서는 설치기가 일어서서 몇 가지 질문을 한다.
총괄은 아래와 같다.싫으면 quit로 때리고 멈춰라.
1. 로컬 선택: ->1.English or 2. 일본어
2. 설치하기 전에 모든 프로그램을 닫는 것이 좋습니다. ->ENTER 또는 백
3. 설치 경로 지정:/opt/ibm/ILOG/CPPLEX기본값은 Studio129
4. Enter 키를 눌러 설치: ->Enter
5. 디스크 용량 확인(약 2GB 내외): -> ENTER
6. 설치 성공: ->ENTER
몇 개의 경로를 통과해야 한다.
CPEX는 매튜리얼 프로그램(MP)과 컨스트레이트 프로그램(CP) 두 가지 최적화 엔진을 장착해 각각 바이너리 경로가 다르다.
케이스의 설정 파일 (~/. bashrc) 을 열고 마지막 줄에서 다음 export를 계속 설명합니다.$echo "export LD_LIBRARY_PATH="/opt/ibm/ILOG/CPLEX_Studio129/opl/bin/x86-64_linux:$LD_LIBRARY_PATH"
$echo "export PATH="/opt/ibm/ILOG/CPLEX_Studio129/opl/bin/x86-64_linux:$PATH"
$echo "export PATH="/opt/ibm/ILOG/CPLEX_Studio129/cplex/bin/x86-64_linux:$PATH"
$echo "export PATH="/opt/ibm/ILOG/CPLEX_Studio129/cpoptimizer/bin/x86-64_linux:$PATH"
보충하면 반영됩니다.
$source ~/.bashrc
여기서 명령이 작동하는지 확인합니다.$cplex
Welcome to IBM(R) ILOG(R) CPLEX(R) Interactive Optimizer 12.9.0.0
with Simplex, Mixed Integer & Barrier Optimizers
5725-A06 5725-A29 5724-Y48 5724-Y49 5724-Y54 5724-Y55 5655-Y21
Copyright IBM Corp. 1988, 2019. All Rights Reserved.
Type 'help' for a list of available commands.
Type 'help' followed by a command name for more
information on commands.
제약 프로그램의 최적화 엔진을 시작하고 확인합니다.$cpoptimizer
Welcome to IBM(R) ILOG(R) CP Interactive Optimizer 12.9.0.0
with Simplex, Mixed Integer & Barrier Optimizers
5724-Y48 5724-Y49 5724-Y54 5724-Y55 5724-A06 5724-A29
Copyright IBM Corp. 1990, 2019. All Rights Reserved.
Type 'help' for a list of available commands.
Type 'help' followed by a command name for more
information on commands.
또한 경로를 통과했다면 다음 명령도 통과해야 한다.
help의 내용만 표시하면 순조롭게 통과할 수 있습니다.$oplrun
[이래서 command not found 등장 등으로 제대로 작동하지 않으면...]
LD_LIBRARY_PATH 설정이 반영되지 않는 경우가 있는 것 같습니다. (OS에 의존합니까?)
공유 라이브러리에 경로를 등록해서 피할 수 있습니다. (이 근처는 잘 모르겠습니다.)
/etc/ld.so.다음은 hogehoge.conf라는 파일을 만듭니다.LDLIBRARY_PATH를 추가하면 괜찮을 거야.
$sudo vim /etc/ld.so.conf.d/oplrun.conf
아래는 안에 쓰여 있다./opt/ibm/ILOG/CPLEX_Studio129/opl/bin/x86-64_linux/
/opt/ibm/ILOG/CPLEX_Studio129/cplex/bin/x86-64_linux/
/opt/ibm/ILOG/CPLEX_Studio129/cpoptimizer/bin/x86-64_linux/
파일을 저장하고 캐치를 다시 만듭니다.$sudo ldconfig
4. DOCplex 설정
이 기사에서 CPEX의/opt/ibm/ILOG/CPPLEXStudio129/...를 참고하십시오.
다음은/opt/ibm/ILOG/CPPLEX입니다.129는 (CPPLEX DIR)로 설정됩니다.
스스로 경로를 설정한 경우 CPEXDIR는 다른 경로여야 합니다.주의하십시오.
(CPPLEX DIR)/python/docplex/setup으로 이동합니다.py라는 파일이 있기 때문에 이것을 실행합니다.$cd (CPLEX_DIR)/python/docplex
$sudo python3 setup.py install
설정이 시작되고 몇 초 안에 끝납니다.
이렇게 DOCplex의 환경 구축이 끝났습니다.
5. 예제 풀이
다음은 공식적으로 참고한 샘플[4]로 쓰기 방법을 간단하게 소개하고 싶습니다.
필자 자신은 공부하는 사람이기 때문에 애매모호한 부분도 있으니 어떤 공헌을 할 수 있다면 좋겠다.
여기서 나는 [4] 최초의 예제인 The Transportation Problem을 취하고 싶다.
2개 거점에 둔 물자를 3개 거점으로 운송할 때 드는 비용을 최소화하는 문제다.
그림은 마이너스 정수 가중치가 아닌 유방향 비순환 그래프(DAG)입니다.
왼쪽에 있는 Out-going 노드는 물자 수송이 가능한 거점을 나타냅니다.
또 빨간 글자로 쓴 숫자는 각 노드의 무게로 수송 가능한 물자의 총량을 나타낸다.
오른쪽 In-coming 노드 옆의 녹색 글자 수는 거점이 요구하는 필수 물자의 총량을 나타낸다.
노드 간의 전호는 수송 가능한 경로를 표시하고, 전호의 중량은 각 물자의 운송 원가를 표시한다.
이 문제에 있어서 운송 원가를 계산하는 조합으로 몇 가지가 존재한다.
이것은 간단한 예제이기 때문에 가장 적합한 해답은 다음과 같다.
노드 3은 노드 1의 물자 이외의 물자를 받지 않기 때문에 7개의 물자가 필요하다.
따라서 노드 1의 물자 15에서 노드 3에게만 물자 7을 보내기 때문에 노드 1의 여량은 8이다. 이때 물자 7을 운송원가2로 노드 3에게 보내기 때문에 2×7=14의 운송 원가가 필요하다.
마찬가지로 노드 4는 노드 2에서만 물자를 받을 수 있기 때문에 노드 2의 잉여 물자량은 20-10=10이고 이때의 운송 원가는 10이다×5=50, 노드 1 잉여 물자량은 8, 노드 2 잉여 물자량은 10, 이후 노드 5는 15가지 물자가 필요한 상태가 된다.
이때 노드 2대 노드 5의 수송 원가가 비교적 낮기 때문에 노드 2에서 물자를 우선적으로 운송하기로 결정했을 때 노드 2는 10을 모두 운반하고 잉여량은 0이고 노드 5의 필수 물자는 5이다.
마지막으로 노드 1마리에서 노드 5마리에게 5개의 물자를 보내 모든 요구를 만족시킨다.
이 과정에서 노드 2는 운송 원가 3으로 10 운반×3=30 운송 원가, 노드 1은 운송 원가로 4마리 운송5×4=20은 운송 원가가 필요하다.
종합적으로 말하면 최종적으로 14+50+30+20=114의 운송 원가만 필요하다.
이 문제를 최적화 문제로 성립시키기 위해서는 목적 함수와 구속 조건을 정리하고 결정 변수를 정의해야 한다.
$cd ~/Downloads
$chmod +x CPLEX_OPT_STUD_129_LNX_X86-64.bin
$sudo ./CPLEX_OPT_STUD_129_LNX_X86-64.bin
$echo "export LD_LIBRARY_PATH="/opt/ibm/ILOG/CPLEX_Studio129/opl/bin/x86-64_linux:$LD_LIBRARY_PATH"
$echo "export PATH="/opt/ibm/ILOG/CPLEX_Studio129/opl/bin/x86-64_linux:$PATH"
$echo "export PATH="/opt/ibm/ILOG/CPLEX_Studio129/cplex/bin/x86-64_linux:$PATH"
$echo "export PATH="/opt/ibm/ILOG/CPLEX_Studio129/cpoptimizer/bin/x86-64_linux:$PATH"
$source ~/.bashrc
$cplex
Welcome to IBM(R) ILOG(R) CPLEX(R) Interactive Optimizer 12.9.0.0
with Simplex, Mixed Integer & Barrier Optimizers
5725-A06 5725-A29 5724-Y48 5724-Y49 5724-Y54 5724-Y55 5655-Y21
Copyright IBM Corp. 1988, 2019. All Rights Reserved.
Type 'help' for a list of available commands.
Type 'help' followed by a command name for more
information on commands.
$cpoptimizer
Welcome to IBM(R) ILOG(R) CP Interactive Optimizer 12.9.0.0
with Simplex, Mixed Integer & Barrier Optimizers
5724-Y48 5724-Y49 5724-Y54 5724-Y55 5724-A06 5724-A29
Copyright IBM Corp. 1990, 2019. All Rights Reserved.
Type 'help' for a list of available commands.
Type 'help' followed by a command name for more
information on commands.
$oplrun
$sudo vim /etc/ld.so.conf.d/oplrun.conf
/opt/ibm/ILOG/CPLEX_Studio129/opl/bin/x86-64_linux/
/opt/ibm/ILOG/CPLEX_Studio129/cplex/bin/x86-64_linux/
/opt/ibm/ILOG/CPLEX_Studio129/cpoptimizer/bin/x86-64_linux/
$sudo ldconfig
이 기사에서 CPEX의/opt/ibm/ILOG/CPPLEXStudio129/...를 참고하십시오.
다음은/opt/ibm/ILOG/CPPLEX입니다.129는 (CPPLEX DIR)로 설정됩니다.
스스로 경로를 설정한 경우 CPEXDIR는 다른 경로여야 합니다.주의하십시오.
(CPPLEX DIR)/python/docplex/setup으로 이동합니다.py라는 파일이 있기 때문에 이것을 실행합니다.
$cd (CPLEX_DIR)/python/docplex
$sudo python3 setup.py install
설정이 시작되고 몇 초 안에 끝납니다.이렇게 DOCplex의 환경 구축이 끝났습니다.
5. 예제 풀이
다음은 공식적으로 참고한 샘플[4]로 쓰기 방법을 간단하게 소개하고 싶습니다.
필자 자신은 공부하는 사람이기 때문에 애매모호한 부분도 있으니 어떤 공헌을 할 수 있다면 좋겠다.
여기서 나는 [4] 최초의 예제인 The Transportation Problem을 취하고 싶다.
2개 거점에 둔 물자를 3개 거점으로 운송할 때 드는 비용을 최소화하는 문제다.
그림은 마이너스 정수 가중치가 아닌 유방향 비순환 그래프(DAG)입니다.
왼쪽에 있는 Out-going 노드는 물자 수송이 가능한 거점을 나타냅니다.
또 빨간 글자로 쓴 숫자는 각 노드의 무게로 수송 가능한 물자의 총량을 나타낸다.
오른쪽 In-coming 노드 옆의 녹색 글자 수는 거점이 요구하는 필수 물자의 총량을 나타낸다.
노드 간의 전호는 수송 가능한 경로를 표시하고, 전호의 중량은 각 물자의 운송 원가를 표시한다.
이 문제에 있어서 운송 원가를 계산하는 조합으로 몇 가지가 존재한다.
이것은 간단한 예제이기 때문에 가장 적합한 해답은 다음과 같다.
노드 3은 노드 1의 물자 이외의 물자를 받지 않기 때문에 7개의 물자가 필요하다.
따라서 노드 1의 물자 15에서 노드 3에게만 물자 7을 보내기 때문에 노드 1의 여량은 8이다. 이때 물자 7을 운송원가2로 노드 3에게 보내기 때문에 2×7=14의 운송 원가가 필요하다.
마찬가지로 노드 4는 노드 2에서만 물자를 받을 수 있기 때문에 노드 2의 잉여 물자량은 20-10=10이고 이때의 운송 원가는 10이다×5=50, 노드 1 잉여 물자량은 8, 노드 2 잉여 물자량은 10, 이후 노드 5는 15가지 물자가 필요한 상태가 된다.
이때 노드 2대 노드 5의 수송 원가가 비교적 낮기 때문에 노드 2에서 물자를 우선적으로 운송하기로 결정했을 때 노드 2는 10을 모두 운반하고 잉여량은 0이고 노드 5의 필수 물자는 5이다.
마지막으로 노드 1마리에서 노드 5마리에게 5개의 물자를 보내 모든 요구를 만족시킨다.
이 과정에서 노드 2는 운송 원가 3으로 10 운반×3=30 운송 원가, 노드 1은 운송 원가로 4마리 운송5×4=20은 운송 원가가 필요하다.
종합적으로 말하면 최종적으로 14+50+30+20=114의 운송 원가만 필요하다.
이 문제를 최적화 문제로 성립시키기 위해서는 목적 함수와 구속 조건을 정리하고 결정 변수를 정의해야 한다.
sample.py
#URL/Keyを書くとクラウドで問題を解くことができます。
#ここではローカル実行を想定しているのでNoneとします。
url=None
key=None
#Preparation of data
#ノード1は15, ノード2は20だけ物資を有する
capacities = {1:15, 2:20}
#ノード3は7, ノード4は10, ノード5は15の要求がある
demands = {3:7, 4:10, 5:15}
#このときアークにおけるコストは (1,3)=2, (1,5)=4, (2,4)=5, (2,5)=3なので
costs = {(1,3):2, (1,5):4, (2,4):5, (2,5):3}
source = range(1,3) #pythonでは range(i,j)は i...j-1まで
target = range(3,6)
#description of a problem
#docplexをインポートする
from docplex.mp.model import Model
tm = Model(name='transportation')
#decision (continuous) variable
#変数x(i,j)を問題tmの中に定義する.xは連続変数でiはsource,jはtargetを参照する.ただしこれはcostsに存在する (アークが繋がっている者同士) 場合に限る.
x = {(i,j): tm.continuous_var(name='x_{0}_{1}'.format(i,j)) for i in source for j in target if (i,j) in costs}
tm.print_information()
#add constraints
# (1,3), (1,5) を運ぶ物資の総量がcapacities[1] (=15)を超えない
# (2,4), (2,5) を運ぶ物資の総量がcapacities[2] (=20)を超えない
for i in source:
tm.add_constraint(tm.sum(x[i,j] for j in target if (i,j) in costs) <= capacities[i] )
for j in target:
tm.add_constraint(tm.sum(x[i,j] for i in source if (i,j) in costs) >= demands[j] )
#Objective function
#目的関数はアーク(i,j)間に係る輸送コストの総量の最小化
tm.minimize(tm.sum(x[i,j]*costs[i,j] for i in source for j in target if (i,j) in costs))
#Solve
#問題を解く
tms = tm.solve(url=url,key=key)
#Display and exceptions
#解を表示
assert tms
tms.display()
실행 후 다음과 같은 결과를 얻는다.
Model: transportation
- number of variables: 4
- binary=0, integer=0, continuous=4
- number of constraints: 0
- linear=0
- parameters: defaults
solution for: transportation
objective: 114.000
x_1_3 = 7.000
x_1_5 = 5.000
x_2_4 = 10.000
x_2_5 = 10.000
DOCplex(Pythhon-API) 가져오기는 여기까지입니다.참조 링크
1: DOCplex 공식 참조
2: Python-API(Legacy)
3: CPEX 다운로드
4: DOCplex 공식 참조-예제
Reference
이 문제에 관하여(Pythhon에서 CPEX(Docplex) 호출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Hiroskey/items/038704c5a80f4252e741
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Pythhon에서 CPEX(Docplex) 호출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Hiroskey/items/038704c5a80f4252e741텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)