Narzędzia użytkownika

Narzędzia witryny


notatki:programowanie_liniowe

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Poprzednia rewizja po obu stronachPoprzednia wersja
Nowa wersja
Poprzednia wersja
notatki:programowanie_liniowe [2025/05/16 19:09] administratornotatki: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
 </code> </code>
 +====== 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("transport_truskawek", LpMinimize)
 +
 +# Plantatorzy i punkty skupu
 +plantatorzy = ['P1', 'P2', 'P3']
 +punkty_skupu = ['A', 'B', 'C']
 +
 +# Koszty transportu (zł/t)
 +koszty = {
 +    ('P1', 'A'): 80,   ('P1', 'B'): 160, ('P1', 'C'): 160,
 +    ('P2', 'A'): 240,  ('P2', 'B'): 320, ('P2', 'C'): 80,
 +    ('P3', 'A'): 32,   ('P3', 'B'): 160, ('P3', 'C'): 32
 +}
 +
 +# Ilość dostępnych truskawek (t)
 +dostawy = {'P1': 12, 'P2': 30, 'P3': 6}
 +
 +# Zapotrzebowanie punktów skupu (t)
 +zapotrzebowanie = {'A': 18, 'B': 12, 'C': 18}
 +
 +# Zmienne decyzyjne
 +x = {
 +    (p, s): LpVariable(f"x_{p}_{s}", lowBound=0)
 +    for p in plantatorzy for s in punkty_skupu
 +}
 +
 +# Funkcja celu: minimalizacja kosztów transportu
 +model += lpSum(koszty[p, s] * x[p, s] for p in plantatorzy for s in punkty_skupu), "Koszt_calkowity"
 +
 +# Ograniczenia dostępności plantatorów
 +for p in plantatorzy:
 +    model += lpSum(x[p, s] for s in punkty_skupu) <= dostawy[p], f"Dostawa_{p}"
 +
 +# Ograniczenia zapotrzebowania punktów skupu
 +for s in punkty_skupu:
 +    model += lpSum(x[p, s] for p in plantatorzy) == zapotrzebowanie[s], f"Zapotrzebowanie_{s}"
 +
 +# Rozwiązanie
 +model.solve()
 +
 +# Wyniki
 +print("Status:", LpStatus[model.status])
 +print("Minimalny koszt transportu (zł):", round(value(model.objective), 2))
 +print("\nWielkości dostaw (t):")
 +for p in plantatorzy:
 +    for s in punkty_skupu:
 +        print(f"{p} -> {s}: {round(x[p, s].value(), 2)} t")
 +</code>
 +=== Wynik: ===
 +<code>
 +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
 +</code>
notatki/programowanie_liniowe.1747415357.txt.gz · ostatnio zmienione: 2025/05/16 19:09 przez administrator