54 lines
2.3 KiB
Python
54 lines
2.3 KiB
Python
|
|
|
|
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}")
|
|
|
|
|