In deze oefening moet je een voorraadbeheersysteem implementeren met behulp van stacks. Het doel is om realistische voorraadoperaties te simuleren, waarbij producten in batches worden beheerd en het Last-In-First-Out (LIFO)-principe wordt toegepast. Deze aanpak weerspiegelt scenario’s waarin de meest recent toegevoegde voorraad als eerste wordt gebruikt, zoals bij duurzame goederen.

Implementeer de Batch-klasse (1 punt)
Maak de Batch-klasse die een batch van de voorraad van een product vertegenwoordigt. Elk Batch-object moet bevatten:
- quantity: de hoeveelheid van het product in de batch
- cost_per_unit: de kosten voor het inkopen van het product in deze batch. Deze kosten worden niet op productniveau opgeslagen omdat ze per batch kunnen verschillen.
De klasse bevat ook een tostring-methode str die de batch als volgt weergeeft:
Batch(quantity=[quantity], cost_per_unit=[cost_per_unit])
Implementeer de Product-klasse (6 punten):
Maak de Product-klasse (1 punt) die een product vertegenwoordigt met een stack van voorraadbatches.
Elk Product-object moet bevatten:
- product_name: naam van het product
- batches: stack van batches voor het product
- holding_cost: kosten voor het aanhouden van een eenheid van het product in de voorraad
- stockout_penalty: kosten voor het niet kunnen leveren van een eenheid van het product
Deze klasse moet de volgende methoden bevatten:
- add_batch(quantity, cost_per_unit): voegt een nieuwe batch toe aan de stack (1 punt).
- fulfill_demand(demand): vervult de vraag met behulp van de bovenste batch van de voorraad (2 punten). Als de bovenste batch niet voldoende is, wordt de volgende batch gebruikt. De functie retourneert 0 als de vraag door een of meer batches kan worden vervuld. Als de vraag niet kan worden vervuld, retourneert de functie stockout_penalty voor het product vermenigvuldigd met het aantal producten dat niet kan worden geleverd.
- calculate_holding_cost(): deze functie retourneert de totale aanhoudingskosten voor dit product door de aanhoudingskosten voor elke batch op te tellen (1 punt).
De klasse bevat ook een tostring-methode str (1 punt) die het product als volgt weergeeft:
Product [product_name]:
Batch(quantity=[quantity_batch1 from batch_1], cost_per_unit=[cost_per_unit from batch_1])
Batch(quantity=[quantity_batch1 from batch_2], cost_per_unit=[cost_per_unit from batch_2])
....
Batch(quantity=[quantity_batch1 from batch_n], cost_per_unit=[cost_per_unit from batch_n])