Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random as rd
- import copy as cp
- #ez comme dirait B2o
- Durees = {"Maths1" : 2, "Maths2" : 3, "Physique" : 3, "Anglais" : 4}
- Profs = {"Maths1" : [], "Maths2" : [], "Physique" : [], "Anglais" : []}
- Eleves = [1, 2, 3, 4, 5]
- Epreuves = ["Maths1", "Maths2", "Physique", "Anglais"]
- longueur = len(Eleves) * len(Epreuves)
- rd.seed()
- def trier(Prof):
- renvoye = []
- heures = [o[0] for o in Prof]
- heures.sort()
- for heure in heures:
- for oral in Prof:
- if oral[0] == heure:
- renvoye.append(oral)
- break
- return renvoye
- def EleveDisponible(Jurys, Eleve, Time, Duree):
- OrauxEleve = []
- for Jury in Jurys.keys():
- EDT = Jurys[Jury]
- for Oral in EDT:
- if Oral[1] == Eleve:
- OrauxEleve.append((Oral[0], Oral[0] + Durees[Jury]))
- for Oral in OrauxEleve:
- DebutOral, FinOral = Oral[0], Oral[1]
- if Time == DebutOral:
- return False
- if Time < DebutOral:
- if Time + Duree + 2 > DebutOral:
- return False
- else:
- if FinOral + 2 > Time:
- return False
- return True
- def fit(Chromosome, afficher):
- Jurys = cp.deepcopy(Profs)
- for Oral in Chromosome:
- Prof = Oral.split("/")[0]
- Eleve = Oral.split("/")[1]
- Pose = False
- if len(Jurys[Prof]) == 0:
- time = 0
- while EleveDisponible(Jurys, Eleve, time, Durees[Prof]) == False:
- time += 1
- Jurys[Prof].append((time, Eleve))
- Pose = True
- else:
- for i in range(len(Jurys[Prof]) - 1):
- if abs(Jurys[Prof][i+1][0] - Jurys[Prof][i][0]) >= 2*Durees[Prof]:
- time = (Jurys[Prof][i][0] + Durees[Prof])
- while time + Durees[Prof] + 2 <= Jurys[Prof][i+1][0] and EleveDisponible(Jurys, Eleve, time, Durees[Prof]) == False:
- time += 1
- if time + Durees[Prof] + 2 <= Jurys[Prof][i+1][0]:
- Jurys[Prof].append((time, Eleve))
- Pose = True
- else:
- Pose = False
- if Pose == False:
- temp = (max([x[0] for x in Jurys[Prof]]))
- time = temp + Durees[Prof]
- while EleveDisponible(Jurys, Eleve, time, Durees[Prof]) == False:
- time += 1
- Jurys[Prof].append((time,Eleve))
- trier(Jurys[Prof])
- #On a généré l'emploi du temps. C'est très bien. Maintenant on va trouver à quelle heure il finit (et en plus c'est facile que de compter le nombre de trous)
- if afficher:
- print(Jurys)
- maxi = -1
- for Prof in Jurys.keys():
- for Oral in Jurys[Prof]:
- maxi = max(maxi, Oral[0])
- return maxi
- Chromosomes = []
- fitness = []
- for j in range(0, 10000):
- Chromosomes.append([])
- for i in range(longueur):
- indice = str(Epreuves[rd.randint(0, len(Epreuves) - 1)]) + "/" + str(Eleves[rd.randint(0, len(Eleves) - 1)])
- while indice in Chromosomes[j]:
- indice = str(Epreuves[rd.randint(0, len(Epreuves) - 1)]) + "/" + str(Eleves[rd.randint(0, len(Eleves) - 1)])
- Chromosomes[j].append(indice)
- #Génération de l'EDT lié à un chromosome
- for Chromosome in Chromosomes:
- fitness.append(fit(Chromosome, False))
- indice = fitness.index(min(fitness))
- print(fit(Chromosomes[indice], True))
Advertisement
Add Comment
Please, Sign In to add comment