Décidez d'une mission de laboratoire avec Python (fiction)

Organisons la situation

Nom du laboratoire

#Nom du laboratoire
labs = list("ABCDEFG")
labs
['A', 'B', 'C', 'D', 'E', 'F', 'G']

Nombre minimum de missions pour chaque laboratoire

#Nombre minimum de missions pour chaque laboratoire
min_assign = [2 for x in range(len(labs))]
min_assign
[2, 2, 2, 2, 2, 2, 2]

Nombre maximum de missions pour chaque laboratoire

#Nombre maximum de missions pour chaque laboratoire
max_assign = [4 for x in range(len(labs))]
max_assign
[4, 4, 4, 4, 4, 4, 4]

Carte d'étudiant

#Carte d'étudiant
n_students = 20
students = [x + 1 for x in range(n_students)]
students
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

Classement des élèves

#Classement des élèves
import random
grades = [x + 1 for x in range(n_students)]
random.shuffle(grades)
grades
[9, 4, 13, 14, 7, 17, 5, 2, 10, 1, 19, 16, 18, 20, 3, 15, 12, 6, 8, 11]

Enquête de commande d'affectation de laboratoire

#Enquête de commande d'affectation de laboratoire
questionnaire = []
for x in range(n_students):
    hope = [x + 1 for x in range(len(labs))]
    random.shuffle(hope)
    if x > 0 and random.random() < 0.1: #Faire des gens qui ont le même ordre souhaité
        hope = questionnaire[x - 1]
    questionnaire.append(hope)
questionnaire
[[2, 7, 3, 5, 4, 6, 1],
 [2, 6, 1, 7, 3, 4, 5],
 [4, 7, 6, 5, 2, 1, 3],
 [6, 3, 2, 4, 1, 7, 5],
 [2, 5, 4, 3, 7, 1, 6],
 [3, 7, 2, 6, 5, 1, 4],
 [1, 7, 3, 2, 6, 5, 4],
 [4, 1, 7, 3, 6, 2, 5],
 [7, 6, 4, 3, 1, 2, 5],
 [5, 3, 4, 7, 1, 6, 2],
 [3, 2, 7, 4, 6, 1, 5],
 [6, 7, 5, 4, 1, 2, 3],
 [6, 7, 5, 4, 1, 2, 3],
 [2, 3, 7, 5, 1, 4, 6],
 [7, 3, 5, 1, 6, 4, 2],
 [6, 5, 7, 4, 3, 2, 1],
 [2, 3, 1, 5, 6, 4, 7],
 [4, 2, 1, 6, 7, 5, 3],
 [6, 2, 7, 4, 1, 3, 5],
 [2, 5, 4, 6, 1, 3, 7]]

Attribuer au hasard

#Attribuer au hasard
assignment = [[] for x in range(len(labs))]
rand_stu = [x for x in range(n_students)]
random.shuffle(rand_stu)
lab = 0
for stu in rand_stu:
    assignment[lab % len(labs)].append(stu)
    lab += 1
assignment
[[8, 13, 6],
 [1, 5, 17],
 [18, 16, 3],
 [9, 2, 11],
 [12, 10, 14],
 [0, 4, 15],
 [19, 7]]

Qui veut quoi à la suite d'une affectation

def resulted(assignment, questionnaire):
    return [[questionnaire[stu][i] for j, stu in enumerate(lab)] for i, lab in enumerate(assignment)]
resulted(assignment, questionnaire)
[[7, 2, 1], [6, 7, 2], [7, 1, 2], [7, 5, 4], [1, 6, 6], [6, 1, 2], [7, 5]]

L'ampleur de l'insatisfaction dans son ensemble

def fuman(assignment, questionnaire):
    ary = resulted(assignment, questionnaire)
    return sum([sum(x) - len(x) for x in ary])
fuman(assignment, questionnaire)
65

Donnez la priorité à ceux qui ont de bonnes notes (ne tenez pas compte du nombre minimum de devoirs)

#Une méthode pour décider du laboratoire souhaité avec la priorité donnée à ceux qui ont de bonnes notes (sans tenir compte du nombre minimum de tâches)
assignment = [[] for x in range(len(labs))]
for i in range(len(students)):
    stu = grades.index(i + 1) #Élève de grade i
    que = questionnaire[stu] #Classement par classe Classement souhaité par l'élève
    for j in range(len(labs)):
        lab = que.index(j + 1) #Laboratoire de l'Ordre de l'espoir j
        if len(assignment[lab]) < max_assign[lab]:
            assignment[lab].append(stu)
            break
assignment
[[6, 13],
 [7, 10],
 [1, 17, 16, 3],
 [14],
 [9, 18, 8, 19],
 [4, 2, 11, 5],
 [0, 15, 12]]

Qui veut quoi à la suite d'une affectation

resulted(assignment, questionnaire)
[[1, 2], [1, 2], [1, 1, 1, 2], [1], [1, 1, 1, 1], [1, 1, 2, 1], [1, 1, 3]]

L'ampleur de l'insatisfaction dans son ensemble

fuman(assignment, questionnaire)
6

La priorité est donnée à ceux qui ont de bonnes notes (considérez le nombre minimum de devoirs)

Remplissez d'abord le nombre minimum de missions

#Comment hiérarchiser le laboratoire souhaité parmi ceux qui ont de bonnes notes (remplissez d'abord le nombre minimum de tâches)
assignment = [[] for x in range(len(labs))]
assigned_students = []
for i in range(len(students)):
    stu = grades.index(i + 1) #Élève de grade i
    que = questionnaire[stu] #Classement par classe Classement souhaité par l'élève
    for j in range(len(labs)):
        lab = que.index(j + 1) #Laboratoire de l'Ordre de l'espoir j
        if len(assignment[lab]) < min_assign[lab]:
            assignment[lab].append(stu)
            assigned_students.append(stu)
            break
assignment
[[6, 19], [7, 16], [1, 17], [14, 3], [9, 18], [4, 8], [0, 2]]
assigned_students
[9, 7, 14, 1, 6, 17, 4, 18, 0, 8, 19, 16, 2, 3]

Attribuer des étudiants non affectés

#Comment choisir de préférence le laboratoire souhaité parmi ceux qui ont de bonnes notes (attribuer des étudiants non affectés)
for i in range(len(students)):
    stu = grades.index(i + 1) #Élève de grade i
    que = questionnaire[stu] #Classement par classe Classement souhaité par l'élève
    if stu in assigned_students:
        continue
    for j in range(len(labs)):
        lab = que.index(j + 1) #Laboratoire de l'Ordre de l'espoir j
        if len(assignment[lab]) < max_assign[lab]:
            assignment[lab].append(stu)
            assigned_students.append(stu)
            break
assignment
[[6, 19, 13],
 [7, 16],
 [1, 17],
 [14, 3],
 [9, 18, 11, 12],
 [4, 8, 5, 10],
 [0, 2, 15]]

Qui veut quoi à la suite d'une affectation

resulted(assignment, questionnaire)
[[1, 2, 2], [1, 3], [1, 1], [1, 4], [1, 1, 1, 1], [1, 2, 1, 1], [1, 3, 1]]

L'ampleur de l'insatisfaction dans son ensemble

fuman(assignment, questionnaire)
10

À vrai dire

C'est difficile car il existe divers laboratoires où la popularité est concentrée et des laboratoires qui ne sont pas du tout populaires (´ ・ ω ・ `)

Recommended Posts

Décidez d'une mission de laboratoire avec Python (fiction)
Comment lire un fichier CSV avec Python 2/3
Envoyer un message à LINE avec Python (LINE Notify)
Essayez de dessiner une courbe de vie avec python
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Étapes pour créer un bot Twitter avec Python
Essayez de créer un groupe de dièdre avec Python
Je veux écrire dans un fichier avec Python
Zubu amateur veut démarrer Python
Comment convertir / restaurer une chaîne avec [] en python
Mémo connecté à HiveServer2 d'EMR avec python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Faisons un outil de veille de commande avec python
Je veux travailler avec un robot en python.
De l'achat d'un ordinateur à l'exécution d'un programme sur python
[Python] Un mémo pour écrire du CSV verticalement avec Pandas
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Je veux faire fonctionner un ordinateur quantique avec Python
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
[Python] Road to the Serpent (5) Jouez avec Matplotlib
Connectez-vous à BigQuery avec Python
Une route vers Python intermédiaire
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
Faites une loterie avec Python
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
Créer un répertoire avec python
Comment convertir un tableau en dictionnaire avec Python [Application]
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
Probablement le moyen le plus simple de créer un pdf avec Python 3
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython
Publier un message sur Google Hangouts Chat avec un fil de discussion (Python)
Comment créer un environnement de développement de la série Python2.7 avec Vagrant
Créer un message correspondant à la localisation avec la chaîne de traduction python
[Python] Qu'est-ce qu'une instruction with?
Résoudre ABC163 A ~ C avec Python
Python: comment utiliser async avec
Faites fonctionner l'imprimante de reçus avec python
Manuel de graphisme Python avec Matplotlib.
Lien pour commencer avec python
[Python] Ecrire dans un fichier csv avec Python
Faisons une interface graphique avec python.
Essayez d'exploiter Facebook avec Python
Résoudre ABC166 A ~ D avec Python
Sortie vers un fichier csv avec Python
Créez un environnement virtuel avec Python!
J'ai fait une loterie avec Python.
Convertir la liste en DataFrame avec python
Conversion MP3 → WAV avec Python
Pour faire une récursion avec Python2
Créer un environnement virtuel avec Python 3