IMA3/IMA4 2021/2023 P13 : Différence entre versions
(→Séances du 28 Octobre, 18 Novembre et 21 Novembre) |
(→Gestion de projet) |
||
(5 révisions intermédiaires par un autre utilisateur non affichées) | |||
Ligne 40 : | Ligne 40 : | ||
='''Gestion de projet'''= | ='''Gestion de projet'''= | ||
− | Séances du 10 et 18 Octobre | + | '''Séances du 10 et 18 Octobre''' |
Point sur le projet, récapitulatif de ce qui a été fait au S6 et discussion sur les contours du projet pour le S7. | Point sur le projet, récapitulatif de ce qui a été fait au S6 et discussion sur les contours du projet pour le S7. | ||
Ligne 48 : | Ligne 48 : | ||
Nous avons pensé à PHP, au langage Python et C pour gérer la partie intelligence artificielle de notre projet. | Nous avons pensé à PHP, au langage Python et C pour gérer la partie intelligence artificielle de notre projet. | ||
− | ''Séances du 28 Octobre, 18 Novembre et 21 Novembre'' | + | '''Séances du 28 Octobre, 18 Novembre et 21 Novembre''' |
Décision de se concentrer sur une promotion pour la réalisation du prototype. | Décision de se concentrer sur une promotion pour la réalisation du prototype. | ||
Ligne 54 : | Ligne 54 : | ||
Décision d'utiliser Excel pour la base de données ;apprentissage sur le langage VBA | Décision d'utiliser Excel pour la base de données ;apprentissage sur le langage VBA | ||
− | + | '''Séances du 25 Novembre et 28 Novembre''' | |
− | Design interface web professeur à l'aide de Google App Script. Recherches sur la possibilité de recueillir des données simultanément à partir de Google agenda. | + | Design interface web professeur à l'aide de Google App Script. Recherches sur la possibilité de recueillir des données simultanément à partir de Google agenda. |
− | + | '''08 décembre, 15 décembre''' | |
Recherches sur les possibilités de recueillir les disponibilités des professeurs. | Recherches sur les possibilités de recueillir les disponibilités des professeurs. | ||
Début de recherche sur google colab et machine learning afin de trouver des algorithmes de satisfaction de contraintes pouvant résoudre notre problématique. | Début de recherche sur google colab et machine learning afin de trouver des algorithmes de satisfaction de contraintes pouvant résoudre notre problématique. | ||
+ | |||
+ | *** proposition Code 15/02/2023 ***** | ||
+ | |||
+ | import random | ||
+ | |||
+ | # Définition de la classe de l'emploi du temps | ||
+ | class Timetable: | ||
+ | def __init__(self, n_teachers, n_slots, n_subjects): | ||
+ | self.n_teachers = n_teachers | ||
+ | self.n_slots = n_slots | ||
+ | self.n_subjects = n_subjects | ||
+ | self.slots = [[] for _ in range(self.n_slots)] | ||
+ | |||
+ | def add_lesson(self, teacher_id, subject_id, slot_id): | ||
+ | self.slots[slot_id].append((teacher_id, subject_id)) | ||
+ | |||
+ | def fitness(self): | ||
+ | # Fonction d'évaluation de la qualité de l'emploi du temps | ||
+ | score = 0 | ||
+ | for i in range(self.n_slots): | ||
+ | slot = self.slots[i] | ||
+ | for j in range(self.n_teachers): | ||
+ | count = sum(1 for t, s in slot if t == j) | ||
+ | if count > 1: | ||
+ | score -= count | ||
+ | return score | ||
+ | |||
+ | # Définition de la classe de l'algorithme génétique | ||
+ | class GeneticAlgorithm: | ||
+ | def __init__(self, population_size, mutation_rate, n_generations, n_teachers, n_slots, n_subjects): | ||
+ | self.population_size = population_size | ||
+ | self.mutation_rate = mutation_rate | ||
+ | self.n_generations = n_generations | ||
+ | self.n_teachers = n_teachers | ||
+ | self.n_slots = n_slots | ||
+ | self.n_subjects = n_subjects | ||
+ | |||
+ | def run(self): | ||
+ | # Initialisation de la population | ||
+ | population = [Timetable(self.n_teachers, self.n_slots, self.n_subjects) for _ in range(self.population_size)] | ||
+ | for timetable in population: | ||
+ | for i in range(self.n_slots): | ||
+ | for j in range(self.n_subjects): | ||
+ | teacher_id = random.randint(0, self.n_teachers - 1) | ||
+ | timetable.add_lesson(teacher_id, j, i) | ||
+ | |||
+ | # Évolution de la population | ||
+ | for i in range(self.n_generations): | ||
+ | print(f"Génération {i}") | ||
+ | population = self.evolve(population) | ||
+ | best_timetable = max(population, key=lambda x: x.fitness()) | ||
+ | print(f"Score : {best_timetable.fitness()}") | ||
+ | print(best_timetable.slots) | ||
+ | |||
+ | def evolve(self, population): | ||
+ | # Sélection des parents | ||
+ | parents = random.sample(population, k=int(self.population_size * 0.5)) | ||
+ | parents = sorted(parents, key=lambda x: x.fitness(), reverse=True) | ||
+ | |||
+ | # Croisement des parents | ||
+ | children = [] | ||
+ | for i in range(self.population_size): | ||
+ | parent1 = random.choice(parents) | ||
+ | parent2 = random.choice(parents) | ||
+ | child = Timetable(self.n_teachers, self.n_slots, self.n_subjects) | ||
+ | for j in range(self.n_slots): | ||
+ | for k in range(self.n_subjects): | ||
+ | if random.random() < 0.5: | ||
+ | teacher_id = parent1.slots[j][k][0] | ||
+ | else: | ||
+ | teacher_id = parent2.slots[j][k][0] | ||
+ | child.add_lesson(teacher_id, k, j) | ||
+ | |||
+ | # Mutation | ||
+ | if random.random() < self.mutation_rate: | ||
+ | slot |
Version actuelle datée du 15 février 2023 à 16:33
Sommaire
Résumé
Maklendar est une plateforme de gestion d'emploi du temps. Elle vise particulièrement à palier les difficultés que les responsables de semestre rencontrent lors de la mise en place du planning des cours d'un semestre. L'objectif est de recueillir toutes les disponibilités des professeurs durant le semestre, de les mixer avec les salles disponibles et le volume horaire des cours grâce à un algorithme de satisfaction de contraintes.
Présentation générale
Lors de la réalisation d'emploi de temps des spécialités, la question de gestion s'impose lorsqu'il s'agit de concilier disponibilités des professeurs avec celles du calendrier tout en respectant les contraintes relatives au type de salles disponibles ainsi que leur capacité d'accueil et les types de cours dispensés. Ceci, en devant gérer au cas par cas, les conditions qui conviennent au mieux pour chaque professeur. Ce travail peut à la fin, se révéler fastidieux. Et jusqu'à maintenant, il se fait manuellement par les responsables de semestre.
Contexte
Maklendar vient tenter de répondre à un besoin de Polytech'Lille. En effet, lors de l'élaboration des emplois du temps, plusieurs paramètres rentrent en jeu à savoir disponibilités des professeurs, volumes horaires et type de cours à dispenser, nombre de salles disponibles... Ainsi, les professeurs et les différents responsables de spécialité s'échangent des mails interminables afin d'arriver à un emploi du temps qui convient aux enseignants et qui respecte la maquette pédagogique. Ce qui est non seulement fastidieux mais s'avère aussi chronophage. Certains responsables de semestre se trouvent des fois en train d'élaborer des emploi du temps même périodes de repos.
Dans le cadre de notre travail, nous avons décidé dans un premier temps de nous limiter à la maquette des SE2A semestre 7.
Objectif
Notre but est clair, générer les emplois du temps de manière automatique par une plateforme . Derrière celle-ci va tourner un algorithme qui prendra en compte les contraintes précitées. Une des interfaces de Maklendar permettra à chaque enseignant de renseigner ses disponibilités. Ensuite, grâce à l'algorithme de satisfaction et de contrainte, un emploi de temps en conformité avec toutes les informations des professeurs renseignées sera généré. Elle se chargera également de gérer les conflits engendrés par la coïncidence des disponibilités et des salles. D'éventuelles modifications pourront être apporté par le responsable de semestre ensuite.
Description
Réalisations et résultats
Après avoir examiné les contours de notre projet et le plan d'actions pour la réalisation d'un prototype pour le semestre S7, nous avons décidé de scinder notre travail en deux grandes parties. La première partie consistait en la réalisation des interfaces web et en le recueil des données dans une base. Pour ce faire, nous avons opté pour Google App Script , plateforme de programmation intégrée à Google . Grâce à cette dernière, l'on peut écrire des scripts dans les services applications de Google. Ce choix a d'ailleurs d'autant plus motivé par le fait que Maklendar est une application qui sera mis en service en ligne sur le serveur de Google. Par ailleurs, il nous semblait plus simple de l'utiliser pour modifier le comportement des données du tableur Google Sheet et pour travailler en équipe. Enfin, il est possible de pouvoir importer Materialize mis à disposition par google pour le design d'interface .
En pratique, nous avons implémenté la base de données recensant les informations de la promotion et des enseignants et réalisé l'interface permettant aux professeurs de renseigner leurs disponibilités. Seulement, nous n'avons pas encore trouvé une solution quand au recueil de ces disponibilités en temps réel dans la base de données de Google Sheet prévue à cet effet.
La seconde partie consistait en le traitement des données . Ici, il s'agissait grâce à un algorithme de satisfaction et de contraintes de générer grâce aux données préalablement renseignés par les enseignants un emploi du temps en conformité avec le cahier de charges. Toutefois nous n'avons pas encore trouvé un algorithme satisfaisant se rapprochant de notre cas. Nous continuons les recherches pour en trouver une.
Bilan
Tout au long de ce semestre, nous avons eu à réaliser un prototype réel afin de démontrer la faisabilité du projet . Ce qui ne s'est pas avéré aisé vu la difficulté des tâches croissantes auxquelles nous avons été confrontés. Toutefois, nous avons pu élargir nos connaissances sur le monde algorithmique et sur les bases de données semestre . Nous avons également mieux saisi les contours de notre projet ainsi ses différents aspects et continuons de travailler afin de pouvoir contourner les différents problèmes rencontrés et produire un résultat satisfaisant.
Gestion de projet
Séances du 10 et 18 Octobre
Point sur le projet, récapitulatif de ce qui a été fait au S6 et discussion sur les contours du projet pour le S7. Nous avons défini l'architecture et les technologies à employer pour réaliser le prototype réel de Maklendar .Nous avons opté pour MySQL en ce qui concernait la base de données chargée de stocker les données des utilisateurs. Nous avons pensé à élaborer 3 interfaces à savoir une pour les professeurs, une pour l'administrateur et un autre pour l'étudiant. La première interface servirait à renseigner pour les professeurs leurs informations et disponibilités. La deuxième interface permettrait à l'administrateur de voir l'emploi du temps généré en temps réel avec les disponibilités des différents professeurs. La troisième permettrait aux étudiants de visualiser la version finale de l'emploi du temps mis à leur disposition par l'enseignant administrateur. En ce qui concerne le design des interfaces web, nous avons opté pour les framework Laravel, Boostrap, Materialize. Nous avons pensé à PHP, au langage Python et C pour gérer la partie intelligence artificielle de notre projet.
Séances du 28 Octobre, 18 Novembre et 21 Novembre
Décision de se concentrer sur une promotion pour la réalisation du prototype. Édition de la base de données contenant les informations sur la promotion et les enseignants à savoir leur nom, prénom et le type de cours dispensés . Décision d'utiliser Excel pour la base de données ;apprentissage sur le langage VBA
Séances du 25 Novembre et 28 Novembre
Design interface web professeur à l'aide de Google App Script. Recherches sur la possibilité de recueillir des données simultanément à partir de Google agenda.
08 décembre, 15 décembre
Recherches sur les possibilités de recueillir les disponibilités des professeurs. Début de recherche sur google colab et machine learning afin de trouver des algorithmes de satisfaction de contraintes pouvant résoudre notre problématique.
- proposition Code 15/02/2023 *****
import random
- Définition de la classe de l'emploi du temps
class Timetable:
def __init__(self, n_teachers, n_slots, n_subjects): self.n_teachers = n_teachers self.n_slots = n_slots self.n_subjects = n_subjects self.slots = [[] for _ in range(self.n_slots)]
def add_lesson(self, teacher_id, subject_id, slot_id): self.slots[slot_id].append((teacher_id, subject_id))
def fitness(self): # Fonction d'évaluation de la qualité de l'emploi du temps score = 0 for i in range(self.n_slots): slot = self.slots[i] for j in range(self.n_teachers): count = sum(1 for t, s in slot if t == j) if count > 1: score -= count return score
- Définition de la classe de l'algorithme génétique
class GeneticAlgorithm:
def __init__(self, population_size, mutation_rate, n_generations, n_teachers, n_slots, n_subjects): self.population_size = population_size self.mutation_rate = mutation_rate self.n_generations = n_generations self.n_teachers = n_teachers self.n_slots = n_slots self.n_subjects = n_subjects
def run(self): # Initialisation de la population population = [Timetable(self.n_teachers, self.n_slots, self.n_subjects) for _ in range(self.population_size)] for timetable in population: for i in range(self.n_slots): for j in range(self.n_subjects): teacher_id = random.randint(0, self.n_teachers - 1) timetable.add_lesson(teacher_id, j, i)
# Évolution de la population for i in range(self.n_generations): print(f"Génération {i}") population = self.evolve(population) best_timetable = max(population, key=lambda x: x.fitness()) print(f"Score : {best_timetable.fitness()}") print(best_timetable.slots)
def evolve(self, population): # Sélection des parents parents = random.sample(population, k=int(self.population_size * 0.5)) parents = sorted(parents, key=lambda x: x.fitness(), reverse=True)
# Croisement des parents children = [] for i in range(self.population_size): parent1 = random.choice(parents) parent2 = random.choice(parents) child = Timetable(self.n_teachers, self.n_slots, self.n_subjects) for j in range(self.n_slots): for k in range(self.n_subjects): if random.random() < 0.5: teacher_id = parent1.slots[j][k][0] else: teacher_id = parent2.slots[j][k][0] child.add_lesson(teacher_id, k, j)
# Mutation if random.random() < self.mutation_rate: slot