Розв'язання моделі PuLP

Аналітика ланцюга постачань у Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Типовий процес моделювання в PuLP

  1. Ініціалізувати модель
  2. Визначити змінні рішень
  3. Задати цільову функцію
  4. Задати обмеження
  5. Розв'язати модель
    • викликати метод solve()
    • перевірити статус розв'язку
    • вивести оптимізовані змінні рішень
    • вивести значення оптимізованої цільової функції
Аналітика ланцюга постачань у Python

Розв'язання моделі — метод solve

.solve(solver=None)
  • solver = Необов'язково: конкретний розв'язувач; за замовчуванням використовується типовий.
Аналітика ланцюга постачань у Python
# Initialize, Define Decision Vars., Objective Function, and Constraints
from pulp import *
import pandas as pd
model = LpProblem("Minimize Transportation Costs", LpMinimize)
cust = ['A','B','C']
warehouse = ['W1','W2']
demand = {'A': 1500, 'B': 900, 'C': 800}
costs = {('W1','A'): 232, ('W1','B'): 255, ('W1','C'): 264, 
         ('W2','A'): 255, ('W2','B'): 233, ('W2','C'): 250}
ship = LpVariable.dicts("s_", [(w,c) for w in warehouse for c in cust], 
                         lowBound=0, cat='Integer')
model += lpSum([costs[(w, c)] * ship[(w, c)] for w in warehouse for c in cust])
for c in cust: model += lpSum([ship[(w, c)] for w in warehouse]) == demand[c]

# Solve Model
model.solve()
Аналітика ланцюга постачань у Python

Розв'язання моделі — статус розв'язку

LpStatus[model.status]
  • Not Solved: статус до розв'язання задачі.
  • Optimal: знайдено оптимальний розв'язок.
  • Infeasible: немає допустимих розв'язків (напр., якщо задано обмеження x ≤ 1 і x ≥ 2).
  • Unbounded: цільова функція необмежена; максимізація чи мінімізація прямує до нескінченності (напр., якщо єдине обмеження — x ≥ 3).
  • Undefined: оптимальний розв'язок може існувати, але його не знайдено.
1 Keen, Ben Alex. "Linear Programming with Python and PuLP 2 Part 2." _Ben Alex Keen_, 1 Apr. 2016, benalexkeen.com/linear-programming-with-python-and-pulp-part-2/._{{5}}
Аналітика ланцюга постачань у Python
# Initialize, Define Decision Vars., Objective Function, and Constraints
from pulp import *
import pandas as pd
model = LpProblem("Minimize Transportation Costs", LpMinimize)
cust = ['A','B','C']
warehouse = ['W1','W2']
demand = {'A': 1500, 'B': 900, 'C': 800}
costs = {('W1','A'): 232, ('W1','B'): 255, ('W1','C'): 264,
         ('W2','A'): 255, ('W2','B'): 233, ('W2','C'): 250}
ship = LpVariable.dicts("s_", [(w,c) for w in warehouse for c in cust], lowBound=0, cat='Integer')
model += lpSum([costs[(w, c)] * ship[(w, c)] for w in warehouse for c in cust])
for c in cust: model += lpSum([ship[(w, c)] for w in warehouse]) == demand[c]
# Solve Model
model.solve()
print("Status:", LpStatus[model.status])
Status: Optimal
Аналітика ланцюга постачань у Python

Вивести змінні у стандартний потік:

for v in model.variables():
    print(v.name, "=", v.varValue)

Структура даних pandas:

o = [{A:ship[(w,'A')].varValue, B:ship[(w,'B')].varValue, C:ship[(w,'C')].varValue}
     for w in warehouse]
print(pd.DataFrame(o, index=warehouse))
  • перебрати змінні моделі
  • зберегти значення у DataFrame бібліотеки pandas
Аналітика ланцюга постачань у Python
# Solve Model
model.solve()
print(LpStatus[model.status])
o = [{A:ship[(w,'A')].varValue, B:ship[(w,'B')].varValue, C:ship[(w,'C')].varValue}
     for w in warehouse]
print(pd.DataFrame(o, index=warehouse))

  Вивід:

Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Аналітика ланцюга постачань у Python

Розв'язання моделі — цільова функція

Вивести значення оптимізованої цільової функції:

print("Objective = ", value(model.objective))
Аналітика ланцюга постачань у Python
# Solve Model
model.solve()
print(LpStatus[model.status])
output = []
for w in warehouse: t = [ship[(w,c)].varValue for c in cust] output.append(t)
opd = pd.DataFrame.from_records(output, index=warehouse, columns=cust)
print(opd)
print("Objective = ", value(model.objective))
Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Objective = 757700.0
Аналітика ланцюга постачань у Python

Підсумок

Розв'язати модель

  • Викликати метод solve()
  • Перевірити статус розв'язку
  • Вивести значення змінних рішень
  • Вивести значення цільової функції
Аналітика ланцюга постачань у Python

Давайте потренуємось!

Аналітика ланцюга постачань у Python

Preparing Video For Download...