Найти тему
Властелин машин

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

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

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

-2

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

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

-3

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

-4

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

-5

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

from scipy.optimize import linprog

if __name__ ==
'__main__':

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))