Algorytmika: Optymalizator cięcia profili (Cutting Stock)
Zadanie 4: Optymalizator Cięcia Profili
Wstęp
Każdy milimetr zmarnowanego materiału to strata pieniędzy. W produkcji seryjnej (okna, meble, konstrukcje stalowe) kluczowe jest takie rozplanowanie cięć, aby z dostępnych rur czy belek zostało jak najmniej odpadu. Twoim zadaniem jest rozwiązanie tego problemu inżynierskiego.
Cel zadania
Zaprojektowanie algorytmu i struktury danych dla programu optymalizującego rozkrój profili liniowych, uwzględniającego szerokość rzazu (piły).
Wymagania biznesowe
- Magazyn: Mamy profile o różnych długościach (nie tylko standardowe 6m, ale też odpady z poprzednich prac).
- Zamówienie: Lista odcinków do wycięcia.
- Technologia: Każde cięcie "zjada" 5mm materiału (rzaz).
- Cel: Minimalizacja odpadu (sumy niewykorzystanych końcówek).
Dane wejściowe (Przykład)
- Magazyn:
- 10 szt. x 6000 mm
- 3 szt. x 3000 mm
- 1 szt. x 1505 mm
- 1 szt. x 2004 mm
- 2 szt. x 1000 mm
- Do wycięcia:
- 10 szt. x 325 mm
- 2 szt. x 250 mm
- 5 szt. x 150 mm
- 1 szt. x 2998 mm
Kroki do wykonania
1. Model Danych (JSON/Struktura)
Zdefiniuj, jak program będzie przechowywał dane. W odróżnieniu od prostych zmiennych, tu potrzebujemy struktur.
/* Input Data Structure */
{
"stock": [
{ "length": 6000, "count": 10 },
{ "length": 3000, "count": 3 },
// ...
],
"requirements": [
{ "length": 325, "count": 10 },
{ "length": 250, "count": 2 }
// ...
],
"settings": {
"kerf": 5 // rzaz
}
}
2. Algorytm Przydziału (Logika)
Opisz krok po kroku, jak program ma decydować.
Strategia: Best Fit Decreasing (Najlepsze dopasowanie malejąco)
- Posortuj elementy do wycięcia od najdłuższego do najkrótszego (ważne!).
- Dla każdego elementu "do wycięcia": a. Sprawdź dostępne profile w magazynie (również te "napoczęte"). b. Znajdź taki profil, z którego da się wyciąć element (uwzględniając 5mm rzazu) i który pozostawi najmniejszą resztę. c. Jeśli znajdziesz -> odejmij element i rzaz od długości profilu. Zapisz przypisanie. d. Jeśli nie znajdziesz w napoczętych -> weź nowy profil z magazynu.
- Powtarzaj aż wytniesz wszystko lub braknie materiału.
3. Prezentacja Wyniku
Zaprojektuj czytelny raport końcowy. Pracownik przy pile musi wiedzieć co robić.
Format wyjściowy:
- Profil ID #1 (Baza: 6000mm)
- Ucięto: 325mm, 325mm, 325mm ... (Suma: X)
- Odpad: Y mm (Zostaje na półkę / Złom)
- Profil ID #2 (Baza: 3000mm)
- Ucięto: 2998mm
- Odpad: ...
[!TIP] Szczegół techniczny: Czy od ostatniego kawałka też odejmujemy rzaz? Zazwyczaj tak, jeśli planujemy ciąć dalej ten sam profil w przyszłości (wyrównanie krawędzi). W tym zadaniu przyjmijmy uproszczenie: każde cięcie to -5mm.
Zadanie dla chętnych
Zastanów się nad sytuacją "Odpady użyteczne". Jeśli z 6-metrowej rury zostanie 2-metrowy kawałek, program powinien go zapisać z powrotem do "Magazynu" (np. do pliku stock.json) do wykorzystania przy następnym zleceniu. Zaprojektuj ten przepływ danych.