Do rozwiązywania problemów programowania liniowego wykorzystamy bibliotekę PuLP:

In [1]:
import pulp

Rozważmy problem rolnika:

Rolnik planuje obsiać 8 akrów pszenicą i żytem. Do swoich zbóż musi użyć pestycydów. Ze względu na ekologię na swoim polu może wykorzystać nie więcej niż 10 litrów pestycydów. Pszenica wymaga 2 litrów pestycydów na akr, żyto 1 litra pestycydów na akr. Rolnik zarobi 5000 zł za każdy akr obsiany pszenicą i 3000 zł za każdy akr obsiany żytem. Ile akrów rolnik powinien obsiać pszenicą a ile żytem?

Oto zapis w postaci problemu programowania matematycznego, gdzie x oznacza liczbę akrów obsianych pszenicą, a y liczbę akrów obsianych żytem:

max. $z = 5000x + 3000y$
p.o.
$x + y \leq 8$
$2x + y \leq 10$
$x, y \geq 0$

Na początku stworzymy obiekt przechowujący problem, nadając mu nazwę i określając kierunek optymalizacji, możliwe kierunki to "pulp.LpMaximize" i "pulp.LpMinimize":

In [2]:
problem = pulp.LpProblem('Problem rolnika', pulp.LpMaximize)

Następie, zdefiniujemy zmienne decyzyjne. Jako argumenty podajemy nazwę zmiennej, wartość dolnego ograniczenia i typ zmiennej (inne typy to 'Integer' i 'Binary'):

In [3]:
x = pulp.LpVariable('pszenica', lowBound=0, cat='Continuous')
y = pulp.LpVariable('żyto', lowBound=0, cat='Continuous')

Teraz zdefiniujemy funkcję celu i dodamy ją do zmiennej problem:

In [4]:
zysk = 5000*x + 3000*y
problem += zysk

Dodajemy też ograniczenia:

In [5]:
problem += (x + y <= 8), "powierzchnia" 
problem += (2*x + y <= 10), "pestycydy"

Zobaczmy teraz zawartość zmiennej problem:

In [6]:
print(problem)
Problem rolnika:
MAXIMIZE
5000*pszenica + 3000*żyto + 0
SUBJECT TO
powierzchnia: pszenica + żyto <= 8

pestycydy: 2 pszenica + żyto <= 10

VARIABLES
pszenica Continuous
żyto Continuous

Spróbujmy rozwiązać ten problem:

In [7]:
problem.solve()
Out[7]:
1

Sprawdźmy, czy udało się znaleźć rozwiązanie optymalne, wykorzystamy do tego pole "status" i słownik LpStatus, możliwe statusy to "Not Solved", "Infeasible", "Unbounded", "Undefined" i "Optimal”":

In [8]:
print("Status:", pulp.LpStatus[problem.status])
Status: Optimal

Znalezione rozwiązanie jest optymalne. Sprawdźmy optymalne wartości zmiennych decyzyjnych:

In [9]:
for v in problem.variables():
    print("Optymalna liczba akrów:", v.name,"=",v.varValue)
Optymalna liczba akrów: pszenica = 2.0
Optymalna liczba akrów: żyto = 6.0

Na koniec wypiszmy optymalną wartość funkcji celu:

In [10]:
print("Zysk =",pulp.value(problem.objective), "zł")
Zysk = 28000.0 zł