중화사전망 - 서예자전 - 만자색은 파이썬으로 선형 프로그래밍을 하는 방법을 가르쳐 준다.
만자색은 파이썬으로 선형 프로그래밍을 하는 방법을 가르쳐 준다.
혼합 정수 선형 프로그래밍은 선형 프로그래밍의 확장입니다. 하나 이상의 변수가 연속 값 대신 개별 정수를 사용하는 문제를 처리합니다. 혼합 정수 문제는 언뜻 보면 연속 변수 문제와 비슷하지만 유연성과 정확성에 뚜렷한 장점이 있습니다.
정수 변수는 생산된 항공기 수 또는 서비스의 고객 수와 같이 정수로 자연스럽게 표현되는 수량을 정확하게 나타내는 데 중요합니다.
특히 중요한 정수 변수는 이진 변수입니다. 값 0 또는 1 만 사용할 수 있으며, 공장을 건설해야 하는지, 기계를 켜거나 꺼야 하는지 등 예 또는 아니오 결정을 내릴 때 유용합니다. 논리적 구속조건을 시뮬레이트하는 데 사용할 수도 있습니다.
선형 프로그래밍은 수십 년 동안 과학 및 수학 집약적 분야에 사용되어 온 기본적인 최적화 기술입니다. 정확하고 상대적으로 빠르며 일련의 실제 어플리케이션에 적합합니다.
혼합 정수 선형 계획을 사용하면 선형 계획의 많은 제한을 극복할 수 있습니다. 세그먼트 선형 함수를 사용하여 비선형 함수를 근사화하고 반연속 변수, 모형 논리 구속조건 등을 사용할 수 있습니다. 이 도구는 연산 집약적 도구이지만 컴퓨터 하드웨어와 소프트웨어의 발전으로 매일 더 적합합니다.
일반적으로 최적화 문제를 개발하고 해결하려고 할 때 첫 번째 질문은 선형 또는 혼합 정수 선형 계획을 적용할 수 있는지 여부입니다.
다음 문장 예는 선형 및 혼합 정수 선형 계획의 몇 가지 사용 사례를 보여 줍니다.
컴퓨터 기능 향상, 알고리즘 개선 및 사용자 친화적인 소프트웨어 솔루션이 등장하면서 선형 계획, 특히 혼합 정수 선형 계획의 중요성이 커지고 있습니다.
선형 계획 문제를 해결하는 기본 방법을 많은 변형이라고 합니다. 또 다른 유행하는 방법은.
혼합 정수 선형 계획 문제는 장면 뒤에서 선형 계획을 사용하는 등 보다 복잡하고 계산 집약적인 방법으로 해결할 수 있습니다. 이 방법의 일부 변경 사항은 절단 평면의 사용과 관련이 있다는 것입니다.
선형 계획 및 혼합 정수 선형 계획의 경우 몇 가지 적절하고 잘 알려진 파이썬 도구가 있습니다. 그 중 일부는 오픈소스이고, 다른 일부는 독점적이다. 무료 또는 유료 도구의 필요성은 문제의 규모와 복잡성, 속도와 유연성에 대한 수요에 따라 달라집니다.
흥미롭게도, 널리 사용되는 거의 모든 선형 프로그래밍 및 혼합 정수 선형 프로그래밍 라이브러리는 기본적으로 포트란 또는 C 또는 C++ 로 작성되었습니다. 이는 선형 프로그래밍이 (일반적으로 큰) 행렬에서 연산 집약적 작업을 수행해야 하기 때문입니다. 이 클래스 라이브러리를 solver 라고 합니다. 파이썬 도구는 솔버의 래퍼일 뿐입니다.
파이썬은 C/C++ 와 함께 잘 작동하기 때문에 이 라이브러리 주위에 래퍼를 구축하는 데 적합합니다. 이 자습서에서는 C/C++ (또는 포트란) 가 필요하지 않지만 이 멋진 기능에 대한 자세한 내용은 다음 리소스를 참조하십시오.
기본적으로 모델을 정의하고 해석할 때 파이썬 함수 또는 메서드를 사용하여 실제 최적화 작업을 수행하고 사용자에게 솔루션을 반환하는 기본 라이브러리를 호출합니다.
몇 가지 무료 파이썬 라이브러리는 선형 또는 혼합 정수 선형 솔버와 상호 작용하도록 설계되었습니다.
이 튜토리얼에서는 SciPy 와 PuLP 를 사용하여 선형 프로그래밍 문제를 정의하고 해결합니다.
이 섹션에서는 두 가지 선형 계획 문제의 예를 볼 수 있습니다.
다음 섹션에서는 파이썬 (Python) 을 사용하여 이 두 가지 문제를 해결합니다.
다음과 같은 선형 프로그래밍 문제를 고려해 보십시오.
X 를 찾아야 하나요? 빨강, 파랑, 노랑이 같지 않게, 부등식 X 0 과? 0, 만족스럽습니다. 동시에, 너의 해법은 반드시 z 의 최대 가능 값에 해당해야 한다.
찾을 수 있는 인수 (이 경우 x 와 y) 를 결정 변수라고 합니다. 최대화 또는 최소화할 결정 변수의 함수 (이 경우 z) 를 목표 함수, 비용 함수 또는 목표라고 합니다. 네가 만족시켜야 할 부등식을 부등식 제약이라고 한다. 동등 구속조건 이라는 구속조건에 방정식을 사용할 수도 있습니다.
이것이 여러분이 문제를 상상하는 방식입니다.
빨간색 선이 나타내는 함수는 2 X+? = 20, 위의 빨간색 영역은 빨간색 부등식이 충족되지 않았음을 나타냅니다. 마찬가지로 파란색 선은 함수 4 x+5 y = 10 이고 파란색 영역은 파란색 부등식을 위반하기 때문에 금지되어 있습니다. 노란색 선은 x+2 y = 2 이고, 아래의 노란색 영역은 노란색 부등식이 유효하지 않은 곳입니다.
빨간색, 파란색 및 노란색 영역을 무시하면 회색 영역만 남습니다. 회색 영역의 각 점은 모든 구속조건을 충족하며 문제에 대한 잠재적 해결책입니다. 이 영역을 실행 가능한 영역이라고 하며, 그 점은 실행 가능한 솔루션입니다. 이 경우 수많은 실행 가능한 솔루션이 있습니다.
너는 Z 를 최대화하고 싶다. Z 를 최대화하는 실행 가능한 해결책이 바로 최적의 해법이다. 목표 함수를 최소화하려고 하면 최적의 솔루션은 실행 가능한 최소값에 해당합니다.
Z 는 선형입니다. 너는 그것을 3 차원 공간의 평면으로 상상할 수 있다. 이것이 최적의 솔루션이 실행 가능한 도메인의 정점이나 구석에 있어야 하는 이유입니다. 이 경우 가장 좋은 솔루션은 빨간색 선과 파란색 선의 교차점이며 나중에 볼 수 있습니다.
경우에 따라 실행 가능한 필드의 전체 가장자리 또는 전체 영역이 동일한 z 값에 해당될 수 있습니다. 이 경우, 당신은 많은 최고의 해결책을 가지고 있습니다.
이제 녹색으로 표시된 추가 방정식 구속을 사용하여 문제를 확장할 수 있습니다.
방정식 x+5 y = 15, 녹색으로 쓴 것이 새 것이다. 이것은 동등 구속조건입니다. 적절한 녹색 선을 추가하여 이전 이미지를 시각화할 수 있습니다.
현재 솔루션은 녹색 방정식을 만족시켜야 하므로 실행 가능한 영역은 더 이상 전체 회색 영역이 아닙니다. 녹색 선이 파란색 선과의 교차점에서 빨간색 선과의 교차점까지 회색 영역을 통과하는 부분입니다. 후자의 점은 해결책이다.
삽입된 x 의 모든 값이 정수의 요구 사항이어야 하는 경우 혼합 정수 선형 계획 문제가 발생하고 실행 가능한 솔루션 세트가 변경됩니다.
녹색 선은 더 이상 없으며 x 값이 정수인 점만 있습니다. 실행 가능한 솔루션은 회색 배경의 녹색 점으로, 이 경우 최적의 솔루션이 빨간색 선에 가장 가깝습니다.
이 세 가지 예는 제한된 실행 가능한 영역과 제한된 솔루션을 가지고 있기 때문에 가능한 선형 계획 문제를 보여 줍니다.
해결책이 없다면 선형 프로그래밍 문제는 불가능합니다. 이는 일반적으로 모든 구속조건을 동시에 충족시킬 수 있는 솔루션이 없을 때 발생합니다.
예를 들어 제약 조건 x+y 1 을 추가하면 어떻게 되는지 생각해 보십시오. 적어도 하나의 결정 변수 (X 또는 Y) 는 음수여야 합니다. 이는 주어진 제약 조건 x 0 및 y 0 과 충돌합니다. 이런 시스템은 실행 가능한 해결책이 없기 때문에 실행 불가능이라고 불린다.
또 다른 예는 녹색 선에 평행한 두 번째 동등 구속조건을 추가하는 것입니다. 이 두 선에는 * * * 공통점이 없으므로 이 두 구속조건을 충족하는 솔루션은 없습니다.
선형 프로그래밍 문제는 경계가 없다. 실행 가능한 도메인에 경계가 없는 경우 솔루션이 한정되지 않습니다. 즉, 변수 중 적어도 하나는 무제한 이며, 양의 무한대 또는 음의 무한대에 도달할 수 있으므로 목표를 무한대로 만들 수 있습니다.
예를 들어 위의 초기 문제를 사용하고 빨간색 및 노란색 제약 조건을 삭제한다고 가정합니다. 문제에서 제약 조건을 제거하는 것을 릴랙스 문제라고 합니다. 이 경우 x 와 y 는 양의 방향으로 한정되지 않습니다. 이를 양의 무한대로 늘려 무한대의 z 값을 얻을 수 있습니다.
이전 섹션에서는 실제 응용 프로그램과 관련이 없는 추상적인 선형 계획 문제를 살펴보았습니다. 이 섹션에서는 제조 리소스 할당과 관련된 보다 구체적이고 실용적인 최적화 문제를 발견할 수 있습니다.
한 공장에서 네 가지 다른 제품을 생산한다고 가정해 봅시다. 첫 번째 제품의 일일 생산량은 X 입니까? 두 번째 곱의 출력은 x 2 등으로 출력됩니다. 목표는 다음과 같은 조건을 염두에 두고 각 제품의 이익을 결정하고 일일 수량을 극대화하는 것입니다.
수학적 모델은 다음과 같이 정의할 수 있습니다.
목표 함수 (이익) 는 1 조건에 정의됩니다. 사람의 제약은 조건 2 를 따른다. 각 제품의 원자재 수요를 합산하여 조건 3 과 4 에서 원자재 A 와 B 에 대한 제약을 얻을 수 있습니다.
마지막으로 제품 수량은 음수가 될 수 없으므로 모든 결정 변수는 0 보다 크거나 같아야 합니다.
앞의 예와 달리 네 가지 결정 변수가 있기 때문에 쉽게 시각화할 수 없습니다. 그러나 문제의 차원이 어떻든 원칙은 똑같다.
이 자습서에서는 두 개의 파이썬 패키지를 사용하여 위의 선형 프로그래밍 문제를 해결합니다.
SciPy 는 쉽게 설정할 수 있습니다. 설치 후 사용을 시작하는 데 필요한 모든 것을 갖게 됩니다. 그 하위 패키지인 scipy.optimize 는 선형 및 비선형 최적화에 사용할 수 있습니다.
펄프를 사용하면 해결자를 선택하고 보다 자연스러운 방식으로 문제를 표현할 수 있습니다. 펄프에 사용되는 기본 솔버는 동전이나 가지 및 잘라내기 솔버 (CBC) 입니다. 선형 이완을 위한 동전 또는 선형 계획 해석기 (CLP) 와 절단부로 생성된 동전 또는 컷 생성기 라이브러리 (CGL) 에 연결됩니다.
또 다른 위대한 오픈 소스 솔루션은 GNU 선형 프로그래밍 키트 (GLPK) 입니다. Gurobi, CPLEX, XPRESS 등 유명하고 강력한 커머셜 및 독점 솔루션이 있습니다.
문제를 정의할 수 있는 유연성과 다양한 해석기를 실행할 수 있는 기능을 제공하는 것 외에도 PuLP 는 Pyomo 또는 CVXOPT 만큼 복잡하지 않으며 익히는 데 더 많은 시간과 노력이 필요합니다.
이 자습서를 배우려면 SciPy 와 PuLP 를 설치해야 한다. 다음 예제에서는 SciPy 1.4. 1 및 PuLP 2. 1 을 사용합니다.
Pip 를 사용하여 다음과 같은 방법으로 둘 다 설치할 수 있습니다.
특히 Linux 또는 Mac 을 사용하는 경우 PuLP 에 대한 기본 솔버를 활성화하려면 pulptest 또는 sudo pulptest 를 실행해야 할 수 있습니다.
또는 GLPK 를 다운로드, 설치 및 사용할 수 있습니다. Windows, MacOS 및 Linux 용 무료 오픈 소스입니다. 이 자습서의 뒷부분에서는 GLPK (CBC 제외) 와 펄프를 사용하는 방법을 볼 수 있습니다.
Windows 에서는 파일을 다운로드하고 설치 파일을 실행할 수 있습니다.
MacOS 에서는 자체 제작 소프트웨어를 사용할 수 있습니다.
데비안 및 Ubuntu 에서 apt 를 사용하여 glpk 및 glpk-utils 를 설치합니다.
Fedora 에서는 dnf 와 glpk-utils 를 사용합니다.
또한 conda 가 GLPK 설치에 유용하다는 것을 알 수 있습니다.
설치가 완료되면 GLPK 버전을 볼 수 있습니다.
자세한 내용은 GLPK 의 Windows 실행 파일 및 Linux 패키지 설치를 사용하는 자습서를 참조하십시오.
이 섹션에서는 SciPy 최적화 및 루트 라이브러리를 사용하여 선형 프로그래밍을 수행하는 방법에 대해 알아봅니다.
SciPy 를 사용하여 최적화 문제를 정의하고 해결하려면 scipy.optimize.linprog () 를 가져와야 합니다.
이제 linprog () 를 가져왔으므로 최적화를 시작할 수 있습니다.
먼저 위의 선형 프로그래밍 문제를 해결합시다.
Linprog () 는 최소화 (최대화 아님) 문제만 해결하고, 보다 크거나 같은 부등식 제약 조건은 허용하지 않습니다. 이러한 문제를 해결하려면 최적화를 시작하기 전에 문제를 수정해야 합니다.
이러한 변화를 도입하면 새로운 시스템을 얻게 됩니다.
이 시스템은 원래 시스템과 동등하며 동일한 솔루션을 갖게 될 것입니다. 이러한 변경 사항을 적용하는 유일한 이유는 문제 표현과 관련된 SciPy 의 한계를 극복하기 위해서입니다.
다음 단계에서는 입력 값을 정의합니다.
위 시스템의 값을 해당 목록, 튜플 또는 NumPy 배열에 배치합니다.
참고: 행과 열의 순서에주의를 기울이십시오!
구속조건 왼쪽과 오른쪽의 행 순서는 같아야 합니다. 각 행은 하나의 구속조건을 나타냅니다.
대상 함수와 구속조건 왼쪽 계수의 순서가 일치해야 합니다. 각 열은 하나의 결정 변수에 해당합니다.
다음 단계에서는 계수와 같은 순서로 각 변수의 경계를 정의합니다. 이 경우 0 과 양의 무한대 사이에 있습니다.
Linprog () 는 기본적으로 이러한 경계 (0 에서 양의 무한대) 를 사용하기 때문에 이 문은 불필요합니다.
참고: 반대 float("inf ") 의 경우 math.inf, numpy.inf 또는 scipy.inf 를 사용할 수 있습니다
마지막으로 관심 있는 문제를 최적화할 때가 되었다. 이렇게 할 수 있습니다. linprog ():
매개 변수 c 는 대상 함수의 계수를 나타냅니다. A_ub 및 b_ub 는 각각 부등식 구속조건의 왼쪽 및 오른쪽 계수와 관련이 있습니다. 마찬가지로 A_eq 와 b_eq 도 참조 방정식에 의해 구속됩니다. 한계를 사용하여 결정 변수의 하한 및 상한을 제공할 수 있습니다.
이 매개변수 방법을 사용하여 사용할 선형 계획 방법을 정의할 수 있습니다. 다음과 같은 세 가지 옵션이 있습니다.
Linprog () 는 다음 속성을 가진 데이터 구조를 반환합니다.
이러한 값에 개별적으로 액세스할 수 있습니다.
이것이 바로 네가 어떻게 최적화를 얻은 결과이다. 또한 그래픽으로 표시할 수 있습니다.
앞서 언급했듯이 선형 계획 문제에 대한 최적의 솔루션은 실행 가능한 도메인의 정점에 있습니다. 이 경우 실행 가능 영역은 파란색 선과 빨간색 선 사이의 녹색 선일 뿐입니다. 가장 좋은 솔루션은 녹색 선과 빨간색 선의 교차점을 나타내는 녹색 사각형입니다.
방정식 (녹색) 제약 조건을 제외하려면 linprog () 호출에서 A_eq 및 b_eq 매개 변수를 제거하면 됩니다.
해결책은 이전 상황과 다릅니다. 그래프에서 볼 수 있습니다.
이 경우 가장 좋은 솔루션은 빨간색과 파란색 제약 조건이 교차하는 실행 가능한 (회색) 영역의 자주색 정점입니다. 노란색 정점과 같은 다른 정점은 대상 함수 값이 더 높습니다.
SciPy 를 사용하여 이전 섹션에서 설명한 자원 할당 문제를 해결할 수 있습니다.
앞의 예와 마찬가지로 위의 문제에서 필요한 벡터와 행렬을 추출하여 인수로 에 전달해야 합니다. Linprog () 를 사용하여 결과를 얻습니다.
그 결과 최대 이익 1900 대응 X 를 알려드릴까요? = 5 와 x? = 45 입니다. 특정 조건 하에서 두 번째와 네 번째 제품을 생산하는 것은 수익성이 없다. 여기서 몇 가지 흥미로운 결론을 내릴 수 있습니다.
Opt.statusis0 및 Opt 입니다. 그 결과 최적화 문제가 성공적으로 해결되어 최적의 실현 가능한 해결책을 얻었음을 알 수 있다.
SciPy 의 선형 계획 함수는 주로 작은 문제에 사용됩니다. 더 크고 복잡한 문제의 경우 다음과 같은 이유로 다른 라이브러리가 더 적합하다는 것을 알 수 있습니다.
다행히도 Python 생태계는 선형 프로그래밍을 위한 몇 가지 대안을 제공하며 큰 문제에 유용합니다. 그 중 하나는 펄프이며, 다음 섹션에서는 그것의 실제 응용을 볼 수 있습니다.
PuLP 에는 SciPy 보다 편리한 선형 프로그래밍 API 가 있습니다. 너는 수학적으로 너의 문제를 수정하거나 벡터와 행렬을 사용할 필요가 없다. 모든 것이 더 깨끗하고 실수하기 쉽다.
늘 그렇듯이 먼저 필요한 컨텐츠를 가져옵니다.
지금 너는 이미 펄프를 수입했으니, 너는 너의 문제를 해결할 수 있다.
이제 펄프를 사용하여 이 시스템을 해결할 것입니다.
첫 번째 단계는 모델을 나타내기 위해 인스턴스 LpProblem 을 초기화하는 것입니다.
이 sense 매개변수를 사용하여 최소화 (LpMinimize 또는 1, 기본값) 할지 최대화 (LpMaximize 또는-1) 할지 선택할 수 있습니다. 이 선택은 너의 질문 결과에 영향을 줄 것이다.
모델이 있으면 결정 변수를 LpVariable 클래스의 인스턴스로 정의할 수 있습니다.
기본값은 음의 무한대이므로 하한을 제공해야 합니다. lowBound=0. UpBound 매개 변수는 상한을 정의하지만 기본적으로 양의 무한대로 설정되어 있으므로 여기서 생략할 수 있습니다.
선택적 매개변수 cat 는 결정 변수의 범주를 정의합니다. 연속 변수를 사용하는 경우 기본값인 연속을 사용할 수 있습니다.
변수 x 와 y 를 사용하여 선형 표현식과 구속조건을 나타내는 다른 펄프 객체를 작성할 수 있습니다.
하나의 결정 변수에 스칼라를 곱하거나 여러 결정 변수의 선형 조합을 만들 때 펄프의 예를 얻게 됩니다. LpAffineExpression 은 선형 표현식을 나타냅니다.
참고: pulp 클래스는 __add__ (), __sub__ () 및 _ _ mun 과 함께 아날로그 수 유형을 구현하는 특별한 파이썬 메서드를 구현하므로 변수나 표현식을 늘리거나 줄일 수 있으며 상수를 곱할 수 있습니다 이러한 메서드는+,-및 * 와 같은 연산자의 동작을 사용자 정의하는 데 사용됩니다.
마찬가지로 연산자 = =, = 를 사용하여 선형 표현식, 변수 및 스칼라를 결합하여 당기기의 인스턴스를 얻을 수 있습니다. 모형의 선형 구속조건을 나타내는 LpConstraint 입니다.
참고: 풍부한 비교 방법으로 구속을 구성할 수도 있습니다. _ __eq__ (), _ __le__ () 및 _ _ _ ge _ _ () 는 = =, = 연산자를 정의합니다
이를 염두에 두고 다음 단계는 제약 조건 및 대상 함수를 만들어 모델에 할당하는 것입니다. 목록이나 행렬을 만들 필요가 없습니다. 파이썬 표현식을 작성하고+= 연산자를 사용하여 모델에 연결하기만 하면 됩니다.
위 코드에서는 구속조건과 해당 이름이 포함된 튜플을 정의했습니다. LpProblem 을 사용하면 구속을 튜플로 지정하여 모델에 추가할 수 있습니다. 첫 번째 요소는 LpConstraint 인스턴스입니다. 두 번째 요소는 인간이 읽을 수 있는 구속조건 이름입니다.
목표 설정 함수는 매우 유사합니다.
또는 짧은 기호를 사용할 수 있습니다.
이제 대상 함수를 추가하고 모델을 정의했습니다.
참고:+= 해당 클래스 LpProblem 이 특별한 방법을 구현하므로 연산자를 사용하여 제약 조건이나 목표를 모델에 연결할 수 있습니다. __iadd__ (), 지정된 동작+=.
큰 문제의 경우 목록이나 다른 시퀀스에서 lpSum () 을 사용하는 것이+연산자를 반복하는 것보다 편리합니다. 예를 들어 다음 문을 사용하여 대상 함수를 모델에 추가할 수 있습니다.
이전 문과 동일한 결과를 생성합니다.
이제 모델의 전체 정의를 볼 수 있습니다.
모델의 문자열 표현에는 변수, 제약 조건, 대상 및 이름 등 모든 관련 데이터가 포함됩니다.
참고: 문자열 표현은 특수 방법을 정의하여 구성됩니다. __repr__ (). 에 대한 자세한 내용. __repr__ () Pythonic OOP 문자열 변환 참조: _ _ REPR _ vs _ _ STR _ _.
마지막으로, 당신은 문제를 해결할 준비가 되었습니다. 를 호출하여 다음을 수행할 수 있습니다. Solve () 모델 객체. 기본 해결자 (CBC) 를 사용하려는 경우 매개변수를 전달할 필요가 없습니다.
。 Solve () 는 기본 솔버를 호출하여 모델 객체를 수정하고 최적 솔루션이 발견되면 솔루션의 정수 상태 1 을 반환합니다. 나머지 상태 코드는 LpStatus[] 를 참조하십시오.
최적화 결과를 속성 모델로 사용할 수 있습니다. 함수 값 () 및 해당 메서드 Value () 는 속성의 실제 값을 반환합니다.
Model.objective 는 릴랙스 변수 값을 포함한 대상 함수 model.constraints 의 값을 저장하고 오브젝트 x 와 y 는 의사 결정 변수의 최적 값을 가집니다. Model.variables () 는 결정 변수의 목록을 반환합니다.
보시다시피 이 목록에는 생성자를 사용하여 만든 정확한 객체 LpVariable 이 포함되어 있습니다.
결과는 SciPy 를 사용하여 얻은 결과와 거의 같습니다.
참고: 이 방법에주의를 기울이십시오. Solve()- 객체의 상태, x 및 y 를 변경합니다!
어떤 해결자를 볼 수 있습니까? 다음 메서드를 호출하여 계획 솔루션을 사용합니다.
출력은 해결자가 CBC 임을 알려줍니다. 솔버를 지정하지 않았으므로 펄프를 기본 솔버라고 합니다.
다른 해석기를 실행하려는 경우 매개변수로 지정할 수 있습니다. 의 을 (를) 해석합니다. 예를 들어, GLPK 를 사용하고 싶고 이미 설치되어 있다면, 마지막 줄에서 solver=GLPK(msg=False) 로 사용할 수 있습니다. 또한 다음과 같이 가져와야 합니다.
이제 GLPK 를 가져왔으니 사용할 수 있습니다. 해석 ():
이 메시지 매개변수는 해결자의 정보를 표시하는 데 사용됩니다. Msg=False 이 정보 표시를 비활성화합니다. 정보를 포함하려면 msg 를 생략하거나 msg=True 를 설정하기만 하면 됩니다.
모형이 정의되고 해석되어 이전 상황과 동일한 방식으로 결과를 확인할 수 있습니다.
GLPK 를 사용하면 SciPy 및 CBC 를 사용하는 것과 거의 동일한 결과를 얻을 수 있습니다.
이번에는 어떤 계획 솔루션을 사용했는지 살펴보겠습니다.
위에서 강조 표시된 문에서 정의한 대로 모델입니다. Solve (Solver = GLPK (MSG = false)), 해결자는 GLPK 입니다.
펄프를 사용하여 혼합 정수 선형 계획 문제를 해결할 수도 있습니다. 정수 또는 이진 변수를 정의하려면 cat="Integer "또는 cat="Binary" 를 LpVariable 에 전달하기만 하면 됩니다. 다른 모든 것은 그대로 유지됩니다.
이 예에서는 정수 변수가 있으며 다른 결과를 얻습니다.
Nowx 는 모델에 지정된 정수입니다. 기술적으로 소수점 뒤에 0 이 있는 부동 소수점 값을 저장합니다. 이 사실은 전체 해결책을 바꾸었다. 이 도표를 보여드리죠.
보시다시피, 가장 좋은 해결책은 회색 배경의 맨 오른쪽 녹색 점입니다. 이것은 실행 가능한 솔루션 X 와 Y 의 최대값으로 최대 목표 함수 값을 제공합니다.
GLPK 도 이런 문제를 해결할 수 있다.
이제 펄프를 사용하여 위의 자원 할당 문제를 해결할 수 있습니다.
문제를 정의하고 해결하는 방법은 이전 예와 동일합니다.
이 경우 사전 x 를 사용하여 모든 결정 변수를 저장합니다. 사전은 결정 변수의 이름이나 인덱스를 키로 저장하고 해당 LpVariable 객체를 값으로 저장할 수 있기 때문에 이 방법은 매우 편리합니다. 목록이나 튜플의 LpVariable 인스턴스가 유용할 수 있습니다.
위의 코드는 다음과 같은 결과를 산출합니다.
보시는 바와 같이 이 솔루션은 SciPy 를 사용하여 얻은 솔루션과 일치합니다. 가장 수익성이 높은 방안은 매일 5.0 을 생산하는 첫 번째 제품인 45.0 의 세 번째 제품이다.
이 문제를 더 복잡하고 흥미롭게 만들어 봅시다. 공장이 기계 문제 때문에 첫 번째와 세 번째 제품을 동시에 생산할 수 없다고 가정해 봅시다. 이 경우 가장 수익성이 높은 솔루션은 무엇입니까?
이제 또 다른 논리적 제약이 있습니다: x 라면? 정, 그럼 X 는요? 0 이어야 하며, 그 반대의 경우도 마찬가지입니다. 이것은 이진 의사 결정 변수가 매우 유용한 곳입니다. 두 개의 이진 결정 변수 y 를 사용하시겠습니까? 당신은요? , 첫 번째 또는 세 번째 제품을 생성할지 여부를 나타냅니다.
강조 표시된 행을 제외하면 코드는 이전 예제와 매우 유사합니다. 다음과 같은 차이점이 있습니다.
이것이 해결책입니다.
가장 좋은 방법은 첫 번째 제품을 배제하고 세 번째 제품만 생산하는 것으로 밝혀졌다.
선형 프로그래밍과 혼합 정수 선형 프로그래밍을 배우는 데 도움이 되는 많은 리소스가 있는 것처럼 파이썬 래퍼가 있는 많은 솔버를 사용할 수 있습니다. 다음은 부분 목록입니다.
Gurobi 와 같은 일부 라이브러리에는 자체 파이썬 래퍼가 포함되어 있습니다. 기타 외부 포장기 사용. 예를 들어 PuLP 를 사용하여 CBC 및 GLPK 에 액세스할 수 있습니다.
이제 선형 프로그래밍이 무엇인지, 그리고 Python 을 사용하여 선형 프로그래밍 문제를 해결하는 방법을 알게 되었습니다. 또한 Python 선형 프로그래밍 라이브러리는 기본 해석기의 래퍼일 뿐이라는 것도 알고 있습니다. 해결자가 작업을 완료하면 래퍼는 솔루션 상태, 결정 변수 값, 릴랙스 변수, 대상 함수 등을 반환합니다.