@dataclass
class Team:
"""Representation d'une equipe de football."""
id: int
name: str
city: str
latitude: float
longitude: float
stadium_capacity: int
tv_attractiveness: float # 0-1, influence TV
def __hash__(self):
return self.id
def __eq__(self, other):
return self.id == other.id
@dataclass
class SportsLeague:
"""Ligue sportive avec equipes et contraintes."""
name: str
teams: List[Team]
rounds: int
def __post_init__(self):
self.n_teams = len(self.teams)
# En round-robin simple: n_teams - 1 rondes
if self.rounds is None:
self.rounds = self.n_teams - 1
def distance(self, team1: Team, team2: Team) -> float:
"""Calcule la distance en km entre deux villes (approximation)."""
# Formule haversine simplifiee
lat1, lon1 = team1.latitude, team1.longitude
lat2, lon2 = team2.latitude, team2.longitude
R = 6371 # Rayon terre en km
phi1, phi2 = np.radians([lat1, lat2])
delta_phi = np.radians(lat2 - lat1)
delta_lambda = np.radians(lon2 - lon1)
a = np.sin(delta_phi/2)**2 + np.cos(phi1) * np.cos(phi2) * np.sin(delta_lambda/2)**2
c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))
return R * c
def create_ligue1_sample(n_teams: int = 8) -> SportsLeague:
"""Cree un echantillon de la Ligue 1 (simplifie)."""
# Coordonnees approximatives des villes francaises
cities = [
("Paris", 48.8566, 2.3522),
("Marseille", 43.2965, 5.3698),
("Lyon", 45.7640, 4.8357),
("Lille", 50.6292, 3.0573),
("Bordeaux", 44.8378, -0.5792),
("Nantes", 47.2184, -1.5536),
("Nice", 43.7102, 7.2620),
("Toulouse", 43.6047, 1.4442),
("Rennes", 48.1173, -1.6778),
("Strasbourg", 48.5734, 7.7521),
("Montpellier", 43.6119, 3.8772),
("Reims", 49.2583, 4.0317),
]
teams = []
for i in range(min(n_teams, len(cities))):
city_name, lat, lon = cities[i]
teams.append(Team(
id=i,
name=f"{city_name} FC",
city=city_name,
latitude=lat,
longitude=lon,
stadium_capacity=random.randint(20000, 60000),
tv_attractiveness=random.uniform(0.3, 1.0)
))
return SportsLeague(
name=f"Ligue 1 (Echantillon {n_teams} equipes)",
teams=teams,
rounds=n_teams - 1
)
# Creation de la ligue
league = create_ligue1_sample(n_teams=6)
print(f"Ligue creee: {league.name}")
print(f"Equipes: {[t.name for t in league.teams]}")
print(f"Rondes: {league.rounds}")