from otree.api import * import random import operator doc = """ Simulateur de stratégies pour le choix des m meilleurs profils parmi n (m valeur_maximum: # Mise à jour de la valeur maximum valeur_maximum = valeur_pourcentage # Mise à jour de la clé correspondant à la valeur maximum meilleure_strat = key classement_strat = {} # créer un dictionnaire contenant la clé et son pourcentage for key, strat in dict_resultats.items(): classement_strat[key] = strat["pourcentage"] # trier le dictionnaire par ordre décroissant de pourcentage # classement_strat.sort(key=lambda x: x[1], reverse=True) return dict_resultats, meilleure_strat, classement_strat @staticmethod def meilleure_strat(cvtheque: int, nb_skills: int, score_max_skill: int, tours: int, nb_profils: int, niveaux: int, cut: int): archives = [] for i in range(tours): profils = C.dict_profils(cvtheque=cvtheque, nb_skills=nb_skills, score_max_skill=score_max_skill) issue = C.verif_strat(nb_profils=nb_profils, profils=profils, niveaux=niveaux, cut=cut) archives.append(issue) compteur_bests = 0 compteur_worsts = 0 compteur_middles = 0 compteur_randoms = 0 pourcent_bests = 0 pourcent_worsts = 0 pourcent_middles = 0 pourcent_randoms = 0 for essai in archives: if essai[1] == "bests": compteur_bests += 1 elif essai[1] == "worsts": compteur_worsts += 1 elif essai[1] == "middles": compteur_middles += 1 elif essai[1] == "randoms": compteur_randoms += 1 strategies = essai[2] pourcent_bests += strategies["bests"] pourcent_worsts += strategies["worsts"] pourcent_middles += strategies["middles"] pourcent_randoms += strategies["randoms"] diviseur = compteur_bests + compteur_worsts + compteur_middles + compteur_randoms compteur_bests = compteur_bests / diviseur * 100 compteur_worsts = compteur_worsts / diviseur * 100 compteur_middles = compteur_middles / diviseur * 100 compteur_randoms = compteur_randoms / diviseur * 100 pourcent_bests /= len(archives) pourcent_worsts /= len(archives) pourcent_middles /= len(archives) pourcent_randoms /= len(archives) classement = { "bests": {"choix": pourcent_bests, "strategie": compteur_bests}, "worsts": {"choix": pourcent_worsts, "strategie": compteur_worsts}, "middles": {"choix": pourcent_middles, "strategie": compteur_middles}, "randoms": {"choix": pourcent_randoms, "strategie": compteur_randoms}, } return classement class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): cvtheque = models.IntegerField( choices=[i for i in range(1, 101)], label="Nombre total de profil à consulter (0 à 100): " ) nombre_competences = models.IntegerField( choices=[i for i in range(1, 6)], label="Nombre total de compétences dans le profil (1 à 5): " ) score_max_competence = models.IntegerField( choices=[i for i in range(2, 11)], label="Score maximum que peut avoir une compétence (2 à 10): " ) competences_vues = models.IntegerField( choices=[i for i in range(1, 6)], label="Nombre de compétences qui seront vues au total (doit être inférieur ou égal au nombre de compétences) : " ) short_list = models.IntegerField( choices=[i for i in range(1, 100)], label="Taille de la shortlist à fournir à la fin (doit être inférieur au nombre de profils): " ) cut = models.IntegerField( choices=[i for i in range(1, 11)], label="Nombre de profils qui ne pourront pas être vus au prochain tour (augmente de la même valeur à chaque " "tour): " ) simulations = models.IntegerField( choices=[i for i in range(10, 1001, 10)], label="Nombre de simulations à faire (10 à 1 000): " ) choix_best = models.FloatField() freq_best = models.FloatField() choix_worst = models.FloatField() freq_worst = models.FloatField() choix_middle = models.FloatField() freq_middle = models.FloatField() choix_random = models.FloatField() freq_random = models.FloatField() # PAGES class MyPage(Page): form_model = 'player' form_fields = [ 'cvtheque', 'short_list', 'cut', 'nombre_competences', 'competences_vues', 'score_max_competence', 'simulations' ] @staticmethod def error_message(player, values): print('values is', values) message = '' if values['competences_vues'] > values['nombre_competences']: message += 'Le nombre de compétences vues doit être inférieur ou égal au nombre total de compétences. \n' if values['short_list'] >= values['cvtheque']: message += 'Le nombre de candidats retenus doit être inférieur au nombre total de candidats. \n' if values['cut'] * values['competences_vues'] > values['cvtheque']: message += 'Le nombre de profils non visibles à chaque tour est trop élévé par rapport au nombre de compétences qui seront vues. \n' return message @staticmethod def before_next_page(player: Player, timeout_happened): resultat = C.meilleure_strat(cvtheque=player.cvtheque, nb_skills=player.nombre_competences, score_max_skill=player.score_max_competence, niveaux=player.competences_vues, nb_profils=player.short_list, cut=player.cut, tours=player.simulations) player.choix_best = resultat["bests"]["choix"] player.freq_best = resultat["bests"]["strategie"] player.choix_worst = resultat["worsts"]["choix"] player.freq_worst = resultat["worsts"]["strategie"] player.choix_middle = resultat["middles"]["choix"] player.freq_middle = resultat["middles"]["strategie"] player.choix_random = resultat["randoms"]["choix"] player.freq_random = resultat["randoms"]["strategie"] """player.choix_best = choix_best player.freq_best = freq_best player.choix_worst = choix_worst player.freq_worst = freq_worst player.choix_middle = choix_middle player.freq_middle = freq_middle player.choix_random = choix_random player.freq_random = freq_random""" class Results(Page): def vars_for_template(player: Player): choix_best = player.choix_best freq_best = player.freq_best choix_worst = player.choix_worst freq_worst = player.freq_worst choix_middle = player.choix_middle freq_middle = player.freq_middle choix_random = player.choix_random freq_random = player.freq_random nb_profils = player.cvtheque nb_competences = player.nombre_competences score_max = player.score_max_competence competences_vues = player.competences_vues short_list = player.short_list cut = player.cut simulations = player.simulations return dict( choix_best=choix_best, freq_best=freq_best, choix_worst=choix_worst, freq_worst=freq_worst, choix_middle=choix_middle, freq_middle=freq_middle, choix_random=choix_random, freq_random=freq_random, nb_profils=nb_profils, nb_competences=nb_competences, score_max=score_max, competences_vues=competences_vues, short_list=short_list, cut=cut, simulations=simulations ) page_sequence = [MyPage, Results]