Corrigé CCINP 2025 Informatique MP — Partie V (Q29 à Q38) : Jeu sur un graphe
Sujet officiel du concours CCINP, session 2025, épreuve Informatique MP. Corrigé rédigé par Ibrahim Alame.
Sujet officiel (PDF, site du concours)
Énoncé
est connexe, de pondération injective. À tour de rôle, MaxDébit (joueur max, valeur , qui commence) et MinLatence (joueur min, valeur ) choisissent une arête non attribuée. Une configuration : les sous-graphes et des arêtes prises par chacun, et le joueur au trait ; elle est finale quand toutes les arêtes sont attribuées. Une configuration finale est gagnante pour MaxDébit si , pour MinLatence si , et c'est un match nul sinon (partie IV : si n'est pas connexe, sinon le plus petit poids de son arbre couvrant de poids maximal).
Figure 5 du sujet : (a) l'île de Korße ; (b) une configuration finale (MaxDébit en tirets, MinLatence en pointillés), gagnée par MinLatence ().
Q29. Justifier que toute partie est finie.
Q30. Justifier qu'il n'y a match nul que si aucun joueur n'obtient un graphe connexe.
Q31. Montrer sur un exemple que prendre toujours l'arête restante la plus lourde n'est pas gagnant pour MaxDébit.
En Python, g.nb_sommets vaut et g.aretes est la liste des triplets , , notés . Une configuration est un couple (t, etat) : t vaut 1 ou -1 (joueur qui doit jouer) et etat[k] vaut 1, -1 ou 0 selon que a été prise par MaxDébit, par MinLatence, ou pas encore. Pour Korße :
>>> g.aretes
[(6.0, 0, 1), (2.0, 0, 2), (7.0, 0, 3), (5.0, 1, 2), (8.0, 1, 3), (3.0, 2, 3)]
et la figure 5(b) est (1, [-1, 1, -1, 1, 1, -1]). Le sujet fournit :
def configuration_initiale(g):
etat = [0] * len(g.aretes)
return (1, etat)
def tour(c):
t, etat = c
return t
Q32. Écrire finale(c).
Q33. Écrire configurations_suivantes(c) (c non finale, à ne pas modifier ; etat.copy()).
On dispose de gagnant(g, c), qui renvoie , ou pour une configuration finale, et l'on définit :
def score(g, c):
if est_finale(c):
return gagnant(g, c)
t, etat = c
score_fils = [score(g, suiv) for suiv in configurations_suivantes(c)]
if t == 1:
return max(score_fils)
else:
return min(score_fils)
Q34. À quoi correspondent les configurations de score , et ?
Q35. Depuis une configuration non finale de score , expliquer comment construire une stratégie gagnante pour MaxDébit.
def fige(c):
t, etat = c
return (t, tuple(etat))
cache = {}
def score_memo(g, c):
# On peut utiliser dans cette fonction la variable globale `cache`
...
Q36. Compléter score_memo : même résultat que score, sans recalcul.
Q37. Écrire score_minmax(g, c, p) : exploration limitée à la profondeur , puis heuristique(g, c) (à valeurs dans , pour non finale).
Q38. Montrer que MinLatence n'a jamais de stratégie gagnante (vol de stratégie).
Corrigé
Q29. Variant : le nombre d'arêtes non attribuées, entier naturel égal à au départ. Chaque coup attribue une arête qui ne l'était pas : il diminue de . Quand il est nul, la configuration est finale et la partie s'arrête. Toute partie compte donc exactement coups.
Q30. Supposons (avec un seul sommet, il n'y a aucune arête et les deux joueurs ont le même graphe : le cas est dégénéré). Pour un sous-graphe connexe, est, d'après Q28, le poids d'une arête de son arbre couvrant de poids maximal, donc d'une arête de : c'est un réel, et non .
- Si et sont tous deux connexes, leurs valeurs sont et avec arête de et arête de . Les ensembles d'arêtes des deux joueurs étant disjoints, , et l'injectivité de donne : l'un des deux gagne.
- Si un seul est connexe, sa valeur est un réel et celle de l'autre vaut : le joueur connexe gagne.
- Si aucun n'est connexe, les deux valeurs valent : match nul.
Le match nul se produit donc exactement quand aucun joueur n'obtient un graphe connexe, la connexité s'entendant sur tous les sommets de (un sommet isolé suffit à la rompre).
Q31. Sur l'île de Korße, faisons jouer à MaxDébit la stratégie gloutonne, et à MinLatence les trois arêtes issues du sommet :
- MaxDébit prend () ; MinLatence prend () ;
- MaxDébit prend () ; MinLatence prend () ;
- MaxDébit prend () ; MinLatence prend ().
MaxDébit (tirets) a le triangle et le sommet isolé : son graphe n'est pas connexe, . MinLatence (pointillés) a l'étoile de centre , arbre couvrant : . MinLatence gagne. Le résultat ne dépend même pas de l'ordre de MinLatence : les arêtes sont les trois plus lourdes, et MinLatence n'y touchant pas, la stratégie gloutonne les prend toujours. La stratégie gloutonne n'est donc pas gagnante : elle ignore la connexité, qui est le premier critère. Pourtant MaxDébit a une stratégie gagnante sur ce graphe (la fonction score de Q34 vaut sur la configuration initiale) : dans la partie ci-dessus, il lui suffisait de prendre au lieu de au dernier coup, pour obtenir l'étoile de centre () en laissant à MinLatence le triangle , qui isole .
Q32. La partie est terminée quand aucune case de etat ne vaut :
def finale(c):
t, etat = c
for x in etat:
if x == 0:
return False
return True
Coût . On peut aussi écrire return 0 not in etat. Essais : True pour la figure 5(b), False pour la configuration (-1, [-1, 0, 0, 1, 1, 0]). La fonction score du sujet l'appelle est_finale : c'est la même.
Q33. Le joueur t peut prendre chaque arête libre ; la configuration obtenue est contrôlée par l'adversaire -t :
def configurations_suivantes(c):
t, etat = c
suivantes = []
for k in range(len(etat)):
if etat[k] == 0:
suiv = etat.copy()
suiv[k] = t
suivantes.append((-t, suiv))
return suivantes
Chaque configuration suivante a sa propre liste, copie de etat modifiée en une case : c n'est jamais modifiée, et les configurations renvoyées ne se partagent pas leurs listes. Coût (au plus copies de taille ). Essai : depuis (-1, [-1, 0, 0, 1, 1, 0]), on obtient les trois configurations (1, [-1, -1, 0, 1, 1, 0]), (1, [-1, 0, -1, 1, 1, 0]), (1, [-1, 0, 0, 1, 1, -1]), et c est intacte.
100 % gratuit
La suite du corrigé est sur Adloun
Le corrigé rédigé en entier, question par question, et le tuteur pour poser des questions sur ce sujet.
Voir le corrigé complet, gratuitementInscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.