# --- Probleme de recherche sur un graphe (villes et routes) ---
class GraphProblem(Problem):
"""Probleme de cheminement sur un graphe pondere."""
def __init__(self, initial, goal, graph):
"""
Args:
initial: noeud de depart
goal: noeud d'arrivee
graph: dict de dict {noeud: {voisin: distance, ...}, ...}
"""
super().__init__(initial, goal)
self.graph = graph
def actions(self, state):
return list(self.graph.get(state, {}).keys())
def result(self, state, action):
return action
def step_cost(self, state, action, next_state):
return self.graph[state].get(next_state, float('inf'))
# --- Carte des villes francaises (graphe pondere) ---
france_graph = {
'Paris': {'Lyon': 465, 'Lille': 225, 'Strasbourg': 490, 'Nantes': 385, 'Bordeaux': 585},
'Lyon': {'Paris': 465, 'Marseille': 315, 'Grenoble': 110, 'Strasbourg': 490},
'Marseille': {'Lyon': 315, 'Toulouse': 405, 'Nice': 200, 'Montpellier': 170},
'Toulouse': {'Marseille': 405, 'Bordeaux': 245, 'Montpellier': 245},
'Bordeaux': {'Paris': 585, 'Toulouse': 245, 'Nantes': 340},
'Nantes': {'Paris': 385, 'Bordeaux': 340, 'Rennes': 110},
'Rennes': {'Nantes': 110, 'Lille': 600},
'Lille': {'Paris': 225, 'Rennes': 600, 'Strasbourg': 530},
'Strasbourg': {'Paris': 490, 'Lyon': 490, 'Lille': 530},
'Nice': {'Marseille': 200, 'Grenoble': 330},
'Grenoble': {'Lyon': 110, 'Nice': 330},
'Montpellier': {'Marseille': 170, 'Toulouse': 245},
}
# Coordonnees approximatives pour la visualisation
france_coords = {
'Paris': (2.35, 48.86), 'Lyon': (4.83, 45.76), 'Marseille': (5.37, 43.30),
'Toulouse': (1.44, 43.60), 'Bordeaux': (-0.57, 44.84), 'Nantes': (-1.55, 47.22),
'Rennes': (-1.68, 48.11), 'Lille': (3.06, 50.63), 'Strasbourg': (7.75, 48.57),
'Nice': (7.26, 43.70), 'Grenoble': (5.72, 45.19), 'Montpellier': (3.88, 43.61),
}
print("Graphe des villes francaises charge.")
print(f" {len(france_graph)} villes, {sum(len(v) for v in france_graph.values()) // 2} routes")
print(f" Exemple: Paris -> {list(france_graph['Paris'].keys())}")