In dit deel bouw je de eigenlijke graaf die passes tussen spelers bijhoudt en er eenvoudige analyses op uitvoert.
We gebruiken een nabijheidslijst-representatie: per zender (speler) bewaren we een lijst van uitgaande Pass
-objecten.
Een graaf bestaat uit knopen (nodes) en verbindingen (edges).
In onze toepassing is een knoop een speler en een verbinding een pass tussen twee spelers.
We gebruiken hiervoor een nabijheidslijst-representatie:
Implementeer een klasse PassGraph
waarmee je:
Je hebt uit Deel 1 en Deel 2:
Player(name: str, number: int)
Pass(sender: Player, receiver: Player, nr_of_times: int)
met:
get_weight()
→ nr_of_times
get_start()
→ sender
get_end()
→ receiver
__eq__
vergelijkt enkel op sender
en receiver
__str__
geeft "Pass from <sender> to <receiver>"
PassGraph
players
— lijst met alle spelers in de graaf.adj
— dict met als key sender-naam en als waarden een lijst van Pass
-objecten die van die sender vertrekken.add_player
met player
als argument
player
toe als er nog geen speler met dezelfde name
bestaat.player
oject bestaat in adj.has_player
met als argument speler
(object of naam).
True
als de speler (of naam) in de graaf zit.Player
-object als een str
(naam).get_player
met als argument name
Player
met deze naam, of None
als die niet bestaat.add_pass
met als argumenten sender
(Player object), receiver
(Player object) en times
(int - default = 1).
sender → receiver
bestaat, verhoog dan nr_of_times
met times
.Pass(sender, receiver, times)
en voeg je die toe aan adj
bij de correcte speler.times <= 0
, negeer of werp ValueError
get_pass
met als argumenten sender_name
(str) en receiver_name
(str) .
None
.neighbors
met als argument sender_name
(str)
total_weight
met als argument subset
een lijst van spelernamen
nr_of_times
over alle passes waarvan zender én ontvanger in subset
zitten.subset
None
is: neem alle spelers.subset
is een lijst spelernamen.methode pass_intensity(self, subset: list[str] | None = None) -> float
met als argument subset
een lijst van spelernamen
Deze methode berekent hoe sterk een groep spelers onderling met elkaar samenpasst.
De intensiteit wordt gedefinieerd als:
\(\text{pass_intensity} = \frac{\text{totaal aantal passes binnen de subset}}{\text{maximaal mogelijk aantal gerichte passes binnen de subset}}\)
nr_of_times
voor passes waarbij zowel de zender als de ontvanger binnen de subset van spelers zitten.Speciale gevallen
0.0
.Voorbeeld
top_pairs
met argument k (int, default = 5)
nr_of_times
(globaal).distribution_from
met als argument sender_name (str)
(receiver_name, count)
gesorteerd dalend op count.None
of []
terug (zoals gespecificeerd hierboven), maar gooi geen exceptie in normale query-methodes.PassGraph
.Maak het volgende testscenario