Tester un glouton contre la force brute
Exercice · informatique (tronc commun des prépas scientifiques), chapitre 7 — Algorithmes gloutons
Énoncé
Écrire un script Python comparant les résultats de l'algorithme glouton de sélection d'activités avec la recherche exhaustive (force brute) afin de mesurer l'efficacité d'un critère erroné tel que "la plus courte d'abord".
Corrigé
import random
def sous_listes(t: list) -> list:
if t == []:
return [[]]
sans = sous_listes(t[1:])
avec = [[t[0]] + s for s in sans]
return sans + avec
def compatibles(sel: list) -> bool:
s = sorted(sel)
return all(s[i][1] <= s[i + 1][0] for i in range(len(s) - 1))
def optimum_brut(activites: list) -> int:
meilleur = 0
for sous in sous_listes(activites):
if compatibles(sous):
meilleur = max(meilleur, len(sous))
return meilleur
def plus_courte_d_abord(activites: list) -> list:
tri = sorted(activites, key=lambda a: a[1] - a[0])
choisies = []
for (d, f) in tri:
if all(f <= d2 or f2 <= d for (d2, f2) in choisies):
choisies.append((d, f))
return choisies
random.seed(7)
echecs, ecart_total, essais = 0, 0, 2000
for _ in range(essais):
acts = []
for _ in range(random.randint(1, 8)):
d = random.randint(0, 20)
acts.append((d, d + random.randint(1, 6)))
opt = optimum_brut(acts)
courte = len(plus_courte_d_abord(acts))
if courte < opt:
echecs += 1
ecart_total += opt - courte
print(f"Taux d'échec : {echecs / essais:.2%}")
print(f"Écart moyen en cas d'échec : {ecart_total / max(echecs, 1):.2f}")
Sur 2000 essais avec des listes d'activités aléatoires de petite taille, le critère "la plus courte d'abord" présente un taux d'échec significatif (environ 6 % d'échecs) avec un écart typique d'une activité par rapport à la solution exacte, confirmant expérimentalement l'inexactitude de cette approche heuristique.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.