JuMP와 슬롯 나라 사이에 새로운 인터페이스를 개발했으며, Pyomo와 슬롯 나라 사이의 기존 인터페이스를 개선했습니다.
배경
GDX를 사용하는 것은 현재 슬롯 나라와 데이터(변수 및 방정식 솔루션 레코드 등)를 교환하는 가장 효율적인 방법입니다. 많은(주로 학문적인) 슬롯 나라 사용자는 다음과 같은 다른 모델링 도구도 사용합니다.JuMP(줄리아) 또는표모(파이썬). 이 두 가지 모두 최근 몇 년 동안 상당한 관심을 얻었으며 이를 효율적인 방식으로 슬롯 나라와 인터페이스하는 것은 일부 사람들이 요청한 것입니다. 따라서 우리 개발자들은 GDX를 활용하여 슬롯 나라를 Pyomo 및 JuMP와 최대한 효율적으로 인터페이스하는 데 시간을 보냈습니다.
JuMP
비교적 새로운 프로그래밍 언어의 경우 Julia는 대수식을 쉽게 만드는 간단한 구문과 컴파일된 언어에 가까운 실행 속도로 인해 많은 주목을 받았습니다.JuMP는 수학적 모델링을 위한 Julia 패키지이며 다양한 솔버를 지원합니다. 그러나 많은 사용자는 JuMP에서 지원되지 않지만 슬롯 나라와 함께 제공되는 솔버를 사용하고 싶어합니다. 현재 AlphaECP, Antigone, Conopt, DICOPT, GLOMIQO, LGO, LINDO, LINDOGLOBAL, Localsolver, MINOS, MSNLP, ODHCPLEX, PATHNLP, SBB, SHOT, SNOPT, SoPLEX, XA 및 자체 개발 BDMLP가 있습니다. 새로운 인터페이스를 개발했습니다(https://github.com/슬롯 나라-dev/슬롯 나라jl18181_18226
사용 중슬롯 나라사용 중JuMP
모델=모델(슬롯 나라.최적화 프로그램)
I= 1:2
J= 1:3
a=[350, 600]b=[325, 300, 275]d=[2.5 1.7 1.8;2.5 1.8 1.4]
@변수(모델, x[I,J]>= 0)
@objective(모델, 민,0.09 *합계(d[i,j]*x[i,j]forI에나, jinJ))
@constraint(모델, [iinI], 합계(x[i,j]forJinJ)<=a[i])@constraint(모델, [j에J], 합계(x[i,j]forI에나)>=b[j])
JuMP.최적화!(모델)
인쇄("최적의 해결책: ", JuMP.objective_value(모델))새 인터페이스는 다음 JuMP 기능을 지원합니다:
- 선형, 2차 및 비선형(볼록 및 비볼록) 목표 및 제약 조건
- 연속, 이진, 정수, 반연속 및 반정수 변수
- SOS1 및 SOS2 세트
표모
표모Python에서 최적화 모델을 공식화, 해결 및 분석할 수 있습니다. Pyomo는 이미슬롯 나라 인터페이스. 최근에는 GDX를 활용해 인터페이스 성능을 향상시키는 Pyomo 프로젝트에 기여했습니다.
슬롯 나라를 Pyomo 솔버로 사용:
from pyomo.environ 가져오기 *
선택=솔버팩토리('감스')
모델=콘크리트모델()
모델.I=범위 집합(0,1)
모델.J=범위 집합(0,2)
a=[350, 600]b=[325, 300, 275]d=[[2.5, 1.7, 1.8], [2.5, 1.8, 1.4]]
모델.x=Var(모델.나, 모델.j, 도메인=NonNegativeReals)
모델.obj=목표(expr=0.09 * 합(d[i][j]*모델.x[i,j]forI에모델.IforJin모델.J))
def c1_rule(모델, i): 반환 합계(모델.x[i,j]용J에모델.J)<=a[i]모델.c1=제약조건(모델.i, 규칙=c1_rule)
def c2_rule(모델, j): 반환 합(모델.x[i,j]용I에모델.i)>=b[j]모델.c2=제약조건(모델.j, 규칙=c2_rule)
결과=선택.해결(모델)
인쇄('최적의 해결책: ', 값(모델.obj))추가 보너스로 다음을 사용할 수 있습니다.슬롯 나라 변환 도구슬롯 나라 인스턴스(.gms)를 Pyomo 모델(.py)로 변환
이것은 어떻게 작동하나요?
우리는 두 인터페이스 모두에서 동일한 원칙을 따랐습니다.
- 슬롯 나라 솔버(또는 MathOptInterface Optimizer)로 모델을 해석할 때 스칼라 모델이 포함된 GMS 텍스트 파일(유사/latest/docs/S_CONVERT.html#INDEX_CONVERT_22_scalar_21_model)은 슬롯 나라 셸 명령어에 의해 생성되고 실행됩니다.
- 생성된 모델 인스턴스는 슬롯 나라 솔버 링크로 전달되고 실제 솔버는 솔루션 작업을 시작합니다.
- 솔버가 종료되면 솔루션 포인트와 상태가 GDX 파일로 내보내지며, 이 파일은 gdxcc Python 모듈을 사용하거나 슬롯 나라 GDX 라이브러리 libgdxdclib64.so(Julia의 경우)에 대한 직접 C 호출을 사용하여 읽습니다.
결과
새로 개발/개선된 링크를 통해 우리는 효율적인 인터페이스를 갖게 되었습니다. Pyomo의 경우 상당한 성능 향상을 보여줄 수 있습니다.

MINLPlib 성능 개선.새로운 GDX 기반 링크 비교 (gams_shell_new)을 기존 put 기반 링크(gams_shell) 및 Python API를 통한 슬롯 나라 직접 호출(gams_direct). 이론적 최고 및 최악의 시나리오는 다음과 같이 포함됩니다.virt. 최고그리고virt. 최악의, 각각.