python
February 3, 2021

Линейное программирование на практике

Линейное программирование является эффективным способом решения разнородных экономических проблем (детальнее читай здесь). В данной статье разберем и приведем код решения еще одной задачи:

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

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

Как вы помните, общий вид модели линейного программирования следующий:

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

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

Привожу итоговый код для получения результата:

from scipy.optimize import linprog
  s1 = 100
  s2 = 200
  h1_1 = 20
  h1_2 = 15

h2_1 = 35
  h2_2 = 30

c1 = 6
  c2 = 4

c11 = h1_1*c1
  c12 = h1_2*c1
  c21 = h2_1*c2
  c22 = h2_2*c2

c = [-c11,-c12,-c21,-c22]
  # в A_ub и b_ub задаются неравенства
  # в виде коэффициентов для каждого в строках A_ub
  # и соответствующих им ограничивающих значений в строках b_ub
  A_ub = [[-h1_1,-h1_2,0,0],
               [0,0,-h2_1,-h2_2],
               [1,0,1,0], [0,1,0,1]]
  b_ub = [-1500,-4500,100,200]

print(linprog(c, A_ub, b_ub))

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Instagram

Яндекс Дзен

Telegram