2017-04-14 10 views
3

엄청난 수의 제약 조건과 변수 (약 10e6)가있는 OR 모델을 생성하는 Pyomo의 성능에 관심이 있습니다. 현재 GAMS를 사용하여 최적화를 시작했지만 다른 Python 기능을 사용하고 Pyomo를 사용하여 모델을 생성하고 싶습니다.많은 수의 제약 조건을 가진 모델을 생성하기위한 pyomo의 성능

필자는 모델을 작성할 때 제약 조건을 정의하는 데 사용 된 python 메서드가 제약 조건이 인스턴스화 될 때마다 호출됩니다. 구현에 들어가기 전에 numpy 배열 데이터를 기반으로 제약 조건 블록을 직접 생성하는 방법이 있는지 알고 싶습니다. 필자의 관점에서 볼 때, 블록 단위로 구속 조건을 구성하는 것은 대형 모델에 더 효율적일 수 있습니다.

pyomo 또는 다른 python 모델링 라이브러리를 사용하여 GAMS 또는 다른 AML 언어와 비슷한 성능을 얻을 수 있다고 생각하십니까?

미리 도움 주셔서 감사합니다.

+0

일반적으로 GAMS는 Pyomo보다 빠릅니다 (특히 데이터 모델링 단계가 많은 경우 AMPL보다 빠른 모델이지만 AMPL이 훨씬 빠른 모델을 알고 있습니다). –

답변

3

Pyomo 구속 조건을 만들 때 NumPy 데이터를 사용할 수 있지만 현재 Pyomo로 단일 NumPy 스타일 명령으로 구속 조건 블록을 만들 수 없습니다. 그게 가치있는 일 이니, 나는 AMPL이나 GAMS 같은 언어로 할 수 있다고 믿지 않는다. Pyomo가 마침내 행렬 및 벡터 연산을 사용하여 제약 조건을 정의하는 사용자를 지원할 수 있지만 솔버 인터페이스 (예 : NL, LP, MPS 파일)가 모두 명시적인 "평면"표현이므로 개별 제약 조건 생성을 피할 수는 없습니다 개별 제약을 나타냅니다. 이는 Pyomo가 대수 (표현식)의 표현을 명시 적으로 생성하여 솔버에게 전송해야하기 때문입니다. 반대로 NumPy는 만 계산하면 결과가입니다. C/C++ 백엔드 (즉, 은 아니요, Python에서는이 아님)에서 데이터를 생성하여 효율성을 얻고 저수준 BLAS 연산을 사용하여 효율적으로 결과를 계산하고, 결과는으로 돌아갑니다.

성능과 확장성에 관한 한, 13e6 개 이상의 변수와 21e6 제약이있는 원시 모델을 생성했습니다. 즉, Pyomo는 속도보다는 유연성과 확장 성을 위해 설계되었습니다. Python의 런타임은 cPython을 사용할 때 AMPL보다 훨씬 느릴 수 있습니다 (pypy를 사용하여 4 또는 5 배로 축소 될 수 있지만). 적어도 역사적으로 AMPL은 GAMS보다 빠르므로 Pyomo와 GAMS 사이의 격차는 더 작아야합니다. 그들은 클래스를 정의

https://github.com/FRESNA/PyPSA/blob/master/pypsa/opt.py

보다 효율적 이상의 제약 조건을 정의하기 : 나는 조나스 HORSCH 톰 브라운에서이 코드 조각을 건너 와서는 나에게 매우 유용 때 나는 또한 같은 궁금

+0

답장을 보내 주셔서 감사합니다. 저는 항상 Pyomo에 대해 의심의 여지가있었습니다. 하지만 아래 부분을 더 명확히 할 수 있습니까? > [...] 솔버 인터페이스 [...]는 명시 적 [ly]가 개별 제약 조건을 나타내는 모든 "평면"표현입니다. [...] Pyomo는 솔버에게 보내는 _algebra_ (즉, 표현식)의 표현을 명시 적으로 생성해야합니다. 반대로 NumPy는 결과를 계산할뿐입니다. 결과를 효율적으로 계산하기 위해 저수준 BLAS 연산에 의존하는 C/C++ 백엔드 [...]에서 데이터를 생성하여 효율성을 얻습니다. 파이썬. –

+0

매트릭스 표현이있는 경우와 스칼라 형태의 연립 선형 방정식을 쓰는 경우의 차이점은 무엇입니까? 솔버 입력 파일에는 엄청난 수의 제약 조건을 나타낼 수있는 매트릭스가 있습니다. 아니면 희소성 때문에 그게 아니라고 말하는거야? –

+0

필자가 아는 바로는 표준 솔버 입력 형식은 제약 조건을 지정하는 "행렬 - 틱"방식을 지원하지 않습니다. 선형 해석기의 경우 표준 형식은 LP (행 기반) 및 MPS (열 기반)입니다. 둘 다 명시 적으로 "A"매트릭스의 모든 비 제로를 나열합니다. 일반 비선형의 경우 실제로는 표준 형식이 아닙니다. AMPL의 NL 형식이 가장 비슷하며 행 기반입니다. 일부 볼록 솔버는 행렬 스타일 입력을 지원하지만 일반적으로 일반 비선형 해석자가 사용하는 형식이 아닙니다. – jsiirola

4

최초의 Pyomo 파서는 그렇다. 내가 가지고있는 대형 모델에 대해 몇 가지 테스트를 수행했으며 생성 시간을 상당히 줄였습니다.