Wo ist mein Denkfehler?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
vfbaufdieeins
User
Beiträge: 1
Registriert: Mittwoch 6. September 2023, 08:34

Hallo zusammen,

ich habe ein Problem mit dem folgendem Code und komme gerade echt nicht weiter bin am verzweifeln langsam, eine Pause wäre wahrscheinlich gut. Hat jemand eine Idee wo der Fehler ist? Ich schätze in der Schleife, aber vielleicht habe ich auch davor etwas übersehen. Grundsätzlich möchte ich in dem Code Spielzeuge auf Ebenen einer Palette legen. 5 Ebenen mit jeweils 8 Spielzeugen. Dabei berücksichtige ich Fläche, Volumen und Gewicht, jedoch wird immer nur die erste Ebene befüllt.
Danke im Voraus falls jemand einen Tipp hat.


Code: Alles auswählen

import random

#   Produkte
produkte = {
    "Spielzeug1": {"gewicht_kg": 20, "abmessungen_cm": (36, 31, 35)},
    "Spielzeug2": {"gewicht_kg": 20, "abmessungen_cm": (36, 31, 35)},
    "Spielzeug3": {"gewicht_kg": 20, "abmessungen_cm": (36, 31, 35)},
    "Spielzeug4": {"gewicht_kg": 20, "abmessungen_cm": (36, 31, 35)},
    "Spielzeug5": {"gewicht_kg": 20, "abmessungen_cm": (36, 31, 35)},
    "Spielzeug6": {"gewicht_kg": 20, "abmessungen_cm": (36, 31, 35)},
    "Spielzeug7": {"gewicht_kg": 20, "abmessungen_cm": (36, 31, 35)},
    "Spielzeug8": {"gewicht_kg": 20, "abmessungen_cm": (36, 31, 35)},
}

# Abmessungen und Gewicht der Palette
palette_abmessungen_cm = (120, 80, 180)
palette_max_gewicht_kg = 800

# Berechnung des Volumens eines Produkts
def berechne_volumen(abmessungen):
    return abmessungen[0] * abmessungen[1] * abmessungen[2]

# Berechnung der Fläche eines Produkts
def berechne_flaeche(abmessungen):
    return abmessungen[0] * abmessungen[1]

# Produkte nach Gewicht sortieren
produkte = dict(sorted(produkte.items(), key=lambda x: x[1]["gewicht_kg"], reverse=True))

# Zufällige Bestellung zwischen 220 und 260 Produkten
anzahl_produkte = random.randint(220, 260)
bestellte_produkte = list(produkte.keys())[:anzahl_produkte]

# Berechnung der Anzahl der benötigten Paletten
paletten_anzahl = (anzahl_produkte + 39) // 40  # 40 Produkte passen auf eine Palette

# Ausgabe der Anzahl der Paletten
print(f"Es werden {anzahl_produkte} Produkte bestellt.")
print(f"Es werden {paletten_anzahl} Paletten benötigt, da 40 Produkte auf eine Palette passen.")

# Ebenen pro Palette und Produkte pro Ebene
ebenen_pro_palette = 5
produkte_pro_ebene = 8

# Initialisierung der Paletten
paletten = []

# Schleife zur Aufteilung der Produkte auf Paletten
for i in range(paletten_anzahl):
    palette = {
        "ebenen": [[] for _ in range(ebenen_pro_palette)],
        "gesamt_gewicht_kg": 0,
        "gesamt_volumen_cm3": 0,
        "gesamt_flaeche_cm2": 0,
    }
    
    produkt_index = 0
    
    # Schleife zur Aufteilung der Produkte auf die Ebenen der aktuellen Palette
    while produkt_index < len(bestellte_produkte):
        for ebene in palette["ebenen"]:
            for _ in range(produkte_pro_ebene):
                if produkt_index < len(bestellte_produkte):
                    produkt_name = bestellte_produkte[produkt_index]
                    produkt = produkte[produkt_name]
                    produkt_gewicht = produkt["gewicht_kg"]
                    produkt_abmessungen = produkt["abmessungen_cm"]

                    if (
                        palette["gesamt_gewicht_kg"] + produkt_gewicht <= palette_max_gewicht_kg
                    ):
                        ebene.append(produkt_name)
                        palette["gesamt_gewicht_kg"] += produkt_gewicht
                        palette["gesamt_volumen_cm3"] += berechne_volumen(produkt_abmessungen)
                        palette["gesamt_flaeche_cm2"] += berechne_flaeche(produkt_abmessungen)
                        produkt_index += 1
                else:
                    break
            if produkt_index >= len(bestellte_produkte):
                break
    
    paletten.append(palette)

# Ausgabe der Paletteninformationen
for i, palette in enumerate(paletten, start=1):
    print(f"\nPalette {i}:")
    for ebene_num, ebene in enumerate(palette["ebenen"], start=1):
        print(f"Ebene {ebene_num}: {ebene}")
    print(f"Gesamtgewicht der Palette: {palette['gesamt_gewicht_kg']} kg")
    print(f"Gesamtvolumen der Produkte pro Ebene: {palette['gesamt_volumen_cm3']} cm³")
    print(f"Gesamtfläche der Produkte pro Ebene: {palette['gesamt_flaeche_cm2']} cm²")


Das ist die folgende Ausgabe die man erhält:

Es werden 245 Produkte bestellt.
Es werden 7 Paletten benötigt, da 40 Produkte auf eine Palette passen.

Palette 1:
Ebene 1: ['Spielzeug1', 'Spielzeug2', 'Spielzeug3', 'Spielzeug4', 'Spielzeug5', 'Spielzeug6', 'Spielzeug7', 'Spielzeug8']
Ebene 2: []
Ebene 3: []
Ebene 4: []
Ebene 5: []
Gesamtgewicht der Palette: 160 kg
Gesamtvolumen der Produkte pro Ebene: 312480 cm³
Gesamtfläche der Produkte pro Ebene: 8928 cm²

Palette 2:
Ebene 1: ['Spielzeug1', 'Spielzeug2', 'Spielzeug3', 'Spielzeug4', 'Spielzeug5', 'Spielzeug6', 'Spielzeug7', 'Spielzeug8']
Ebene 2: []
Ebene 3: []
Ebene 4: []
Ebene 5: []
Gesamtgewicht der Palette: 160 kg
Gesamtvolumen der Produkte pro Ebene: 312480 cm³
Gesamtfläche der Produkte pro Ebene: 8928 cm²

Palette 3:
Ebene 1: ['Spielzeug1', 'Spielzeug2', 'Spielzeug3', 'Spielzeug4', 'Spielzeug5', 'Spielzeug6', 'Spielzeug7', 'Spielzeug8']
Ebene 2: []
Ebene 3: []
Ebene 4: []
Ebene 5: []
Gesamtgewicht der Palette: 160 kg
Gesamtvolumen der Produkte pro Ebene: 312480 cm³
Gesamtfläche der Produkte pro Ebene: 8928 cm²
Palette 4:
Ebene 1: ['Spielzeug1', 'Spielzeug2', 'Spielzeug3', 'Spielzeug4', 'Spielzeug5', 'Spielzeug6', 'Spielzeug7', 'Spielzeug8']
Ebene 2: []
Ebene 3: []
Ebene 4: []
Ebene 5: []
Gesamtgewicht der Palette: 160 kg
Gesamtvolumen der Produkte pro Ebene: 312480 cm³
Gesamtfläche der Produkte pro Ebene: 8928 cm²

Palette 5:
Ebene 1: ['Spielzeug1', 'Spielzeug2', 'Spielzeug3', 'Spielzeug4', 'Spielzeug5', 'Spielzeug6', 'Spielzeug7', 'Spielzeug8']
Ebene 2: []
Ebene 3: []
Ebene 4: []
Ebene 5: []
Gesamtgewicht der Palette: 160 kg
Gesamtvolumen der Produkte pro Ebene: 312480 cm³
Gesamtfläche der Produkte pro Ebene: 8928 cm²

Palette 6:
Ebene 1: ['Spielzeug1', 'Spielzeug2', 'Spielzeug3', 'Spielzeug4', 'Spielzeug5', 'Spielzeug6', 'Spielzeug7', 'Spielzeug8']
Ebene 2: []
Ebene 3: []
Ebene 4: []
Ebene 5: []
Gesamtgewicht der Palette: 160 kg
Gesamtvolumen der Produkte pro Ebene: 312480 cm³
Gesamtfläche der Produkte pro Ebene: 8928 cm²

Palette 7:
Ebene 1: ['Spielzeug1', 'Spielzeug2', 'Spielzeug3', 'Spielzeug4', 'Spielzeug5', 'Spielzeug6', 'Spielzeug7', 'Spielzeug8']
Ebene 2: []
Ebene 3: []
Ebene 4: []
Ebene 5: []
Gesamtgewicht der Palette: 160 kg
Gesamtvolumen der Produkte pro Ebene: 312480 cm³
Gesamtfläche der Produkte pro Ebene: 8928 cm²
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast nur acht Produkte willst aber 246 Produkte verteilen? Das ergibt keinen Sinn.
Du fängst bei jeder Palette wieder von vorne an die acht Produkte zu verteilen. Deshalb landen auf jeder Palette dieselben acht Produkte.
Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Randbemerkung: Das „pro Ebene“ in der Ausgabe ist inhaltlich falsch. Die Abmessungen der Palette werden nirgends verwendet/berücksichtigt.

Da schon Funktionen verwendet werden, sollte das Hauptprogramm auch in einer Funktion stehen. Üblicherweise `main()` genannt. Und dann kann man vielleicht auch kenntlich machen was Variablen und was Konstanten sind und letztere auf Modulebene ablegen und KOMPLETT_IN_GROSSBUCHSTABEN benennen.

Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

Edit: Wörterbücher die immer den gleichen festen Satz an Schlüsseln haben sind eigentlich keine Wörterbücher sondern Objekte und sollten dementsprechend als Klasse modelliert werden.

Edit2: Das mit der Anzahl der bestellten Produkte könnte man mit `cycle()` und `islice()` aus `itertools`, und `list()` lösen, oder mit `random.choices()`, je nach dem wie man aus den 8 Produkten hunderte machen will.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
imonbln
User
Beiträge: 187
Registriert: Freitag 3. Dezember 2021, 17:07

Willkommen in der wunderbaren Welt der P-NP Probleme, deines ist bekannt als Rucksackproblem. (englisch knapsack problem).
Dir ist hoffentlich bekannt, dass es keine perfekte Lösung für solche Probleme gibt, sondern nur hinreichend gute Lösungen, die alle in der Literatur breit diskutiert wurden.
Antworten