Pyomo と 함께 최적화하는 방법: 모두 단계별로 가이드

기 optimization은 다양한 산업 및 disciples에서 사용하는 기반적인 도구로, 주어진 제한 안에서 가장 좋은 결정을 하는 것입니다. Supply chain에서 コスト를 最小化, 에너지 시스템에서 効率을 最大化하거나, 機械学習 モデル에서 最適な パラメータを見つける, 各种各样的 optimization techniques은 不可欠です。

Python은 其の簡潔さ와 万能性에 유용한 ライブ러리를 提唱しており、 optimization problems에 대한 強力な ライブ러리를 제공합니다. 这些 library를 중에 Pyomo가 다양하고 유연한 library로 표시되며, 사용자가 complex optimization models을 簡単하게 정의하고 해결할 수 있도록 해줍니다.

이 튜토리얼에서는 Pyomo를 기본적으로 다룰 것입니다. 我們는 솔루서를 설치하고 셋팅하는 것을 제외하고, 다양한 optimization problems을 수립하고 해결합니다.

Line Programming의 가능한 솔루션을 탐구하는 이미지. 作者供图.

Pyomo는 무엇인가요?

Pyomo는 Python을 사용하여 優化 모델을 構築하고 해결하기 위한 오픈 소스 라이브러리입니다. Python 프로그램 기사들에게 수학적으로 견고하면서 문법적으로 直観적이라는 의미로 優化 모델을 정의할 수 있습니다. 다양한 문제 유형을 지원합니다:

  1. 선형 プロ그래밍(LP): LP는 線形 objective function을(를) 線形 égalitative 및 불平等제한 조건에 의해 優化하는 것을 말합니다. 자원 分配, 예정, 재정 計画 문제에 사용되는 것이 일반적입니다.
  2. 非线性规划 (NLP): NLP는 非线性objective function을(를) 非线性constraints와 함께 최적화하는 것을 处理한다. linear이 아닌 관계를 가진 더 複雑한 system을 工程과 경제域에서 자주 사용한다.
  3. mixed-integer programming (MIP) : MIP는 일부 변수가 정수로 제한되고 나머지 변수가 연속적인 优化 문제를 나타내는 것이다. 이것은 Supply Chain 설계나 프로젝트 일정 등에서 사용되며, 결정이 离散적(예를 들어, 打开/关闭)이 될 수 있는 경우에 유용하다.
  4. Stochastic programming: Stochastic programming 는 일부 요소가 불확실하며 乱数変数로 모델링되는 최적화 문제를 扱います. 이를 통해 金融과 공급 관리 등에서 불확실한 环境下에서 결정을 최적화하는 것에 자주 应用され고 있습니다.
  5. 동적 최적화: 동적 최적화는 시간에 따라 의사 결정 변수를 최적화하는 데 중점을 두며, 일반적으로 동적으로 진화하는 시스템과 관련됩니다. 이는 프로세스 제어, 로봇 공학 및 경제학과 같은 분야에서 시간 의존적인 프로세스를 관리하는 데 사용됩니다.

Pyomo의 특징

이제 Pyomo를 더 잘 이해했으므로, 가장 중요한 몇 가지 기능을 살펴보겠습니다.

유연성 및 확장성

Pyomo의 유연성은 표준 Python 구조를 사용하여 복잡한 관계를 모델링할 수 있는 능력에서 옵니다. 다양한 오픈 소스 및 상용 솔버와 통합되어 많은 최적화 문제를 쉽게 해결할 수 있습니다.

Pythonic 구문

Pyomo 모델은 Python 위에 구축되고 표준 Python 구문을 사용하여 작성됩니다. 이는 Python에 익숙한 사람들에게 학습 곡선을 완만하게 만들고, 모델 내에서 Python의 방대한 라이브러리를 사용할 수 있게 합니다.

강력한 커뮤니티와 문서화

Pyomo는 강력한 사용자 커뮤니티포괄적인 문서화를 가지고 있으며, 여기에는 모든 수준의 사용자를 돕기 위한 예제와 튜토리얼이 포함되어 있습니다.

Pyomo의 사용 사례

Pyomo는 현실 세계에서 광범위한 응용 프로그램을 가지고 있습니다. 그중 일부는 다음과 같습니다:

1. 공급망 최적화

SC 최적화은 логистику 개선, 재고 수량 관리, 효율적인 생산 일정 만들기를 포함합니다.

이것은 운송 비용 최소화, 창고 위치 최적화, Supply and demand balancing 등이 포함됩니다.

예를 들어, 회사는 customer demand를 다양한 region 내에서 満足시키고, 운송 비용을 최소화하고, 각 distribution center의 stock level를 유지하는 과정에 대해 생각해야 합니다.

2. 재정 모델링

재정 모델링에서, 최적화는 capital과 같은 resource를 리턴을 最大化하고 风险을 最小化하는 과정을 도와줍니다.

이것은 投資자가 budget limit, regulatory requirements, risk tolerance 과 같은 제약条件下에서 asset combination을 선택하여 risk and reward를 balancings 하는 投资组合 최적화를 포함합니다.

재정 모델링은 재정 전략이 장기적 목표와 일치하면서 가능한 모든 риска를 attenuate하는 것을 보장합니다.

3. 에너지 시스템

에너지 시스템의 최적화는 전력 생성, 분布 및 사용 效率를 最大化하는 것을 专注于하며 있습니다.

이것은 에너지 ällor의 최적의 조합(예: renewable과 non-renewable)을 결정하는 것과 동시에 자재 成本를 最小化하고, 배출 제한을 만족하며, 변동적인 수요에 대응하는 것을 涉及할 수 있습니다.

이 종류의 최적화는 그리드 관리, 전기 발전소 操作 및 환경al impact 缩减에 중심적인 역할을 합니다.

4. 기계 leaning과 데이터 과학

최적화는 많은 기계 leaning 및 데이터 과학 任务에 центральный roll을 합니다. 예를 들어 하이퍼파라미터 조정과 feature selection입니다.

하이퍼Paramter 조정에서, 최적화 알고리즘은 예측 성능을 改善시키기 위한 가장 좋은 모델 구성을 찾는 도구입니다.

다른 중요한 작업으로, 특성 선택은 모델의 정확도에 기여하는 가장 중요한 특성들을 식별하는 과정을 거쳐, 복잡도를 줄이고 효율성을 改善시키ます.

contexts が 設定された 現在、Pyomo를 一些な 예제 모델링 문제에 적용해보는 것을 시작해봅시다!

Pyomo 설정

建模 전에, Pyomo를 설치하고 적절한 해석기를 선택하여 我们的 环境을 세팅해야 합니다.

1. 的先 요구사항

pyomo를 사용하기 전에, Python 3.6 또는 更高 version을 사용해야 합니다. Pyomo는 pip를 통해 설치할 수 있습니다.

pip install pyomo

이 튜토리얼은 Pyomo verson 6.8.0를 사용하여 만들어졌습니다.

import pyomo print(pyomo.__version__)

출력:

>>> 6.8.0

2. 적절한 solver를 선택하고 설치하기

Optimization에서 solver는 최적의 솔루션을 찾는 알고리즘으로 중요하며, 다양한 solver가 문제 유형(예: 直線적, 非直線적, 整数)에 따라 더 적절하게 사용되ます. Pyomo는 실제 computation을 수행하기 위해 外部的 solver에 依存하는 建模 도구입니다.

이에 대해 一些 일반적인 solver를 다시 살펴봐요.

오픈 소스 solver

1. GLPK (GNU Linear Programming Kit)

GLPK는 linear programming (LP)와 mixed-integer programming (MIP) 문제를 해결하는 인기 있는 도구이다.

기본적인 直線 優化 任务에서 뛰어난 선택이며, 学术界과 산업 응용에서 널리 사용되고 있다.

설치하기

brew install glpk
  • Linux: 
sudo apt-get install glpk-utils
2. CBC(Coin-or Branch and Cut)

CBC는 линейной 优化问题(LP)와 혼합 整数优化问题(MIP)에 대한 오픈 소스 솔루션입니다.

GLPK과 比较해서 일부 경우에 进阶级 기능과 좋은 성능을 제공하며, 错綜复杂한 优化 任务에서 强い 선택이 될 수 있습니다.

CBC은 conda 패키지 관리자를 통해 설치할 수 있습니다.

conda install -c conda-forge coincbc
3. IPOPT(Interior Point OPTimizer)

IPOPT은 대규모 非线性 Programming (NLP) 문제에 대한 강력한 해결기입니다.

특히, 複雑한 非线性 모델을 이해하는 데에 적용되는 것이 좋아, 이를 linear optimization 이하의 문제가 아닌 문제에서 뛰어나게 사용할 수 있습니다.

IPOPT은 conda 패키지 관리자를 통해 설치 할 수 있습니다.

!conda install -c conda-forge ipopt

commercials solvers

1. CPLEX

CPLEX는 linear programming (LP), mixed-integer programming (MIP), 및 quadratic programming (QP) 문제를 효율적으로 처리하는 최신 개최 해결기입니다.

IBM의 라이선스가 필요하지만, 学术 사용자에게는 무료로 제공되어 研究和 教育 목적에 적절한 선택입니다.

2. Gurobi

Gurobi는 LP, MIP, QP, 및 非線形プログラミング (NLP) 問題を解くための速さ와 効率性に優れた商業的なソルバー로 知られています.

CPLEX과 마찬가지로 라이선스를 필요로하며, 学术界のユーザー에게는 免费的なアクセス를 제공합니다. 따라서, advanced optimization の业界標準ツール입니다.

オープンソースと商業的なソルバー의 比較

GLPK과 CBC과 같은 오픈 소스 솔루션러는 대부분의 기본적인 최적화 과제에 충분히 胜任하며, 小型 프로젝트 및 교육적인 목적에 素晴らしい 선택이다.

그러나, CPLEX과 Gurobi와 같은 상업적 솔루션러는 특히 大型, 複雑한 문제에 대해 더 좋은 성능을 제공하며, 高级한 옵션을 갖추고 있다. 이러한 솔루션러는 quadratic 및 nonlinear 프로그래밍 지원을 향상시키고 대형 산업적 응용에 최적화되었다.

오픈 소스 솔루션러는 대부분의 日报적 최적화 과제를 처리할 수 있지만, 복잡하고 高性能 요구에 대해서는 상업적 솔루션러가 더 나은 선택이 될 수 있다.

상업적 솔루션러는 라이선스가 필요하며, 학계 사용자에게는 무료로 사용할 수 있다는 것을 기억하자.

现在,让我们看看如何在Pyomo中配置一个求解器。在这个例子中,我将使用GLPK。

3. 在Pyomo中配置求解器

首先,确保在安装后求解器的可执行文件在您的系统PATH中。

然后,创建一个Python脚本并添加以下内容:

from pyomo.environ import SolverFactory solver = SolverFactory('glpk')

为了确认Pyomo和您的求解器都正确安装,让我们解决一个简单的测试问题。

测试问题:简单的线性规划问题

목적: Z=x+y를 최소화하기 제

제약 조건:

  • x + 2y ≥ 4
  • x – y ≤ 1
  • x ≥ 0
  • y ≥ 0 는 다음과 같이 한국어로 번역되ます:

    `y ≥ 0`

이 문제는 Z 变量的 두 つ の 합이xyxy가 特定の 条件을 만족해야 가장 작은 가능한 값을 찾는 문제이다.

제일 먼저, xy의 두 배 더하는 결과는 至少 4이 되어야 합니다.두 번째, x에서 y를 빼는 것은 1 이하로 되어야 합니다.마지막으로, xy는 모두 零 또는 正值(음수가 아닙니다)이어야 합니다.

목표는 xy의 값을 찾는 것입니다.Z의 값을 가능한 작게 만들면서 이 조건을 만족시키는 것입니다.

Pyomo를 사용하여 구현하는 것입니다.

import pyomo.environ as pyo # 모델 생성 model = pyo.ConcreteModel() # 변수 정의 model.x = pyo.Var(within=pyo.NonNegativeReals) model.y = pyo.Var(within=pyo.NonNegativeReals) # 목적関数 정의 model.obj = pyo.Objective(expr=model.x + model.y, sense=pyo.minimize) # 제한 조건 정의 model.con1 = pyo.Constraint(expr=model.x + 2 * model.y >= 4) model.con2 = pyo.Constraint(expr=model.x - model.y <= 1) # 해결 기법 선택 solver = pyo.SolverFactory('glpk') # 문제 해결 result = solver.solve(model) # 결과 보기 print('Status:', result.solver.status) print('Termination Condition:', result.solver.termination_condition) print('Optimal x:', pyo.value(model.x)) print('Optimal y:', pyo.value(model.y)) print('Optimal Objective:', pyo.value(model.obj))

모두 정상적으로 동작하면, 기대되는 출력이 다음과 같습니다:

Status: ok Termination Condition: optimal Optimal x: 0.0 Optimal y: 2.0 Optimal Objective: 2.0

위의 코드를 함께 보겠습니다. 먼저, 두 변수 xy를 정의하는 것이 있습니다. 이들은 음수가 아닌 값만 取일 수 있습니다. 모델의 목적은 xy의 합 (x + y)을 최소화하는 것입니다. 이 코드는 해석자를 glpk로 정의하여 xy의 가장 좋은 값을 찾습니다. 이들은 이러한 제약 조건을 만족하면서 목적을 최소화하는 것입니다.

代码를 실행하면, 変数들의 Optimal Value가 x = 0.0y = 2.0로, 목적 函數 Z = x + y를 최소화하는 것을 알 수 있습니다. 따라서, 목적 函數의 최소 값은 2.0이며, 주어진 제한 조건을 만족합니다.

Pyomo를 사용한 모델링 기초

Pyomo를 사용하여 優化 모델의 기본 组成部分을 정의하는 방법을 이해하는 것은 優化 문제를 효율적으로 세팅하고 해결하기 위해 필요합니다.

1. 변수 정의

변수는 優化 문제에서 결정해야 하는 사항을 대표합니다. Pyomo에서는 solver가 목적 函數을 최적화하고 모델의 모든 제약 조건을 만족하면서 조정할 수 있는 량을 의미합니다.

Scalar variable

Scalar variable는 어느 집합에 대해 인덱싱되지 않는 단일 변수입니다. Pyomo에서는 Var 클래스를 사용하여 pyomo.environ 모듈から 변수를 정의합니다.

from pyomo.environ import Var model.x = Var()

우선 Var를 導入하고 Var()를 사용하여 x라는 변수를 생성합니다. 이 변수는 지정된 한계가 없으며, 모델에서 다른 제약 조건에 의해 제한되지 않는 한 어떤 실수 값을 取り得을 수 있습니다.

한계 추가

변수가 取る 가능한 값을 제한할 수 있습니다. 제한은 (lower_bound, upper_bound) 튜플的形式으로 정의합니다.:

from pyomo.environ import Var model.x = Var(bounds=(0, None))

도메인 지정

Pyomo는 사용할 수 있는 변수의 값의 형식을 지정하기 위해 미리 정의된 도메인을 제공합니다. 예를 들어 NonNegativeReals, Integers, 또는 Binary 과 같습니다.:

from pyomo.environ import Var, NonNegativeReals model.x = Var(domain=NonNegativeReals)

인덱스 변수

여러 변수가 같은 자性을 가지고 있을 때, 예를 들어 여러 시기 또는 아이템을 表현하는 변수를 다루는 것과 같은 경우, 인덱스 변수를 사용하여 효율적입니다. 인덱스 변수는 집합에 대한 변수입니다.

import pyomo.environ as pyo model.I = pyo.Set(initialize=[1, 2, 3]) model.y = pyo.Var(model.I, domain=pyo.NonNegativeReals)

比如说 세 种의 제품의 생산 량을 모델링하고자 한다면, 다음과 같이 정의할 수 있습니다.:

model.Products = pyo.Set(initialize=['A', 'B', 'C']) model.production = pyo.Var(model.Products, domain=pyo.NonNegativeReals)

现在,`model.production[‘A’]`、`model.production[‘B’]` 和 `model.production[‘C’]` 分别代表产品 A、B 和 C 的生产量。

2. 목표 정의

목표 函數은 우리가 최적화하려고 하는 것( minimize 또는 maximize )이며, 모델의 목적을 정의하는 것으로, 예를 들어 이익을 최대화하거나 비용을 최소化하는 것과 같은 목적을 가지고 있으며, 결정 변수를 포함하는 수학적 equations로 표현됩니다.

이를 Objective 类로 정의하는 것입니다:

from pyomo.environ import ConcreteModel, Var, Objective, minimize, maximize, NonNegativeReals # 모델 생성 model = ConcreteModel() # 변수 정의 model.x = Var(within=NonNegativeReals) model.y = Var(within=NonNegativeReals) # 최적화 ( 비용 ) model.cost = Objective(expr=2 * model.x + 3 * model.y, sense=minimize) # 이익 최대화 - ( 한 번에 하나의 목표만 있을 수 있음 ) # model.profit = Objective(expr=5 * model.x + 4 * model.y, sense=maximize)

3. 제약 조건 추가

제한은 문제의 제한 또는 요구사항을 정의합니다.

from pyomo.environ import Constraint model.con1 = Constraint(expr=model.x + model.y >= 10)

上方의 예제는 Constraint 클래스를 사용하여 Pyomo 모델에 제한을 정의합니다. 제한 model.con1는 변수 xy의 합이 10 이상이어야 한다는 것을 指定了합니다.

4. 모델 매개 변수 사용

매개 변수는 Optimization process에서 변하지 않는 알 수 있는 값 또는 상수를 나타내는 모델에서 사용되는 고정 값입니다.

그들은 변수와 제한 사항 사이의 관계를 정의하고, 실제 세계 데이터 또는 가정을 통해 모델에 구조를 제공합니다:

from pyomo.environ import Param model.p = Param(initialize=5)

위의 코드는 Pyomo 모델에서 Param クラ스를 사용하여 매개 변수 p를 정의하고 고정 값으로 5를 초기화하고 있습니다. 이제 p 매개 변수는 Optimization process 동안 변하지 않는 상수 값을 나타내는 모델에서 사용할 수 있습니다.

이제, 끝까지의 최적화 문제를 工作和하 let’s!

Pyomo 끝까지의 예시

Pyomo를 사용하여 최적화 문제를 解决하는 끝까지의 예시를 보겠습니다. 우리는 공장이 두 种類의 제품을 생산하는 실제 세계 상황을 모델링할 것입니다. 目标是 기계 시간 제한을 고려하여 이익을 최대화하다.

1. 문제 statement

공장은 P1P2 두 种類의 제품을 생산합니다. 단위 이익은 다음과 같습니다:

  • P1: $40
  • P2: 5000

기계 시간

  • 기계 A: 100 시간
  • 기계 B: 80 시간
  • 기계 C: 90시간

每个单位所需时间:

제품

기계 A (시간)

기계 B (시간)

기계 C (시간)

P1

1

2

0

P2

2

1

3

목표: 利益最大化。

결정 변수:

  • x₁: P1 제품의 생산 ユニット 수。
  • x₂: P2 생산 単位

2. 수학적 이 formulated

목적 函數:

Z = 40x₁ + 50x₂를 최대화하자

제한 조건:

  1. 기계 A 용량:1x₁ + 2x₂ ≤ 100
  2. 기계 B의 용량: 2x₁ + 1x₂ ≤ 80
  3. 기械 C의 용량: 3x₂ ≤ 90
  4. 부호 부여: x₁, x₂ ≥ 0

3. 实现

이 문제의 목적과 제한 조건을 기반으로, 다시 GLPK를 사용하여 모델을 구성하는 Python 코드가 있습니다.

# 단계 1: 라이브러리 導入 import pyomo.environ as pyo # 단계 2: 구체적 모델 생성 model = pyo.ConcreteModel() # 단계 3: 결정 変수 정의 (생산 할 P1과 P2의 ユニット) model.x1 = pyo.Var(within=pyo.NonNegativeReals) model.x2 = pyo.Var(within=pyo.NonNegativeReals) # 단계 4: objective function 정의 (이익最大化) model.profit = pyo.Objective(expr=40 * model.x1 + 50 * model.x2, sense=pyo.maximize) # 단계 5: 제한 조건 정의 # 기계 A 수준 제한: 1x1 + 2x2 <= 100 model.machine_a = pyo.Constraint(expr=1 * model.x1 + 2 * model.x2 <= 100) # 기계 B 수준 제한: 2x1 + 1x2 <= 80 model.machine_b = pyo.Constraint(expr=2 * model.x1 + 1 * model.x2 <= 80) # 기械 C 수준 제한: 3x2 <= 90 model.machine_c = pyo.Constraint(expr=3 * model.x2 <= 90) # 단계 6: GLPK solver를 사용하여 모델 해결 solver = pyo.SolverFactory('glpk') result = solver.solve(model) # 단계 7: 결과를 분석 # Solver 상태와 종료 조건을 표시 print('Solver Status:', result.solver.status) print('Termination Condition:', result.solver.termination_condition) # x1, x2, 그리고 가장 큰 이익의 최적 값을 얻고 표시 x1_opt = pyo.value(model.x1) x2_opt = pyo.value(model.x2) profit_opt = pyo.value(model.profit) print(f'Optimal production of P1 (x1): {x1_opt}') print(f'Optimal production of P2 (x2): {x2_opt}') print(f'Maximum Profit: ${profit_opt}')

출력:

>>> Solver Status: ok >>> Termination Condition: optimal >>> Optimal production of P1 (x1): 25.0 >>> Optimal production of P2 (x2): 30.0 >>> Maximum Profit: $2500.0

위의 코드에서, 두 种의 제품(P1P2)의 생산에서 수익을 最大化する 線形 优化 모델을 정의합니다. 목적 函數은 수익을 最大化하는 것으로 설정되었으며, P1 각 unite가 $40을 기여하고, P2 각 单位が $50을 기여합니다.

私たち는 三部の 機械(A, BC)에 대한 기계 시간 제한을 나타내는 세 가지 제한 조건을 가지고 있습니다.

결국, GLPK 솔루션 도구를 사용하여 이 문제를 해결합니다.

결과적으로, 25 单位의 P1와 30 单位의 P2를 생산하여 $2,500이 될 수 있는 최대 수익을 얻을 수 있습니다..

기능 개발

이전 섹션에서는 Pyomo를 사용하여 엔드투엔드 최적화 문제를 구현하는 것이 얼마나 쉽다고 보았습니다. 그러나 대부분의 실제 문제는 간단하게 解决了되는 것이 아닙니다.

이 섹션에서는 더 複雑한 상황을 resolved하기 위해 사용할 수 있는 고급 기능을 소개합니다.

1. 非线性 优化

非线性 优化은 非线性 목적関数을 MINIMIZE 또는 MAXIMIZE 하며, non线性 제한条件을 満たす 것입니다. 이를 시험하기 위해 우리는 円形 제한条件下에서 제한된 것을 구하여 평균 제곱 차이를 MINIMIZE 하는 예를 보겠습니다.

문제 陳述

목적을 minimized하라: Z = (x – 1)² + (y – 2)²

제한 조건:

  • x² + y² ≤ 4
  • x, y ≥ 0

Pyomo에서는 결정 변수xy0의 범위로 정의하여 부호 부여 지키는 것이 가능합니다. 목적 函수는 특정 지점과의 제곱 차의 합으로 쓰이며, 제한 조건은 솔루션이 지름2.의 원 내에 있도록 보장합니다.

이 경우, IPOPT 솔루터는 비선형 Optimization 문제 해결 능력에 相当的합니다.

import pyomo.environ as pyo model = pyo.ConcreteModel() # 변수를 하한값과 함께 정의 model.x = pyo.Var(bounds=(0, None)) model.y = pyo.Var(bounds=(0, None)) # objective function: (x - 1)² + (y - 2)² 를 최소化 model.obj = pyo.Objective(expr=(model.x - 1)**2 + (model.y - 2)**2, sense=pyo.minimize) # 제한 조건: x² + y² ≤ 4 (반지름이 2인 원) model.circle = pyo.Constraint(expr=model.x**2 + model.y**2 <= 4) solver = pyo.SolverFactory('ipopt') result = solver.solve(model) print('Optimal x:', pyo.value(model.x)) print('Optimal y:', pyo.value(model.y)) print('Minimum Z:', pyo.value(model.obj))

2. 결정 변수가 일부가 정수(通常是 이진 수)而另一部分은 連続적인 경우에 사용되는 ixed-integer programming (MIP)

Mixed-integer programming은 Some decision variables are integers (often binary) while others are continuous 이렇게 구성되며, 공장 위치와 생산 계획과 같은 결정 문제에 가치가 있습니다.

문제 陈述

회사는 창고를 A, B, C 지역에 개설할지 결정해야 합니다. 목표는 창고 개업 고정 비용과 운송 비용을 포함한 전체 コスト를 최소화하는 것입니다.

우리는 창고 개업 고정 비용, 운송 비용, 용량 제한, 전체 수요를 포함하는 데이터를 초기화하기 시작합니다.

locations = ['A', 'B', 'C'] FixedCost = {'A': 1000, 'B': 1200, 'C': 1500} TransportCost = {'A': 5, 'B': 4, 'C': 6} Capacity = {'A': 100, 'B': 80, 'C': 90} Demand = 150 model = pyo.ConcreteModel() # 이진 변수: 창고가 개설되면 1, 아니면 0 model.y = pyo.Var(locations, domain=pyo.Binary) # 연속 변수: gods를 운송하는 量 model.x = pyo.Var(locations, domain=pyo.NonNegativeReals) model.cost = pyo.Objective( expr=sum(FixedCost[i] * model.y[i] + TransportCost[i] * model.x[i] for i in locations), sense=pyo.minimize ) # 수요 제한 model.demand = pyo.Constraint(expr=sum(model.x[i] for i in locations) >= Demand) # 용량 제한 def capacity_rule(model, i): return model.x[i] <= Capacity[i] * model.y[i] model.capacity = pyo.Constraint(locations, rule=capacity_rule) solver = pyo.SolverFactory('cbc') result = solver.solve(model) for i in locations: print(f"Warehouse {i}: Open={pyo.value(model.y[i])}, Transported={pyo.value(model.x[i])}") print('Minimum Total Cost:', pyo.value(model.cost))

모델에는 두 种의 결정 변수가 포함되어 있습니다: 창고가 개설되는 지 represent하는 이진 변수 y, 그리고 각 창고에서 goods를 운송하는 量를 represent하는 연속 변수 x입니다.

목적 函數는 각 창고의 고정 コスト와 이동 コスト를 합하여 전체를 최소화하며, 제약 조건은 전체 수량이 수요를 만족하며, 개방되면 각 창고의 수량 제한을 초과하지 않는다.

3. 다양한 목적을 处理하는 方法

때때로, 优化 문제들은 충돌하여 最大化하는 이익과 環境 影響을 最小化하는 것과 같은 다양한 목적을 포함하는 것이 있습니다.가중치 합 方法는 각 목적에 대하여 가중치를 부여하여 중요성을 平衡시키는 일반적인 方法입니다.

문제 陳述

NPK 산소 O2 공급 수치

  • O2 공급 수치:Z₁ = 3x + 5y
  • 环境影响:Z₂ = 2x + y

이러한 목표를 가중치 w1=0.6, w2=0.4를 사용하여 결합할 수 있으며, 총 목표는 가중치 합이 되는 것입니다.

w1 = 0.6 w2 = 0.4 model.obj = pyo.Objective( expr=w1 * (3 * model.x + 5 * model.y) - w2 * (2 * model.x + model.y), sense=pyo.maximize )

이 결합된 목표에서, 가중치를 조절하여 이익을 最大化하면서 环境影响을 最小化할 수 있습니다.

4. 외부 자료 소스 사용

대량의 자료셋을 처리할 때, CSV 파일과 같은 외부 자료 소스로부터 자료를 mporting하는 것이 자주 유용하다. Pyomo는 Pandas와 함께 자료 읽기와 사용에 좋다.

Pandas를 사용하여 CSV 파일을 읽고, 모델에서 셋과 パラ미터를 초기화하는 데 자료를 사용할 수 있다:

import pandas as pd data = pd.read_csv('parameters.csv') # CSV 자료로 셋을 정의하기 model.I = pyo.Set(initialize=data['index'].unique()) # CSV 자료로 초기화된 パラ미터를 정의하기 param_dict = data.set_index('index')['value'].to_dict() model.param = pyo.Param(model.I, initialize=param_dict)

Pyomo 사용 팁과 ベスト 惯例

Pyomo를 사용할 때, 모델을 効率적으로, 잘 기록되었으며 문제 해결에 용이하게 만들기는 중요하다.

1. 디버깅과 문제 해결

Pyomo를 사용하여 Optimization 모델을 구성할 때, 무 sensble한 솔루션, 해결자 실패, 또는 incorrect 결과와 같은 이슈를 겪는 것이 commune다. 다음은 디버깅에 대한 一些 Best Practices이다:

  • 제한 조건 확인:모델이 실제 solutioin을 생성하지 못하면, 제한 조건을 revie를 해봐. too constaints can make a problem infeasible. Pyomo의 .display() method을 사용하여 variabls and constraints의 값을 인쇄하여 기대되는 행동이 있는지 확인하십시오.
  • Solver 출력: solver logs를 자세하게 사용하기 위해 tee=True를 전달하면 solve() method을 호출합니다. 이것은 solver가 어디에 고생하는지 알 수 있는 정보를 제공하는데, 예를 들어 无线变量나 지능ibility를 읽을 수 있습니다.
  • 간단한 모델을 먼저 시험하십시오: 複雑한 모델을 处理할 때, 简略化된 버전을 시험해보십시오. 이것은 모델이 完全히 지정되어 있지 않은 것 같은 오버하드를 받지 않고 가능한 모든 ancillary 문제를 분리하는 것을 도울 수 있습니다.

문제 해결은 systematic 하게 접근하고, 제약条件, 목적 函數, 및 solver 의 반응을 분석하는 것이 어려울 수 있습니다.

2. 모델링 효율

Optimization 문제는 모델의 크기가 커지면 computation-wise 비용이 많이 들 수 있습니다. 효율적인 모델링을 보장하기 위해서는 다음과 같은 팁을 고려해야 합니다:

  • 스PARITY(얇은 学生们) 사용하기: 제약 조건 또는 목적 정의 시 필요없는 인덱스에 대한 루프를 避免하자. 문제에 대한 스파arsity를 利用하면 계산 시간을 줄이는 것이다.
  • 이진 변수와 지속的 변수: 가능하다면 이진 변수 또는 정수 변수의 수를 줄이자. 지속的 변수는 해결 기계가 더 쉽게 처리하는 것이므로 swifter 솔루션을 얻을 수 있다.
  • 제약 조건 수립: 수학적 형태와 실제 구현에서 제약 조건을 가능한 간단하게 유지하자. unnecessray nonlinearities를 避免하고 복잡한 제약 조건을 작은, 관리 가능한 조건으로 분해하자.

효율적인 모델은 빠르게 해결하고, 디버깅하고, 유지 관리하기 쉽습니다.

3. 文档化和维护

Pyomo 모델을 잘 문서화 하는 것은 장기적인 사용과 협력에 좋은 惯例입니다. 좋은 문서화는 시간 동안 다시 돌아가서 모델을 갱신하기를 더 легко 만들습니다:

  • 내장 코멘트 사용하기:변수, 제한 조건, 목적 関数의 목적을 설명하기 위해 항상 코멘트를 추가합니다. 이는 優化 모델에서 로직이 立ち上がり 빨라지지 않을 때 특히 중요합니다.
  • 코드를 모듈화하세요:您的模型을 논리적 구역으로 분할하거나 독립적인 함수로 분리하십시오. 이러한 모듈적 접근法은 읽기 수준을 향상시키며, 모델의 특정 부분을 디버깅하고 수정하는 것을 더 쉽게 만들 수 있습니다.
  • 모델 변경을 추적하세요: 특히 이 evolutionary model이라면 バージョン 이력을 관리하십시오. Git과 같은 버전 관리 도구를 사용하여 변경사항을 추적하고 업데이트 또는 개선사항이 어디에서 시작되었는지 이를 확인할 수 있습니다.

적절한 文档化과 구조화된 코드는 futuristic 공동 작업자에게 Pyomo 모델을 더욱 접근하기 쉽게 만들며, 요구사항이 어떻게 발전하는지 시도하는 것이 더욱 eastAbstracted scaling or modification.

결론

Pyomo는 펙thon에서 최적화 모델을 建立하고 해결하는 강력하고 靈活한 도구입니다. 이 튜토리얼 내에서는 Pyomo가 사용자들이 선형 プ로그래밍에서 非线性 및 이ixed-integer 프로그래밍까지의 다양한 최적화 문제를 建模할 수 있음을 탐구했습니다.

사용자 friedly 문법과 solvers와의 integration로 Pyomo는 실世界的 최적화 문제를 建模하고 해결하는 것을 初心자와 고阶级 사용자가 모두 접근 가능하게 만들었습니다.

Python에서 실世界的 문제를 해결하는 것에 관한 기본 명령어에 대해 DataCamp에서 무료 과정을 보시기 바랍니다!

Source:
https://www.datacamp.com/tutorial/pyomo