corrigés du mastermind hors publication, liens vers les fichiers utiles

This commit is contained in:
2026-09-11 10:41:55 +02:00
parent df87229b88
commit 348877eb6c
9 changed files with 108 additions and 108 deletions
+1 -1
View File
@@ -23,7 +23,7 @@ Chaque projet est découpé en phases dans son fichier `JALONS.md`, sur une **pr
| [Le Jeu de la Vie](jeu_de_la_vie/) | L'automate cellulaire de Conway : quatre règles, et des structures qui émergent | Grilles 2D, fonctions pures, POO | non |
| [Labyrinthe](labyrinthe/) | Générer un labyrinthe parfait, puis le résoudre automatiquement | Graphes, arbres couvrants, DFS et BFS, récursivité | oui, `src/maze.py` |
| [Wa-Tor](wator/) | Simuler un monde torique où des requins chassent des thons | Grilles 2D, simulation, POO | non |
| [Mastermind et algorithmes génétiques](mastermind/) | Faire évoluer une population de combinaisons jusqu'à trouver le code secret | POO, paradigme fonctionnel, optimisation | oui, `src/algo_gen.py` et `src/combinaison.py` |
| [Mastermind et algorithmes génétiques](mastermind/) | Faire évoluer une population de combinaisons jusqu'à trouver le code secret | POO, paradigme fonctionnel, optimisation | oui, les deux classes abstraites de `src/` |
Le Jeu de la Vie et le Labyrinthe sont les deux plus accessibles pour démarrer. Le Labyrinthe est celui qui recoupe le plus directement le programme de Terminale, entre le chapitre Graphes et le chapitre Récursivité.
+7 -7
View File
@@ -8,10 +8,9 @@ Le **Mastermind** est un jeu de déduction : un joueur choisit une combinaison s
Plutôt que de coder une IA par force brute, ce projet applique un **algorithme génétique** : on fait évoluer une population de combinaisons candidates en s'inspirant de la sélection naturelle (tournoi, croisement, mutation) jusqu'à trouver la solution.
Une base de code complète est disponible dans `../src/` :
- `algo_gen.py` - framework de l'algorithme génétique
- `combinaison.py` - représentation d'un individu (une combinaison)
- `src_mastermind_fiche.md` - fiche TP détaillée avec toutes les consignes
Vous ne partez pas de rien : deux classes abstraites vous sont fournies, `Individual_Interface`
et `Problem_Interface`. Vous en héritez, et vous écrivez les méthodes qu'elles laissent vides.
La fiche de TP et l'activité guidée vous mènent pas à pas.
## Compétences mobilisées
@@ -42,9 +41,10 @@ Une base de code complète est disponible dans `../src/` :
## Ressources
- `../src/src_mastermind_fiche.md` - fiche TP complète avec toutes les consignes
- `../src/algo_gen.py` - squelette du framework générique
- `../src/combinaison.py` - classe individu à compléter
- [Fiche de TP](https://florianmathieu.prof/hub-docs/nsi/terminale/Projets/src/src_mastermind_fiche/) - toutes les consignes, dans l'ordre
- [Activité guidée](https://florianmathieu.prof/hub-docs/nsi/terminale/Projets/src/Activit%C3%A9/) - le pas à pas complet, avec les explications
- [`individual_interface.py`](https://florianmathieu.prof/hub-docs/nsi/terminale/Projets/src/individual_interface/individual_interface.py) - classe abstraite d'un individu, à hériter
- [`problem_interface.py`](https://florianmathieu.prof/hub-docs/nsi/terminale/Projets/src/problem_interface/problem_interface.py) - classe abstraite d'un problème, à hériter
- [Algorithme génétique - Wikipedia](https://fr.wikipedia.org/wiki/Algorithme_génétique)
- [Mastermind - Wikipedia](https://fr.wikipedia.org/wiki/Mastermind)
@@ -1,4 +1,4 @@
from problem_sup import *
from _problem_sup import *
BEST_KEPT = 5
@@ -1,84 +1,84 @@
from problem_interface import *
from combinaison import *
class Problem_5(Problem_Interface) :
"""
classe probleme n°5 : Combinaison Coffre-Fort
"""
def __init__(self, calcul):
self.__size = len(calcul)
self.__combinaison = calcul
def create_individual(self):
'''
create a randomly generated indidivual for this problem
:return: a randomly generated individual gfor this problem
:rtype: an Individual object
'''
return Combinaison(self.__size)
def evaluate_fitness(self, individual):
'''
compute the fitness of individual for this problem
:param individual: the individual to consider
:type individual: an Individual object
:return: the fitness of individual for this problem
:rtype: an Individual object
'''
return sum([1 if calcul[chiffre]==self.__combinaison[chiffre] else 0 for chiffre in range(len(calcul))])
def sort_population(self, population):
'''
sort population from best fitted to worst fitted individuals.
Depending on the problem, it can correspond to ascending or descending order with respect to the fitness function.
side effect : population is modified by this method
:param population: the list of individuals to sort
:type population: list(Individual)
'''
population.sort(key = lambda x: x.get_score())
def best_individual(self, population):
'''
return the best fitted individual from population.
Depending on the problem, it can correspond to the individual with the highest or the lowest fitness value.
:param population: the list of individuals to sort
:type population: list(Individual)
:return: the best fitted individual of population
:rtype: an Individual object
'''
self.sort_population(population)
return population[len(population) -1 ]
def tournament(self, first, second):
'''
perform a rounament between two individuals, the winner is the most fitted one, it is returned
:param first: an individual
:type first: an Individual object
:param second: an individual
:type second: an Individual object
:return: the winner of the tournament
:rtype: Individual object
'''
if first.get_score() < second.get_score():
res = first
else:
res = second
return res
from problem_interface import *
from _combinaison import *
class Problem_5(Problem_Interface) :
"""
classe probleme n°5 : Combinaison Coffre-Fort
"""
def __init__(self, calcul):
self.__size = len(calcul)
self.__combinaison = calcul
def create_individual(self):
'''
create a randomly generated indidivual for this problem
:return: a randomly generated individual gfor this problem
:rtype: an Individual object
'''
return Combinaison(self.__size)
def evaluate_fitness(self, individual):
'''
compute the fitness of individual for this problem
:param individual: the individual to consider
:type individual: an Individual object
:return: the fitness of individual for this problem
:rtype: an Individual object
'''
return sum([1 if calcul[chiffre]==self.__combinaison[chiffre] else 0 for chiffre in range(len(calcul))])
def sort_population(self, population):
'''
sort population from best fitted to worst fitted individuals.
Depending on the problem, it can correspond to ascending or descending order with respect to the fitness function.
side effect : population is modified by this method
:param population: the list of individuals to sort
:type population: list(Individual)
'''
population.sort(key = lambda x: x.get_score())
def best_individual(self, population):
'''
return the best fitted individual from population.
Depending on the problem, it can correspond to the individual with the highest or the lowest fitness value.
:param population: the list of individuals to sort
:type population: list(Individual)
:return: the best fitted individual of population
:rtype: an Individual object
'''
self.sort_population(population)
return population[len(population) -1 ]
def tournament(self, first, second):
'''
perform a rounament between two individuals, the winner is the most fitted one, it is returned
:param first: an individual
:type first: an Individual object
:param second: an individual
:type second: an Individual object
:return: the winner of the tournament
:rtype: Individual object
'''
if first.get_score() < second.get_score():
res = first
else:
res = second
return res
+15 -15
View File
@@ -1,16 +1,16 @@
from algo_gen import *
from problem_4 import *
if __name__=="__main__":
p = Problem_4([
['Lille', 15, 15],
['Tourcoing', 10, 20],
['Paris', 5, 20],
['Alsace', 5, 30],
['Londre', 30, 15],
['Strasburg', 30, 30],
['Moskou', 5, 5],
['San Francisco', 10, 15]
])
a = AlgoGen(p, 1000, 0, 0.1)
from _algo_gen import *
from _problem_4 import *
if __name__=="__main__":
p = Problem_4([
['Lille', 15, 15],
['Tourcoing', 10, 20],
['Paris', 5, 20],
['Alsace', 5, 30],
['Londre', 30, 15],
['Strasburg', 30, 30],
['Moskou', 5, 5],
['San Francisco', 10, 15]
])
a = AlgoGen(p, 1000, 0, 0.1)
a.solve(20)