Do rozwiązywania problemów programowania liniowego wykorzystamy bibliotekę PuLP:
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":
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'):
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:
zysk = 5000*x + 3000*y
problem += zysk
Dodajemy też ograniczenia:
problem += (x + y <= 8), "powierzchnia"
problem += (2*x + y <= 10), "pestycydy"
Zobaczmy teraz zawartość zmiennej problem:
print(problem)
Spróbujmy rozwiązać ten problem:
problem.solve()
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”":
print("Status:", pulp.LpStatus[problem.status])
Znalezione rozwiązanie jest optymalne. Sprawdźmy optymalne wartości zmiennych decyzyjnych:
for v in problem.variables():
print("Optymalna liczba akrów:", v.name,"=",v.varValue)
Na koniec wypiszmy optymalną wartość funkcji celu:
print("Zysk =",pulp.value(problem.objective), "zł")