Algorytmika: Optymalizator cięcia profili (Cutting Stock)

Oprogramowanie
Priorytet: Normalny Szkic

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

  1. Magazyn: Mamy profile o różnych długościach (nie tylko standardowe 6m, ale też odpady z poprzednich prac).
  2. Zamówienie: Lista odcinków do wycięcia.
  3. Technologia: Każde cięcie "zjada" 5mm materiału (rzaz).
  4. 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)

  1. Posortuj elementy do wycięcia od najdłuższego do najkrótszego (ważne!).
  2. 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.
  3. 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.