class Energydistributer(): @staticmethod def distribute_energy(energy_users, current_power): remaining_power = current_power - sum(user.current_delta_power for user in energy_users) # Filtere Benutzer mit idle = True idle_energy_users = [user for user in energy_users if user.idle] # Erweitere die Schritte für modulare Benutzer for user in idle_energy_users: if user.modular: user.powersteps = list(range(min(user.powersteps), max(user.powersteps) + 1)) # Sortiere die Benutzer nach ihrer Priorität und dann nach ihrer ID idle_energy_users.sort(key=lambda x: (x.user_prio, x.used_energy)) # Schleife durch alle Prioritäten priorities = set(user.user_prio for user in idle_energy_users) for priority in priorities: # Benutzer mit gleicher Priorität sammeln same_priority_users = [u for u in idle_energy_users if u.user_prio == priority] if not same_priority_users: continue # Sammle alle Schritte der Benutzer in einem Array all_steps = [] for user in same_priority_users: all_steps.extend([(user, step) for step in user.powersteps]) # Sortiere die Schritte nach Größe all_steps.sort(key=lambda x: x[1]) # Variable zur Verfolgung der bereitgestellten Energie für jeden Benutzer user_energy_prov = {user: 0 for user in same_priority_users} # Iteriere durch alle Schritte for user, powerstep in all_steps: # Überprüfe, ob noch genügend verbleibende Energie für den nächsten Schritt vorhanden ist if remaining_power >= powerstep - user_energy_prov[user]: # Aktualisiere die verbleibende Energie und die bereitgestellte Energie für den Benutzer remaining_power -= (powerstep - user_energy_prov[user]) user_energy_prov[user] = powerstep # Verteile die bereitgestellte Energie auf die Benutzer for user in same_priority_users: user.use_energy(user_energy_prov[user]) print("Final state after distributing power:") for user in energy_users: print(f"{user.ID}: {user.used_energy}")