-
Notifications
You must be signed in to change notification settings - Fork 0
/
neighborhood.py
64 lines (47 loc) · 2.17 KB
/
neighborhood.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from typing import List
from base import BasePlayer
from vector import PearlVector
class Neighborhood(BasePlayer):
def __init__(self, name: str, characteristics: PearlVector) -> None:
super().__init__(name=name, vector=characteristics)
self.capacity = 0
self.characteristics = characteristics
def _unmatch(self, other):
self.matching = [b for b in self.matching if b != other]
def prefers(self, buyer: BasePlayer, other: BasePlayer):
"""Determines whether the Neighborhood is a better fit for one buyer or another"""
buyer_fit = buyer.get_fitness(self)
other_fit = other.get_fitness(self)
return buyer_fit > other_fit
def get_favorite(self):
"""Get the neighborhood's favourite buyer outside their matching.
If no such buyer exists, return ``None``.
"""
for player in self.prefs:
if player not in self.matching:
return player
return None
def get_worst_match(self):
return self.matching[-1]
def get_successors(self):
"""Get the successors to the neighborhoods's worst current match."""
worst_match = self.get_worst_match()
if worst_match in self.prefs:
idx = self.prefs.index(self.get_worst_match())
return self.prefs[idx + 1 :]
else:
return self.prefs
def _match(self, other: BasePlayer):
"""Make a match between this Neighborhood and some player.
This needs to add a player to the current prefs list, but put that list in order by fitness."""
if other in self.matching:
return self.matching
self.matching.append(other)
self.matching.sort(key=lambda player: player.get_fitness(self), reverse=True)
def set_prefs(self, buyers: List[BasePlayer]):
"""Set the neighborhood's preferences to be a list of buyers."""
self.prefs = buyers
self.prefs.sort(key=lambda buyer: self.get_fitness(buyer), reverse=True)
self._pref_names = [player.name for player in self.prefs]
if self._original_prefs is None:
self._original_prefs = self.prefs[:]