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_timesget_start() → senderget_end() → receiver__eq__ vergelijkt enkel op sender en receiver__str__ geeft "Pass from <sender> to <receiver>"PassGraphplayers — 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 playerals 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 ValueErrorget_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