Найти в Дзене
Квантовый скачок

Погружаемся в механику линейного программирования с Python

Как я указывал ранее, линейное программирование предоставляет эффективный инструментарий для решения разнообразных экономических задач (детальнее здесь). Удивительно, но этот механизм несмотря на исключительную полезность не часто упоминается в литературе. В этой статье расскажу подробнее о технике решения соответствующих проблем с использованием языка Python и его библиотеки SciPy. Рассмотрим следующую задачу: “Найти оптимальное сочетание посевов пшеницы и кукурузы на участках различного плодородия площадью 100 и 200 га. Данные об урожайности приведены в таблице: Условия: должно быть собрано не менее 1500 ц. пшеницы и 4500 ц. кукурузы, цена одного ц. пшеницы - 6 руб., кукурузы - 4 руб. Наша задача - максимизация выручки продукции в денежном выражении”. Напомню общий вид модели линейного программирования: Построим систему уравнений: Для решения воспользуемся библиотекой SciPy, в которой есть специальная функция linprog (из модуля scipy.optimize). Для получения результата ей необходимо

Как я указывал ранее, линейное программирование предоставляет эффективный инструментарий для решения разнообразных экономических задач (детальнее здесь). Удивительно, но этот механизм несмотря на исключительную полезность не часто упоминается в литературе. В этой статье расскажу подробнее о технике решения соответствующих проблем с использованием языка Python и его библиотеки SciPy.

Рассмотрим следующую задачу:

“Найти оптимальное сочетание посевов пшеницы и кукурузы на участках различного плодородия площадью 100 и 200 га. Данные об урожайности приведены в таблице:

-2

Условия: должно быть собрано не менее 1500 ц. пшеницы и 4500 ц. кукурузы, цена одного ц. пшеницы - 6 руб., кукурузы - 4 руб. Наша задача - максимизация выручки продукции в денежном выражении”.

Напомню общий вид модели линейного программирования:

-3

Построим систему уравнений:

-4

Для решения воспользуемся библиотекой SciPy, в которой есть специальная функция linprog (из модуля scipy.optimize). Для получения результата ей необходимо аккуратно задать коэффициенты при неизвестных значениях (xij) целевой функции, которую надо минимизировать, а также коэффициенты и ограничивающие значения при всех неравенствах (вида <=) и равенствах (конечно, если они есть). С учетом условий работы функции нам потребуется преобразовать задачу нахождения максимума в задачу минимизации (для этого достаточно умножить функцию на “-1”), а также преобразовать неравенства к единому виду. Привожу изменения :

-5

Результат будет выглядеть следующим образом:

c11 = h11*c1

c12 = h12*c1

c21 = h21*c2

c22 = h22*c2

# коэффициенты в целевой функции

c = [-c11,-c12,-c21,-c22]

# в A_ub и b_ub задаются неравенства

# в виде коэффициентов для каждого в строках A_ub

# и соответствующих им ограничивающих значений в строках b_ub

A_ub = [[-h11,-h12,0,0],

[0,0,-h21,-h22],

[1,0,1,0], [0,1,0,1]]

b_ub = [-1500,-4500,100,200]

linprog(c, A_ub, b_ub)

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

В результате получается, что на первом участке посажено 75 га пшеницы и 25 га кукурузы, на втором - 200 га кукурузы. При этом кукурузы собрали на 2375 ц. больше запланированного минимального объема. Всего заработано 36 тыс. 500 руб.