Optimizing with Pyomo: A Complete Step-by-Step Guide

Оптимизация является основным инструментом, используемым во многих отраслях и дисциплинах для принятия наилучших возможных решений в условиях ограничений. Независимо от того, это минимизация затрат в цепочке поставок, максимизация эффективности в энергетических системах или нахождение оптимальных параметров в моделях машинного обучения, техники оптимизации являются незаменимыми.

Python, известный своей простотой и гибкостью, предлагает мощные библиотеки для решения оптимизационных проблем.entre этих, Pyomo выделяется как комплексная и гибкая библиотека, которая позволяет пользователям без проблем определять и решать сложные модели оптимизации.

В этом руководстве мы будем исследовать Pyomo с нуля. Мы покроем все, от установки и настройки solvers до формулирования и решения различных оптимизационных проблем!

Исследование возможных решений в линейной программе. Иллюстрация автором.

Что такое Pyomo?

Pyomo — открытая библиотека для построения и решения оптимизационных моделей с использованием Python. Она позволяет определять оптимизационные модели с учетом математической строгости и синтаксической intuитивности для программистов Python. Она поддерживает широкий спектр типов проблем, включая:

  1. линейное программирование (LP): LP заключается в оптимизации линейной целевой функции под условием линейных равенственных и неравенственных ограничений. Оно широко используется для распределения ресурсов, планирования и финансового планирования.
  2. Нелинейное программирование (НЛП): НЛП занимается оптимизацией нелинейной целевой функции с нелинейными ограничениями. Он обычно используется в инженерии и экономике для более сложных систем, где взаимоотношения не линейны.
  3. Смешанное整数程计 (MIP): MIP включает задачи оптимизации, на которых некоторые переменные ограничены, чтобы быть целыми числами, в то время как другие могут быть непрерывными. Это полезно в сценариях, таких как проектирование цепочки поставок или планирование проектов, где решения могут быть дискретными (например, вкл/выкл).
  4. Стохастическое программирование: Стохастическое программирование рассматривает задачи оптимизации, где некоторые элементы не уверенны и моделируются как случайные переменные. Оно широко применяется в финансах и управлении сетями поставки для оптимизации решений при неопределенности.
  5. Динамическое оптимирование: Динамическое оптимирование соощущает оптимизацию переменных решения в течение времени, обычно включая динамически развивающиеся системы. Оно используется в областях, таких как управление процессами, робототехника и экономика, для управления времязависимыми процессами.

Свойства Pyomo

Теперь, когда мы лучше понимаем Pyomo, давайте посмотрим на некоторые из его最重要的 функций. 

Произвольность и расширяемость

Платформа Pyomo является гибкой благодаря своей способности моделировать сложные связи с использованием стандартных конструкций Python. Она интегрируется с различными открытыми и коммерческими решателями, что позволяет легко решать многие оптимизационные задачи.

Синтаксис Pythonic

Модели Pyomo основаны на Python и написаны с использованием стандартного синтаксиса Python. Это делает learning curve мягкой для тех, кто знаком с Python, и позволяет использовать обширные библиотеки Python в ваших моделях.

强力社区和文档

Pyomo拥有坚韧的用户社区详尽的文档,其中包括示例和教程,以帮助所有级别的用户。

Pyomo的使用案例

Pyomo在现实世界中有着广泛的应用。以下是一些例子:

1. Оптимизация цепь поставок

Оптимизация логистики включает улучшение управления транспортными потоками, управление уровнями запасов, и создание эффективных графиков производства. 

Это может включать минимизацию транспортных расходов, оптимизацию местоположения складов или уравновешивание спроса и предложения.

К примеру, компания может надоесть надолго потребности клиентов в нескольких регионах, уменьшая расходы на доставку и поддерживая уровни запасов на каждом центре распределения.

2. Финансовая модельность

В финансовой модельности оптимизация помогает направлять ресурсы, такие как капитал, на максимизацию доходов при минимизации риска.

Это может включать оптимизацию портфеля, когда инвесторы выравнивают риск и вознаграждение, выбрав комбинацию активов, подчиняющихся ограничениям, таким как бюджетные ограничения, регламентные требования или терпимость к риску.

Financial modeling ensures that financial strategies align with long-term goals while mitigating potential risks.

3. Энергетические системы

Оптимизация в энергетических системах focus on maximizing power generation, distribution, and consumption efficiency.

This may involve determining the optimal mix of energy sources (e.g., renewable vs. non-renewable) while minimizing fuel costs, meeting emission limits, and adapting to fluctuating demand.

This type of optimization plays a central role in grid management, power plant operations, and reducing environmental impacts.

4. Machine learning and data science

Optimization is central to many machine learning and data science tasks, such as hyperparameter tuning and feature selection.

В настройке гиперпараметров алгоритмы оптимизации помогают найти лучшую конфигурацию модели для улучшения предсказательной производительности.

Выбор признаков, еще одна критически важная задача, заключается в выявлении наиболее важных признаков, которые способствуют точности модели, что помогает снизить сложность и повысить эффективность.

Теперь, когда контекст установлен, давайте приступим к практическим занятиям и начнем применять Pyomo к некоторым примерам моделирования!

Настройка Pyomo

Прежде чем погрузиться в моделирование, нам нужно подготовить нашу среду, установив Pyomo и выбрав соответствующий решатель.

1. Предварительные требования

Чтобы использовать pyomo, у вас должна быть установлена версия Python 3.6 или выше. Pyomo можно установить через pip.

pip install pyomo

Руководство было создано с использованием pyomo версии 6.8.0.

import pyomo print(pyomo.__version__)

Вывод:

>>> 6.8.0

2. Выбор и установка правильного решателя

В оптимизации решатели играют существенную роль, так как они являются алгоритмами, которые находят оптимальное решение заданного вами проблемы.不同的 решатели лучше подходят в зависимости от типа проблемы (например, линейной, нелинейной,整数). Pyomo — это инструмент моделирования, который использует внешние решатели для выполнения реальных вычислений.

Давайте посмотрим на некоторые из самых распространенных решателей.

Открытые исходные решатели

1. GLPK (GNU Linear Programming Kit)

GLPK – популярный инструмент для решения линейных (LP) и смешанно-целочисленных (MIP) проблем. 

Он является отличным выбором для базовых задач линейной оптимизации и широко используется в академических и промышленных приложениях.

Установка

brew install glpk
  • Linux: 
sudo apt-get install glpk-utils
2. CBC (коин-ор Брианч и Кут)

CBC является открытым исходным решателем для линейных программ (LP) и смешанных整数ных программ (MIP).

Он предлагает усовершенствованные функции и лучший результат в некоторых случаях, чем GLPK, что делает его сильным вариантом для более сложных оптимизационных задач.

CBC может быть установлен с помощью менеджера пакетов conda.

conda install -c conda-forge coincbc
3. IPOPT (Внутренний точки ОПТимизатора)

IPOPT — мощный раз解器, предназначенный для решения больших систем нелинейных уравнений (НЛУ)

. Он особенно хорошо подходит для обработки сложных нелинейных моделей, что делает его отличным выбором для решения задач, выходящих за рамки линейной оптимизации.

IPOPT может быть установлен с помощью пакета менеджера conda.

!conda install -c conda-forge ipopt

Коммерческие решатели

1. CPLEX

CPLEX является современным решателем оптимизационных задач, который эффективно решает задачи линейной программировки (LP), смешанных整数 программирования (MIP) и квадратической программирования (QP).

Он требует лицензии от IBM, но доступен бесплатно для образовательного использования, что делает его отличным выбором для исследований и didactic purposes.

2. Gurobi

Gurobi является ведущим коммерческим решателем, известным своей скоростью и эффективностью в решении задач LP, MIP, QP и нелинейной программирования (NLP).

В том же vein, как CPLEX, он требует лицензии, но предлагает бесплатный доступ для академических пользователей. Таким образом, это стандартное средство промышленной оптимизации.

Открытые vs. коммерческие решатели

Открытые исходные решатели, такие как GLPK и CBC, являются свободными и достаточными для решения большинства базовых задач оптимизации. Эти решатели отлично подходят для небольших проектов и учебных целей.

Однако коммерческие решатели, такие как CPLEX и Gurobi, обычно предлагают лучшие performаnce, особенно для более крупных и сложных проблем. Эти решатели имеют усовершенствованные функции, включая улучшенную поддержку квадратических и нелинейных программ, и оптимизированы для крупномасштабных промышленных приложений.

Несмотря на то, что открытые решатели могут обрабатывать многие повседневные задачи оптимизации, коммерческие решатели часто являются лучшим выбором, когда работают с более сложными, высококачественными требованиями.

Принимайте во внимание, что коммерческие решатели требуют лицензии, хотя они доступны бесплатно для академических пользователей.

Теперь let’s see как настроить solver в Pyomo. Я буду использовать GLPK в этом случае.

3. Настройка solver в Pyomo

Первым образом, убедитесь, что исполняемая программа solver находится в вашем системном PATH после установки.

Потом, создайте Python скрипт и добавьте следующее:

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

Чтобы подтвердить, что both Pyomo и ваш solver были установлены правильно, попробуем решить простую тестовую задачу.

Test problem: простая линейная программа

цель: минимизировать Z=x+y

с условиями:

  • x + 2y ≥ 4
  • x – y ≤ 1
  • x ≥ 0
  • y ≥ 0

Эта проблема касается нахождения наименьшего возможного значения Z, который является суммой двух переменных x и y. Тем не менее, x и y должны соответствовать определенным условиям.

Первое, когда вы добавляете x и дважды y, результат должен быть по крайней мере 4. Второе, x минус y должен быть меньше или равен 1. Наконец, и x и y должны быть нулями или положительными числами (они не могут быть отрицательными). 

целью является найти значения x и y, удовлетворяющие этим условиям, при этом максимально 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

Пройдемся по вышеназванному коду: Во-первых, определены две переменные, x и y, которые могут принимать только неотрицательные значения. Цель модели – минимизировать сумму x и y (x + y). В коде определен решатель как glpk, который найдет оптимальные значения x и y, удовлетворяющие этим ограничениям и минимизирующие целевую функцию.

После выполнения кода, мы обнаруживаем, что оптимальные значения переменных x = 0.0 и y = 2.0 минимизируют целевую функцию Z = x + y. Таким образом, минимальное значение целевой функции 2.0, которое удовлетворяет данным ограничениям.

Основы моделирования с Pyomo

Понимание того, как определять базовые компоненты оптимизационной модели в Pyomo, является необходимым для эффективной настройки и решения оптимизационных проблем.

1. Определение переменных

Переменные представляют собой решения, которые необходимо принять в оптимизационной проблеме. В Pyomo переменные являются величинами, которые solver будет корректировать для оптимизации объективной функции, удовлетворяя всем ограничениям.

Скалярные переменные

Скалярная переменная является单个 переменной, которая не идексiert над какой-либо множеством. Чтобы определить скалярную переменную в Pyomo, вы используете класс Var из модуля pyomo.environ.

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

Мы сначала импортируем Var и создаем переменную x с использованием Var(). Эта переменная не имеет заданных границ,意味着она может принять любое реальное значение,除非 она иначе ограничена в модели.

Добавление границ

Вы можете ограничить значения, которые может принимать переменная, указав границы. Границы определяются как кортеж (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. Определение целей

Функция цели — это то, что мы пытаемся оптимизировать (уменьшать или увеличивать). Она определяет цель модели, такую как минимизация затрат или максимизация прибыли, и обычно выражается в виде математического уравнения, в котором участвуют décision variables.

Их определяют с помощью класса 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)

Приведенный выше пример определяет ограничение в модели Pyomo с использованием класса Constraint. Ограничение model.con1 указывает, что сумма переменных x и y должна быть не менее 10.

4. Parameterizing models

Параметры – это фиксированные значения, используемые в модели для представления известных количеств или постоянных, которые не изменяются в процессе оптимизации.

Они помогают определить взаимоотношения между переменными и ограничениями, придавая модели структуру путем включения реальных данных или предположений:

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

Код выше определяет параметр p в модели Pyomo с использованием класса Param и инициализирует его с фиксированным значением 5. Параметр p теперь может использоваться в модели для представления постоянного значения, которое не изменяется в процессе оптимизации.

Теперь let’s work on an end-to-end optimization problem!

Пример Pyomo от начала до конца

Посмотрим пример решения оптимизационной проблемы с использованием Pyomo. Мы моделируем реальный сценарий, когда на фабрике производится два товара, и целью является максимизация прибыли, учитывая ограничения по времени работы машин.

1. Statement of the problem

A factory produces two products, P1 and P2. The profit per unit is:

  • P1: $40
  • P2: 50$

Доступное время на машине:

  • Машина A: 100 часов
  • Машина B: 80 часов
  • машина C: 90 часов

Время на единицу продукции:

продукт

машина A (часы)

машина B (часы)

машина C (часы)

P1

1

2

0

P2

2

1

3

цель: максимизировать прибыль.

действительные переменные:

  • x₁: единицы P1 для производства.
  • x₂: Единицы P2 для производства.

2. Математическое описание

Объективная функция:

Максимизировать Z = 40x₁ + 50x₂

Ограничения:

  1. Кapacity машины A: 1x₁ + 2x₂ ≤ 100
  2. Машинная B мощность: 2x₁ + 1x₂ ≤ 80
  3. Машина C мощность: 3x₂ ≤ 90
  4. Неотрицательность: x₁, x₂ ≥ 0

3.Реализация

Согласно цели и ограничениям задачи, вы можете смотреть на Python-код ниже, который также использует GLPK.

Шаг 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: Определение целевой функции ( максимизировать прибыль) 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 = pyo.SolverFactory('glpk') result = solver.solve(model) Шаг 7: анализ результатов Вывод: 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

В указанном выше коде, мы определяем линейную оптимизационную модель для максимизации прибыли от производства двух продуктов (P1 и P2). Целевая функция установлена на максимизацию прибыли, каждая единица P1 вносит $40, а каждая единица P2 — $50.

Мы устанавливаем три ограничения, представляющие ограничения по потреблению машинного времени для Машин A, B и C.

В конечном итоге мы используем решатель GLPK для решения задачи.

Окончательный ответ состоит в производстве 25 единиц P1 и 30 единиц P2, где наша максимальная прибыль будет $2,500.

Развитые функции в Pyomo

В предшествующей секции мы увидели, насколько легко реализовать краткосрочную оптимизационную проблему с Pyomo. However, most real-life problems are not straightforward to solve.

В этой секции я представляю некоторые развитые функции, которые вы можете использовать, чтобы решить более сложные сценарии.

1. Нелинейная оптимизация

Нелинейная оптимизация minimize or maximize a nonlinear objective function subject to nonlinear constraints. Let’s look at an example where we minimize the sum of squared differences subject to a circular constraint.

Statement of the problem

MINIMIZIRUJETSIA TARGET:Z = (x – 1)² + (y – 2)²

SOBSTVENNOST’yu:

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

В Pyomo мы можем определить независимые переменные x и y с ограничениями 0 для обеспечения неотрицательных значений. Общая функция цели выражается в виде суммы квадратов различий с определенными точками, а ограничением является условие, согласно которому решение должно находиться в круге с радиусом 2.

В этом случае решатель IPOPT подходит для решения нелинейных задач оптимизации:

import pyomo.environ as pyo model = pyo.ConcreteModel() # Определение переменных с нижними ограничениями model.x = pyo.Var(bounds=(0, None)) model.y = pyo.Var(bounds=(0, None)) #Funcция цели: минимизировать (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. Мешаная整数 программа (MIP)

Мешаная整数 программа используется, когда некоторые decision variables являются целыми числами (часто бинарными), в то время как другие являются непрерывными. Ее ценность для решения задач принятия решений, таких как выбор места для установки установки и планирование производства.

Statement проблемы

Компаниям следует решить, открывать ли склады в местах 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) #Конечная переменная: количество товара, транспортируемое 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))

Модель включает два типа решений: бинарную переменную y, представляющую собой открытие склада (1, если открыт, иначе 0), и непрерывную переменную x, представляющую количество товара, транспортируемого из каждого склада.

Целевая функция вычисляет итоговую сумму непосредственных затрат на складские услуги и транспортные расходы,MINIMIZING ОБЩИЙ. Ограничения обеспечивают соответствие общего количества товаров, требуемого для транспортировки, и не превышение мощности каждого склада при его открытии.

3. Управление несколькими целями

Иногда оптимизационные проблемы включают несколько целей, которые могут конфликтовать, например, MAXIMIZING PROFIT WHILE MINIMIZING ENVIRONMENTAL IMPACT. COMMON APPROACH – это метод весовой суммы, WHEREКАждая цель назначает вес для сбалансировать важность.

Problem statement

我们的目标是最大化利润同时最小化环境影响:

  • 利润: 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-файлы. Pyomo хорошо работает с Pandas для чтения и использования внешних данных.

Мы можем прочитать CSV-файл с помощью Pandas и использовать данные для инициализации наборов и параметров в нашей модели:

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 довольно часто встречаются проблемы, такие как неfeasible решения, ошибки складывания или неверные результаты. Вот несколько лучших практик для отладки:

  • Проверка ограничений:Проверьте свои ограничения, если модель не дает возможного решения. Слишком жесткие ограничения могут сделать задачу нереalisable. Используйте метод .display() Pyomo, чтобы вывести значения переменных и ограничений, чтобы убедиться, что все происходит как ожидается.
  • Вывод solver:Включите детальные журналы solver, передав tee=True при вызове метода solve(). Это может оказать помощь в понимании того, где solver может встретить трудности, например, неограниченные переменные или невозможность.
  • Первым образом проверьте простые модели: при работе с сложными моделями, тестируйте упрощенную версию. Это может помочь изолировать потенциальные проблемы без нагрузки, связанной с полностью определенной моделью.

Расследование ошибок гораздо легче, если вы при этом следуете систематической методологии, анализируя ограничения, целевую функцию и информацию о состоянии решателя.

2. Эффективность моделирования

Оптимизационные задачи могут стать компутационно трудными по мере увеличения размера модели. Чтобы обеспечить эффективное моделирование, учитывайте следующие советы:

  • Использование редкости: избегать цикла по не необходимым индексам при определении ограничений или целей. использование редкости в вашем проблеме уменьшает время вычислений.
  • Двойной vs. непрерывных переменных: где возможно, уменьшайте количество двойственных или целочисленных переменных. непрерывные переменные легче обрабатываются решателями, что приводит к более быстрым решениям.
  • Формулировка ограничений:保持限制尽可能简单,无论是从数学形式上还是实现上。避免不必要的非线性,将复杂的限制分解为更小、更易于管理的几个限制。

Эффективные модели решают за более короткое время и легче деBUGгировать и обслуживать.

3. Документация и обслуживание

Доброе документирование моделей Pyomo является хорошей практикой для долгосрочного использования и совместной работы. Good documentation also makes it easier to revisit and update models over time:

  • Использовать встроенные комментарии: Всегда добавляйте комментарии для объяснения назначения переменных, ограничений и целевой функции. Это особенно важно в оптимизационных моделях, где логика может не быть сразу ясной.
  • Модулируйте ваш код: Разделите ваш модель на логические разделы или даже отдельные функции. Этот модульный подход может улучшить читаемость и сделать деBUGгирование и изменение конкретных частей модели легче.
  • Следите за изменениями модели: храните историю версий вашей модели, особенно если она развивается. Используйте инструменты управления версиями, такие как Git, для отслеживания изменений и обеспечения возможности проследить для любых обновлений или улучшений.

Правильная документация и структурированный код сделают ваши модели Pyomo более доступными для будущих сотрудников и легче прокатить или изменить по мере изменения ваших требований.

Заключение

Пакет Pyomo является мощным и гибким инструментом для построения и решения моделей оптимизации на языке Python. В этом руководстве мы исследовали, как Pyomo позволяет пользователям моделировать различные оптимизационные проблемы, от линейной программировки до нелинейной и смешанной целочисленной программировки.

С его дружественной синтаксической структурой и интеграцией с решателями Pyomo делает оформление и решение реальных мирных оптимизационных проблем доступными как для новичков, так и для опытных пользователей.

Если вы заинтересован в изучении решения реальных мирных проблем с использованием оптимизации, посетите бесплатный курс DataCamp Introduction to Optimization in Python!

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