0

비선형 최적화의 성능이 해석 엔진이 인터페이스되는 특정 방식의 영향을받는 방법을 이해하는 데 어려움이 있습니다.비선형 솔버에서 솔버 시간과 NLP 함수 평가는 무엇에 영향을 줍니까?

우리는 첫 번째 버전에서 GAMS로 작성된 최적화 모델을 가지고 있습니다. IPOPT (공통 FOOS 비선형 해석 엔진)는 IPOPT (기능 평가 없음)에서 1.4 CPU 초 및 기능 평가에서 0.2 CPU 초의 각 최적화에 대한 실행 시간을 반환했습니다.

우리는 모델을 모델의 최적화되지 않은 구성 요소를 더 잘 고려하기 위해 C++로 변환하고 C++ API (ADOL-C 및 ColPack for AD 사용)와 인터페이스하여 0.7 초 IPOPT에서 9.4 초, IPOPT에서의 개선은 IPOPT를 소스별로 컴파일하면 IPOPT의 GAMS 버전에서 사용할 수없는 더 나은 선형 솔버를 사용할 수 있었기 때문입니다.

따라서 C++을 사용하면 잘못 최적화 된 코드를 사용하여 GAMS보다 50 배나 느린 결과를 얻었으며 부분적으로 더 나은 해석 시간을 보완했습니다.

Pyomo와 Pyomo, Julia with JuMP와 같은 다른 언어로 모델을 변환 할 수있는 가능성을 평가 중입니다.

하지만 각 단계에서 해결자가 만든 함수 평가가 구현 된 특정 언어에 따라 어떻게 달라지는 지 먼저 알고 싶습니다.

C++을 사용하면 최적화 모델을 만드는 함수가 각 반복마다 직접 실행 (평가)되므로 구현 방법이 중요합니다 (특히 그래디언트와 헤센은 매번 다시 계산됩니다. 구현시).

Pyomo와 JuMP는 어땠습니까? Python과 Julia에서 각각의 반복이 평가 될지, 아니면 Pyomo와 JuMP가 C에서 모델을 먼저 렌더링하고, 그라디언트와 헤센을 한번 계산 (평가하지 않음) 한 다음이 "C 버전"이라고합니다. 매번 평가 될까요? 분명히 파이썬에 큰 차이가 있습니다.

+1

첫 번째 질문은 두 가지 구현이 동일한 지 여부입니다. 데이터가 동일합니까? 모델? 무작위 씨앗? 같은 해결책을 얻었습니까? 나는이 질문 중 몇 가지는 아니오로 대답 할 것이라고 확신한다. 두 가지 구현이 완전히 똑같은 일을하지 않는다면, 특히 경험적 방식의 행동이 핵심 인 어려운 문제를 해결할 때 특히 평가하기가 어렵습니다! 이것은 실제로 이것을 분석하기 위해 훨씬 더 큰 벤치 마크가 필요하다는 것을 암시합니다. 기능 평가에 큰 영향을 미치지 않을 것입니다. 아마도 자동 차별화 일 것입니다. 하지만 그것은 단지 추측입니다. – sascha

+1

(1) GAMS 솔버 IPOPTH는 MUMPS (2) GAMS 함수를 사용하는 IPOPT보다 성능이 좋아지는 MA27을 사용하며 GAMS 함수는 일부 하위 표현식을 공유 할 수 있습니다. 때로는 시간을 절약 할 수 있습니다. (3) CONVERT 해석기로 모형을 (못생긴, 스칼라) Pyomo 코드로 변환하여 신속하게 pyomo를 시험해 볼 수 있습니다. –

답변

1

Pyomo는 모델을 NL 파일 형식으로 변환하여 Ipopt에 연결합니다. "ipopt"실행 파일이 PATH에 있다고 가정합니다 (Ipopt는 ASL로 컴파일됩니다). 최적화 도중 발생하는 모든 함수 평가는 Ampl Solver Library 내의 C에서 수행됩니다.

0

JuMP는 our own benchmarks에서 GAMS와 호의적으로 비교되었습니다. 그걸 가져 가라. 미분 계산은 Julia (빠른 것), 컴파일 된 C 코드가 아닙니다.