소개
오늘날 빠르게 변화하는 비즈니스 세계에서 의사 결정자는 정교한 최적화 기술이 필요한 점점 더 복잡한 문제에 직면하고 있습니다. 사용할 수 있는 모델링 언어와 프레임워크가 너무 많아서 특정 요구 사항에 가장 적합한 언어와 프레임워크를 결정하기 어려울 수 있습니다.
우리는 슬롯 무료체험가 최적화 문제 모델링 및 해결을 위한 강력한 도구라고 믿습니다. 그러나 우리는 고객이 Pyomo, GurobiPy, JuMP와 같은 다른 인기 있는 모델링 프레임워크 대신 슬롯 무료체험를 선택해야 하는 이유에 대해 많은 질문을 갖고 있다는 것도 알고 있습니다.
이 게시물의 내용
이 블로그 게시물에서는 슬롯 무료체험를 다른 모델링 프레임워크와 비교하여 슬롯 무료체험를 경쟁 제품과 차별화시키는 몇 가지 고유한 이점과 기능을 강조하겠습니다. 귀하가 비즈니스 리더이든 연구원이든 이 게시물이 복잡한 최적화 문제를 모델링하고 해결하는 데 슬롯 무료체험가 현명한 선택인 이유를 이해하는 데 도움이 될 것이라고 확신합니다.
모든 모델링 언어의 주요 측면 중 하나는 희소 다차원 데이터 구조를 처리하는 방법입니다. 이 블로그 게시물에서는 Pyomo, GurobiPy, JuMP, 슬롯 무료체험 등 각 모델링 프레임워크가 이 문제에 접근하는 방식과 각 접근 방식의 성능을 살펴보겠습니다.
이러한 각 모델링 언어는 모델링 및 최적화 문제 해결을 위한 유능하고 성공적인 도구라는 점은 주목할 가치가 있습니다. 그러나 개별적인 강점과 약점을 자세히 살펴봄으로써 사용자가 슬롯 무료체험가 강력하고 다재다능한 모델링 언어로서 어떻게 돋보이는지 더 잘 이해할 수 있기를 바랍니다.
운영 연구에서 직면한 문제 특성
많은 최적화 문제는 다음과 같은 특정 구조에 영향을 받습니다.데이터 큐브0이 많이 있고 0이 아닌 소수가 있습니다. 이 특성은희소. 최적화 문제에서는 하위 집합에 대한 인덱스의 복잡한 매핑을 설명해야 하는 경우가 많습니다. 예를 들어 공급망 관리의 복잡한 세계에서 제품 세트, 생산 단위, 생산 공장, 유통 센터 및 고객은 모델의 구성 요소입니다. 각 제품의 고유성으로 인해 생산 단위 중 일부만이 해당 제품을 제조할 수 있는 능력을 보유하고 있는 경우가 많습니다. 또한 특정 생산 공장에서는 사용 가능한 모든 생산 단위 중 일부에만 접근할 수 있습니다. 게다가 생산 공장의 위치는 특정 하위 집합만 제품 보관에 적합한 것으로 간주되므로 유통 센터에 대한 옵션이 더욱 좁아집니다. 마지막으로 특정 유통 센터만 고객에게 제품을 배송하는 것으로 간주됩니다.
이러한 일반적인 구조는 다음과 같이 가장 잘 표현됩니다.지도. 우리는 희소성 문제의 핵심에 초점을 맞추기 위해 실제 사례 대신 추상화($\mathcalI$, $\mathcalJ$, $\mathcalK$, $\mathcalL$ 및 $\mathcalM$ 설정)를 사용하여 계속 작업합니다. 예를 들어 $\mathcalIJK$ 지도는 데카르트 곱 $\mathcalI \times \mathcalJ \times \mathcalK$의 하위 집합입니다. $\mathcalIJK$의 희소성은 $|\mathcalIJK|\ll|\mathcalI \times \mathcalJ \times \mathcalK|$를 의미합니다. 달리사전키와 값이 명확하게 지정된 경우 맵은 다른 키(조합)와 함께 사용될 수 있습니다. 따라서 어떤 상황에서는 맵이 주어진 $i$에 대해 세트 요소 $j$ 및 $k$를 제공하고, 다른 상황에서는 동일한 맵이 주어진 $j$ 및 $k$에 대해 세트 요소 $i$를 제공합니다. 우리가 언급한 각 모델링 언어가 이러한 희소 구조와 복잡한 인덱스 매핑을 처리하는 방법과 다음과 같은 추상적이고 부분적이지만 일반적으로 구조화된 모델 대수를 사용하여 점점 커지는 문제 크기에 대해 어떻게 수행하는지 살펴보겠습니다.
$$\min F = 1 $$
$$\sum_(j,k):(i,j,k) \in \mathcalIJK \ \sum_l:(j,k,l) \in \mathcalJKL \ \sum_m:(k,l,m) \in \mathcalKLM x_i,j,k,l,m \ge 0 \hspace1cm \forall \ i \in \mathcalI$$
$$x_i,j,k,l,m \ge 0 \hspace1cm \forall \ (i,j,k) \in \mathcalIJK, l:(j,k,l) \in \mathcalJKL, m:(k,l,m) \in \mathcalKLM $$
범용 프로그래밍 언어와 도메인별 모델링 언어
슬롯 무료체험와 우리가 언급한 다른 모델링 프레임워크 간의 주요 차이점 중 하나는 슬롯 무료체험가 도메인별 언어인 반면 나머지는 범용 프로그래밍 언어를 기반으로 한다는 것입니다. 이는 슬롯 무료체험가 컴퓨터가 모델을 실행할 수 있고 사용자가 모델을 쉽게 읽을 수 있는 방식으로 대수 모델을 나타내도록 특별히 설계되었음을 의미합니다. 대조적으로, Pyomo, JuMP 및 GurobiPy와 같은 모델링 프레임워크는 대수 모델을 최대한 효과적으로 표현하기 위해 일반적인 프로그래밍 규칙을 사용합니다. 도메인별 언어 덕분에 슬롯 무료체험를 사용하면 대수 공식과 매우 유사한 코드 몇 줄만 사용하여 모델을 작성할 수 있습니다.
Pyomo를 사용하여 동일한 모델을 표현한다면 훨씬 더 많은 코드 라인과 중첩 작업이 발생하게 됩니다. 이러한 차이는 모델의 가독성에 큰 영향을 미칠 수 있으므로 복잡한 최적화 모델을 개발, 테스트 및 유지하는 데 필요한 시간과 노력에 영향을 미칠 수 있습니다. 모델링 언어로서 슬롯 무료체험의 단순성과 사용자 친화성에 대한 훌륭한 예시는 슬롯 무료체험의 변수 선언($x_i,j,k,l,m$) 구문과 Pyomo의 구문을 비교하여 찾을 수 있습니다.
모델.x=표.바르([(i, j, k, l, m) for(i, j, k)에모델.IJK for(jj, kk, l)in모델.JKL if(jj==j)그리고(ㅋ==k) for(ㅋㅋㅋㅋ, ll, m)에모델.KLM if(ㅋㅋㅋ==k)그리고(ll==l)],도메인=표.NonNegativeReals, )
대
양수 변수 x(i,j,k,l,m);Pyomo와 슬롯 무료체험 사이의 변수 선언에 있어서 이렇게 중요한 차이가 있는 이유는 슬롯 무료체험는 대수적 공식을 기반으로 관련 지수 조합에 대해서만 변수 생성을 자동으로 처리하는 반면, Pyomo에서는 관련 변수 지수 조합을 직접 신중하게 정의해야 하기 때문입니다. 이 기능은 가능한 모든 인덱스 조합을 생성하는 데 계산 비용이 많이 들고 불필요한 대규모 다차원 인덱스 공간으로 작업할 때 특히 유용합니다. 슬롯 무료체험는 백그라운드에서 이 작업을 조용히 처리하므로 우리는 모델 공식화에 집중할 수 있습니다.
더 많은 유연성이 항상 더 좋은 것은 아닌가요?
그림 1은 문제 크기, 특히 $\mathcalI$ 집합의 크기 증가에 따라 Pyomo를 사용하여 예시적인 수학적 모델에 대한 모델 인스턴스를 생성하는 데 필요한 시간을 나타냅니다. 그림은 관련 변수만 주의 깊게 정의하지 않고 모든 변수를 모든 지수의 데카르트 곱으로 정의하는 모델 구현을 위한 모델 생성 시간을 보여줍니다. 대조적으로, 그림 1은 관련 변수만 주의 깊게 정의된 구현에 대한 모델 생성 시간도 보여줍니다. 우리는 모든 문제 규모 데이터 포인트에 대해 여러 번의 실행을 통해 최소 모델 생성 시간을 보고합니다. 두 가지 구현에 대한 모델 생성 시간을 비교하면 수학적 최적화에서 정확한 변수 정의의 중요성이 강조됩니다. 데카르트 곱 구현을 위한 모델 생성 시간은 문제 크기에 따라 급격히 증가하는 반면 신중하게 정의된 변수 구현은 적당한 모델 생성 시간을 유지합니다.

그림 1.데카르트식 및 신중하게 정의된 변수 정의에 대한 모델 생성 시간.
그러나 Python과 같은 범용 프로그래밍 언어는 슬롯 무료체험와 같은 도메인별 언어보다 훨씬 더 유연합니다.
범용 프로그래밍 언어가 더 많은 유연성과 제어 기능을 제공하는 것은 사실이지만 절충점을 고려하는 것이 중요합니다. Python 및 Julia와 같은 범용 언어를 사용하면 수학적 공식과 밀접하게 일치하는 간단한 구현이 종종 자명하고 구현, 읽기 및 유지 관리가 더 쉽지만 성능이 부족합니다. 수학적 모델을 나타내는 코드의 단순성과 성능 간의 균형을 맞추려는 시도에서 절충이 필요합니다.
슬롯 무료체험 대 Pyomo의 예에서 보았듯이 더 많은 제어권을 갖는다는 것은 때로는 관련 변수만 수동으로 생성하는 것과 같이 더 많은 책임을 진다는 것을 의미합니다. 유연성은 양날의 검이기도 합니다. 작업을 수행하는 다양한 방법을 제공하지만 효율적이지 않은 솔루션을 구현할 위험도 있습니다. 그리고 최적의 접근 방식을 결정하는 것은 그 자체로 어려운 작업입니다. 논의된 모든 모델링 프레임워크는 개인 취향에 따라 우리 예제 모델의 직관적 구현을 어느 정도 허용합니다. 그러나 직관적인 솔루션이 항상 효율적인 것은 아닙니다. 추가 연구와 노력을 통해 JuMP에 대한 그림 2와 같이 직관적인 접근 방식을 능가하는 대체 구현을 찾는 것이 가능합니다.

그림 2.JuMP에서 저성능 구현과 고성능 구현의 모델 생성 시간을 비교했습니다.
우리는 기본 언어 Python을 사용하여 GurobiPy 및 Pyomo와 같은 모델링 프레임워크와 관련하여 JuMP에 적용되는 동일한 원칙을 봅니다. 그림 3은 Pyomo 및 GurobiPy를 사용한 모델 표현에 대한 직관적인 데이터 구조와 최적화된 데이터 구조의 차이점을 간략하게 설명합니다.
그림 2와 3에서 Pyomo, JuMP, GurobiPy 예제에서 볼 수 있듯이 직관에만 의존하고 간단한 구현이 항상 가장 효율적인 솔루션으로 이어지는 것은 아닙니다. 모델 표현을 최적화하고 모델 생성 시간과 관련하여 성능을 향상시키는 방법을 찾으려면 상당한 양의 연구와 노력이 필요합니다. 모델 및 매개변수 조정은 항상 최적화 모델 개발의 일부이지만 수학적 기초를 모호하게 해서는 안 되며 유지 관리 및 추가 개발을 방해해서는 안 됩니다. 특히 개발 초기 단계에서는 수정마다 튜닝하는 번거로움 없이 모델의 변경 사항을 쉽게 평가하고 신속한 프로토타이핑에 참여할 수 있는 능력을 갖추는 것이 중요합니다. 슬롯 무료체험와 같은 도메인별 언어가 빛나는 곳입니다. 슬롯 무료체험는 범용 프로그래밍 언어를 기반으로 구축된 모델링 프레임워크에서 사용자가 수동으로 수행해야 하는 내장 코드 최적화를 위한 기반을 특수 구문과 함께 제공합니다.
성능은 어떻습니까?
이제 우리는 그 언어들이 어떻게 사용되는지 논의했으므로, 그들의 성능을 비교해 봅시다. 슬롯 무료체험, Pyomo, GurobiPy 및 JuMP의 성능을 평가하기 위해 $\mathcalI$, $\mathcalJ$, $\mathcalK$, $\mathcalL$ 및 $\mathcalM$ 세트에 대해 생성된 데이터 세트를 사용하여 연구를 수행합니다. 이 데이터 세트는 $\mathcalI$ 세트에 대해 $N$ 카디널리티, 세트에 대해 $O$ 카디널리티를 갖습니다. $\mathcalJ$, $\mathcalK$, $\mathcalL$ 및 $\mathcalM$. 무작위 다차원 집합 $\mathcalIJK$, $\mathcalJKL$ 및 $\mathcalKLM$는 $(i,j,k)$, $(j,k,l)$ 및 $(k,l,m)$가 각각 $\mathcalIJK$, $\mathcalJKL$, $\mathcalKLM$에 있을 확률이 5%로 생성됩니다. $\mathcalI\times\mathcalJ\times\mathcalK$, $\mathcalJ\times\mathcalK\times\mathcalL$ 및 $\mathcalK\times\mathcalL\times\mathcalM$의 전체 데카르트 곱입니다. $N$을 증가시키면 $\mathcalI$ 및 $\mathcalIJK$의 카디널리티도 증가합니다. 우리는 각 언어가 동일한 데이터 세트를 사용하여 제시된 모델을 0초의 솔버 시간 제한으로 생성하고 해결하는 데 필요한 시간을 측정합니다. 우리는 데이터 세트당 통계적으로 관련된 실행 횟수에 걸쳐 각 언어에서 달성한 최소 모델 생성 시간을 보고합니다.
그림 4에서 얻은 결과에 따르면 도입된 언어의 성능에는 큰 차이가 있습니다. GurobiPy, JuMP 및 Pyomo의 선형 성장을 관찰하는 동안 슬롯 무료체험의 모델 생성 시간은 크게 증가하지 않습니다.
그런데 슬롯 무료체험가 Pyomo, JuMP 및 GurobiPy보다 뛰어난 성능을 보이는 이유는 무엇입니까?
이 예에서 슬롯 무료체험 성능이 뛰어난 이유는 관계 대수학을 사용했기 때문입니다. Pyomo, GurobiPy 및 JuMP와 같은 다른 최적화 소프트웨어는 세트의 모든 요소에 대해 반복해야 하지만 슬롯 무료체험는 관계형 대수를 사용하여 복잡한 쿼리를 효율적으로 처리합니다. 관계 대수학은 데이터베이스 이론에서 유래되었으며 모든 데이터베이스 항목을 반복할 필요 없이 복잡한 데이터베이스 쿼리를 매우 효율적으로 처리할 수 있습니다. 결과적으로 슬롯 무료체험는 다른 많은 모델링 언어보다 대규모 최적화 문제를 더 효율적이고 효과적으로 처리할 수 있습니다.
그런데 내가 왜 모델 생성에 관심을 두나요?
수학적 최적화에 있어서 모델 생성 시간의 중요성을 과소평가해서는 안 됩니다. 솔버의 성능에만 집중하고 싶은 유혹이 있을 수 있지만, 사실 모델 생성에 소요되는 시간은 최적화 프로세스의 전반적인 효율성과 실용성에 큰 영향을 미칠 수 있습니다. 물론, 솔버가 대부분의 시간을 소모한다면 모델 생성의 관련성은 어느 정도 감소합니다. 그러나 고객의 피드백에서는 단순히 문제를 해결하는 것 이상으로 성능을 고려하는 것이 중요하다는 점을 지속적으로 강조하고 있습니다. 이러한 관점을 강조하는 주목할만한 예는 최적화 모델을 슬롯 무료체험로 전환하는 과정에서 PROS Inc.의 경험을 공유한 Abhijit Bora가 전달한 것입니다.
슬롯 무료체험를 사용하여 대규모 최적화 모델을 다시 구현하기로 한 결정은 이전의 모든 모델링 기술을 능가하는 탁월한 결과를 가져왔습니다. 300%의 놀라운 개선을 통해 이 성과는 우리에게 엄청난 의미를 갖습니다. 이는 최적화에서 전례 없는 가능성의 문을 열어줍니다. 한때는 달성할 수 없다고 여겨졌으나 현실이 된 오랫동안 원했던 기능인 360일의 지평선을 이제는 수용할 수 있습니다.
– Abhijit Bora, PROS Inc.의 수석 소프트웨어 엔지니어
다른 최근 연구에서도 모델 생성의 효율성에 중점을 두고 있습니다. 논문Linopy: n차원 레이블 변수를 사용한 선형 최적화1일부 오픈 소스 모델링 프레임워크를 비교했지만 불행히도 벤치마크 문제로 밀집된 모델(배낭 문제)을 선택했습니다. 우리의 경험에 따르면 밀도가 높은 모델은 실제로 극히 드물며 모델 생성과 관련하여 실제로 어려움을 나타내지 않습니다. 진행 중인 연구실제 사용 사례에서 대수 모델링 언어의 계산 성능카네기 멜론 대학교에서2또한 모델 생성 성능에 중점을 두고 다양한 모델링 프레임워크를 분석합니다.
요약하자
슬롯 무료체험는 관계형 대수학의 사용과 복잡한 변수 정의의 효율적인 처리로 인해 강력한 최적화 도구임이 입증되었습니다. 또한 수학적 표기법을 통해 직관적이고 읽기 쉬운 모델 구현이 가능합니다. 슬롯 무료체험와 같은 도메인별 언어와 Pyomo와 같은 범용 프로그래밍 언어 패키지 사이의 선택은 궁극적으로 당면한 문제에 따라 다르지만 제어, 유연성 및 효율성 간의 균형을 고려하는 것이 중요합니다. 신중한 고려와 노력을 통해 두 언어 유형 모두 최적의 결과를 얻을 수 있습니다.
관심 있는 사람이라면 누구나 이 분석에 사용된 전체 코드를 찾을 수 있습니다.GitHub저장소.
이 게시물은 2023년 7월 13일에 업데이트되었습니다.이 게시물의 이전 버전에는 콘텐츠가 포함되어 있습니다(공개 포럼의 인용문3 4및 인정) JuMP와 Pyomo 개발자가 이 블로그 게시물을 작성하는 데 협력했거나 해당 콘텐츠를 승인했다는 잘못된 인상을 전달했을 수 있습니다. 이는 사실이 아니었으며 이후 이 콘텐츠를 삭제했음을 명확히 하고자 합니다.
-
호프만, F., (2023). Linopy: n차원 레이블 변수를 사용한 선형 최적화. 오픈 소스 소프트웨어 저널, 8(84), 4823,https://doi.org/10.21105/joss.04823 ↩︎
-
Kompalli, S., Merakli, M., Ammari, B. L., Qian, Y., Pulsipher, J. L., Bynum, M., Furman, K. C., Laird, C. D. (2023). 실제 사용 사례에서 대수 모델링 언어의 계산 성능. Carnegie Mellon University, 연례 검토 회의, 2023년 3월 6~7일. ↩︎
-
https://discourse.julialang.org/t/performance-julia-jump-vs-python-pyomo/92044 ↩︎
-
https://stackoverflow.com/questions/76324121/is-there-a-more-efficient-implementation-for-pyomo-models-compared-to-the-curren ↩︎