Международный журнал прикладных и фундаментальных исследованийrae.ru
Научный журнал

Международный журнал прикладных и фундаментальных исследований

ISSN 1996-3955ИФ РИНЦ = 0,556

РЕШЕНИЕ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ С ПОМОЩЬЮ БИБЛИОТЕКИ PYOMO НА ЯЗЫКЕ PYTHON

Барганалиева Ж.К. 1, Султанбаева Г.С. 1, Асанова Ж.К. 1, Асанбекова Н.О. 1
1Кыргызский государственный университет имени И. Арабаева

Линейное программирование (ЛП) является методом математического программирования, использующимся для оптимизации линейной целевой функции при наличии линейных ограничений. Вот некоторые типичные задачи, которые можно решать с помощью линейного программирования:

1. Максимизация прибыли: найти оптимальное распределение ресурсов, чтобы максимизировать прибыль предприятия, учитывая ограничения на производство и рыночные условия.

2. Минимизация затрат: определить оптимальное распределение ресурсов для минимизации затрат при выполнении определенных требований и ограничений.

3. Распределение ресурсов: распределить ограниченные ресурсы (например, рабочую силу, сырье или мощности) между различными задачами или проектами таким образом, чтобы достичь наилучшего использования ресурсов и минимизировать затраты.

4. Планирование производства: определить оптимальный план производства, учитывая ограничения на доступность ресурсов, объемы производства и спрос на конечные продукты.

5. Транспортная задача: найти оптимальный план перевозки товаров из множества источников в множество пунктов назначения с минимальными затратами или максимизацией объемов перевозки.

6. Формирование портфеля: определить оптимальное распределение средств между различными финансовыми инструментами (акции, облигации, депозиты и т.д.) с целью минимизации риска или максимизации ожидаемой доходности;

7. Расписание: создать оптимальное расписание, учитывая ограничения по времени, доступность ресурсов и потребности клиентов.

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

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

Pyomo – это свободно распространяемый Python-пакет для моделирования и оптимизации математических моделей, в том числе линейного программирования, целочисленного линейного программирования, квадратичного программирования, динамического программирования и т.д. Pyomo обеспечивает удобный интерфейс для формулирования оптимизационных задач с помощью Python и является гибким инструментом для решения широкого спектра оптимизационных задач. Pyomo поддерживает различные солверы, включая open-source CBC, GLPK, IPOPT и Gurobi, а также коммерческие солверы CPLEX и GUROBI, что делает его очень гибким и подходящим для решения различных оптимизационных задач.

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

Преимущества Pyomo:

− простота в использовании и понимании;

− возможность использования различных языков программирования для построения моделей;

− гибкость в настройке и выборе солвера;

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

− поддержка визуализации и анализа результатов оптимизации

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

Материалы и методы исследования

Рассматривается задача упрощенного типа перевозки. У нас есть множество клиентов натуральных безалкогольных напитков (НБН) [1] I = {1, 2, 3, 4, 5} и множество предприятий по производству НБН J = {1, 2, 3}. У каждого покупателя есть фиксированная потребность в натуральных безалкогольных напитках pi , и у каждого предприятия есть фиксированная производственная мощность Mj. Также существуют фиксированные транспортные расходы на доставку одной единицы товара с производства j покупателю i.

Математически эту задачу оптимизации можно описать следующим образом:

Найти минимум

missing image file (1)

при условиях

missing image file (2)

missing image file (3)

missing image file. (4)

Теперь условия задачи (1)–(4) можно записать в виде таблицы.

Исходные данные

   

Покупатель i

 

Транспортные расходы cji

 

1

2

3

4

5

Производственная мощность Mj

НБН j

1

4

5

6

8

10

500

2

6

4

3

5

8

500

3

9

7

4

2

4

500

Cпрос pi

 

80

270

250

160

180

 

Решив задачу способом [2–4], определим оптимальный план.

Для решения данной задачи оптимизации на Python используется библиотека Pyomo.

1. Установка библиотеки Pyomo

Перед началом работы необходимо установить библиотеку Pyomo. Это можно сделать с помощью pip, выполнив следующую команду:

pip install pyomo

2. Импортирование необходимых модулей

Далее, импортируеются необходимые модули из библиотеки Pyomo:

from pyomo.environ import *

3. Определение данных

Сначала определяются данные для этой задачи оптимизации. В данном случае это матрица транспортных расходов (c), потребности покупателей (p) и производственные мощности предприятий (M).

# Определение данных

c = [[4, 5, 6, 8, 10],

[6, 4, 3, 5, 8],

[9, 7, 4, 2, 4]]

p = [80, 270, 250, 160, 180]

M = [500, 500, 500]

4. Создание модели

Далее, создается модель, используя функцию ConcreteModel() из модуля pyomo.environ. Модель состоит из переменных, целевой функции и ограничений.

# Создание модели

model = ConcreteModel()

# Определение множеств

model.I = RangeSet(5)

model.J = RangeSet(3)

# Определение переменных решения

model.x = Var(model.I, model.J, within= NonNegativeReals)

# Определение целевой функции

model.obj = Objective(expr=sum(c[i][j] * model.x[i,j] for i in model.I for j in model.J), sense=minimize)

# Определение ограничений

model.demand = ConstraintList()

for i in model.I:

model.demand.add(sum(model.x[i,j] for j in model.J) == p[i-1])

model.supply = ConstraintList()

for j in model.J:

model.supply.add(sum(model.x[i,j] for i in model.I) <= M[j-1])

В этом коде создается модель и определяются множества I и J, переменные решения x, целевую функцию obj и ограничения demand и supply.

5. Решение задачи оптимизации

Для решения задачи оптимизации используется стандартный солвер GLPK, который можно установить через pip. Далее вызывается метод solve() данной модели, который выполняет оптимизацию.

# Решение задачи оптимизации

SolverFactory(‘glpk’).solve(model)

# Вывод результатов

print(f»Минимальная стоимость доставки: {model.obj():.2f}»)

print(«\nР

Код программы для решения задачи линейного программирования с помощью Pyomo [5, с. 223]:

from pyomo.environ import *

# Создание модели

model = ConcreteModel()

# Определение множества I и J

I = [1, 2, 3, 4, 5]

J = [1, 2, 3]

# Определение параметров модели

M = {1: 500, 2: 500, 3: 500} # производственная мощность

p = {1: 80, 2: 270, 3: 250, 4: 160, 5: 180} # потребности покупателей

c = {(1, 1): 4, (1, 2): 5, (1, 3): 6, (1, 4): 8, (1, 5): 10,

(2, 1): 6, (2, 2): 4, (2, 3): 3, (2, 4): 5, (2, 5): 8,

(3, 1): 9, (3, 2): 7, (3, 3): 4, (3, 4): 2, (3, 5): 4} # транспортные расходы

# Определяются переменные решения

model.x = Var(I, J, within=NonNegativeReals)

# Определяется целевая функция

model.obj = Objective(expr=sum(c[i, j] * model.x[i, j] for i in I for j in J),

sense=minimize)

# Определяются ограничения на потребности покупателей

model.demand = ConstraintList()

for i in I:

model.demand.add(sum(model.x[i, j] for j in J) == p[i])

# Определяются ограничения на производственную мощность

model.capacity = ConstraintList()

for j in J:

model.capacity.add(sum(model.x[i, j] for i in I) <= M[j])

# Решается задача

solver = SolverFactory(‘glpk’)

solver.solve(model)

# Вывод результата

print(f”Optimal value: {model.obj():.2f}”)

print(“Solution:”)

for i in I:

for j in J:

print(f”x[{i}, {j}] = {model.x[i, j]():.2f}”)

Примечание. Для запуска данного кода необходимо установить Pyomo и выбрать один из доступных решателей (например, GLPK). При запуске программы получаем следующий ответ: 3350.00.

Заключение

Итак, существуют три библиотеки на Python, с помощью которых можно решить задачи линейного программирования: SiPy, Pulp, Pyomo. Значение целевой функции при использовании библиотеки Pyomo L(x) = 3350. При решении оптимизационных задач можете использовать библиотеку Pyomo.


Библиографическая ссылка

Барганалиева Ж.К., Султанбаева Г.С., Асанова Ж.К., Асанбекова Н.О. РЕШЕНИЕ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ С ПОМОЩЬЮ БИБЛИОТЕКИ PYOMO НА ЯЗЫКЕ PYTHON // Международный журнал прикладных и фундаментальных исследований. 2023. № 12. С. 29-32;
URL: https://www.applied-research.ru/article/view?id=13601 (дата обращения: 22.08.2026).
DOI: https://doi.org/10.17513/mjpfi.13601