Różnice między wybraną wersją a wersją aktualną.
Poprzednia rewizja po obu stronachPoprzednia wersjaNowa wersja | Poprzednia wersja | ||
notatki:programowanie_liniowe [2025/05/16 19:09] – administrator | notatki:programowanie_liniowe [2025/05/16 19:26] (aktualna) – administrator | ||
---|---|---|---|
Linia 898: | Linia 898: | ||
x(2,4) = 250.0 t | x(2,4) = 250.0 t | ||
</ | </ | ||
+ | ====== Transport truskawek ====== | ||
+ | W sezonie letnim truskawki zbierane przez plantatorów muszą być dostarczone do punktów skupu. Każdy z plantatorów dysponuje określoną ilością truskawek (w tonach), a każdy punkt skupu ma sprecyzowane zapotrzebowanie. Celem jest tak zaplanować transport, aby **pokryć zapotrzebowanie punktów skupu przy minimalnych kosztach transportu**. | ||
+ | |||
+ | ===== Dane wejściowe ===== | ||
+ | |||
+ | **Dostępność truskawek u plantatorów: | ||
+ | * Plantator I: 12 tony | ||
+ | * Plantator II: 30 ton | ||
+ | * Plantator III: 6 ton | ||
+ | |||
+ | **Zapotrzebowanie punktów skupu:** | ||
+ | * Punkt A: 18 ton | ||
+ | * Punkt B: 12 ton | ||
+ | * Punkt C: 18 ton | ||
+ | |||
+ | ==== Tabela kosztów transportu (w zł za 1 tonę) ==== | ||
+ | |||
+ | ^ Plantator ↓ / Punkt → ^ A ^ B ^ C ^ | ||
+ | | I | 80 | 160 | 160 | | ||
+ | | II |240 | 320 | 80 | | ||
+ | | III | 32 | 160 | 32 | | ||
+ | |||
+ | ===== Zmienne decyzyjne ===== | ||
+ | Niech: | ||
+ | * $x_{ij}$ – ilość ton truskawek transportowana od plantatora $i$ do punktu skupu $j$ | ||
+ | gdzie $i \in \{1,2,3\}$ (plantatorzy) i $j \in \{A,B,C\}$ (punkty skupu) | ||
+ | |||
+ | ===== Funkcja celu ===== | ||
+ | Minimalizacja całkowitego kosztu transportu: | ||
+ | |||
+ | $$ | ||
+ | Z = \min \sum_{i=1}^{3} \sum_{j \in \{A,B,C\}} c_{ij} \cdot x_{ij} | ||
+ | $$ | ||
+ | |||
+ | Gdzie $c_{ij}$ to koszt transportu 1 tony z plantatora $i$ do punktu skupu $j$. | ||
+ | |||
+ | ===== Ograniczenia ===== | ||
+ | |||
+ | **Dostępność u plantatorów: | ||
+ | $$ | ||
+ | x_{1A} + x_{1B} + x_{1C} \leq 24 \\ | ||
+ | x_{2A} + x_{2B} + x_{2C} \leq 30 \\ | ||
+ | x_{3A} + x_{3B} + x_{3C} \leq 6 | ||
+ | $$ | ||
+ | |||
+ | **Zapotrzebowanie punktów skupu:** | ||
+ | $$ | ||
+ | x_{1A} + x_{2A} + x_{3A} = 18 \\ | ||
+ | x_{1B} + x_{2B} + x_{3B} = 12 \\ | ||
+ | x_{1C} + x_{2C} + x_{3C} = 18 | ||
+ | $$ | ||
+ | |||
+ | **Nieujemność zmiennych: | ||
+ | $$ | ||
+ | x_{ij} \geq 0 \quad \text{dla każdego } i,j | ||
+ | $$ | ||
+ | |||
+ | ===== Cel ===== | ||
+ | Wyznaczyć optymalne wartości zmiennych $x_{ij}$, aby: | ||
+ | * Całkowity koszt transportu był **najniższy** | ||
+ | * Spełnione zostały ograniczenia dostępności i zapotrzebowania | ||
+ | |||
+ | ===== Uwagi ===== | ||
+ | To klasyczny **problem transportowy** możliwy do rozwiązania z użyciem: | ||
+ | * **Python + PuLP** | ||
+ | * **Excel Solver** | ||
+ | * **Metody północno-zachodniego narożnika + metoda potencjałów** (dla zadań ręcznych) | ||
+ | === Kod === | ||
+ | <code python> | ||
+ | from pulp import LpProblem, LpVariable, LpMinimize, LpStatus, lpSum, value | ||
+ | |||
+ | # Model | ||
+ | model = LpProblem(" | ||
+ | |||
+ | # Plantatorzy i punkty skupu | ||
+ | plantatorzy = [' | ||
+ | punkty_skupu = [' | ||
+ | |||
+ | # Koszty transportu (zł/t) | ||
+ | koszty = { | ||
+ | (' | ||
+ | (' | ||
+ | (' | ||
+ | } | ||
+ | |||
+ | # Ilość dostępnych truskawek (t) | ||
+ | dostawy = {' | ||
+ | |||
+ | # Zapotrzebowanie punktów skupu (t) | ||
+ | zapotrzebowanie = {' | ||
+ | |||
+ | # Zmienne decyzyjne | ||
+ | x = { | ||
+ | (p, s): LpVariable(f" | ||
+ | for p in plantatorzy for s in punkty_skupu | ||
+ | } | ||
+ | |||
+ | # Funkcja celu: minimalizacja kosztów transportu | ||
+ | model += lpSum(koszty[p, | ||
+ | |||
+ | # Ograniczenia dostępności plantatorów | ||
+ | for p in plantatorzy: | ||
+ | model += lpSum(x[p, s] for s in punkty_skupu) <= dostawy[p], f" | ||
+ | |||
+ | # Ograniczenia zapotrzebowania punktów skupu | ||
+ | for s in punkty_skupu: | ||
+ | model += lpSum(x[p, s] for p in plantatorzy) == zapotrzebowanie[s], | ||
+ | |||
+ | # Rozwiązanie | ||
+ | model.solve() | ||
+ | |||
+ | # Wyniki | ||
+ | print(" | ||
+ | print(" | ||
+ | print(" | ||
+ | for p in plantatorzy: | ||
+ | for s in punkty_skupu: | ||
+ | print(f" | ||
+ | </ | ||
+ | === Wynik: === | ||
+ | < | ||
+ | Status: Optimal | ||
+ | Minimalny koszt transportu (zł): 6432.0 | ||
+ | |||
+ | Wielkości dostaw (t): | ||
+ | P1 -> A: 0.0 t | ||
+ | P1 -> B: 12.0 t | ||
+ | P1 -> C: 0.0 t | ||
+ | P2 -> A: 12.0 t | ||
+ | P2 -> B: 0.0 t | ||
+ | P2 -> C: 18.0 t | ||
+ | P3 -> A: 6.0 t | ||
+ | P3 -> B: 0.0 t | ||
+ | P3 -> C: 0.0 t | ||
+ | </ |