
Tôt ou tard dans la vie de la plupart des équipes, il vient - en mouvement. Vous êtes conduit dans une pièce propre et vide, qui deviendra un endroit où vous passerez la majeure partie de votre vie. Si vous êtes un designer, la première chose à laquelle vous penserez est de savoir comment accrocher les photos et mettre les fleurs pour que la pièce scintille de nouvelles couleurs. Si vous êtes un samouraï de bureau expérimenté, alors avec un œil exercé, déterminez le meilleur endroit et revendiquez-le d'abord. Si vous êtes le chef du département, vous aurez probablement mal à la tête de tous les employés. Mais si en même temps vous dirigez une équipe de scientifiques des données, la
pièce Python vous aidera.
Bien sûr, tout détermine votre style de gestion. Si vous préférez des décisions autoritaires, vous pouvez simplement indiquer d'un doigt impérieux où tout le monde doit aller. Et peu importe si quelqu'un résiste à s'asseoir face au mur ou face à face. Cependant, depuis l'abolition du servage en 1861, un tel style a régulièrement perdu en popularité dans notre pays. Et si vous êtes toujours préoccupé par le confort des employés, cela vaut la peine de collecter et de prendre en compte leurs préférences. Mais ici le diable se glisse, celui qui est dans les détails: comment collecter, comment prendre en compte, à qui donner la préférence, etc.
Compte tenu des nombreuses années d'expérience dans l'organisation de concours pour les écoliers, où l'égalité des conditions est l'une des principales priorités, j'étais déterminé à créer des mécanismes transparents et compréhensibles dans lesquels les employés plus expérimentés ou plus rapides n'obtiennent aucun avantage.
Vous ne plairez pas à tout le monde, ou encore ...?
Nous partons du principe que les employés peuvent avoir des préférences en matière de sièges et vouloir minimiser le mécontentement potentiel. Autrement dit, il est nécessaire d'organiser un système de répartition des sièges afin que certains employés, agissant de manière optimale pour eux-mêmes, n'entrent pas clairement en conflit avec d'autres. La stratégie «qui s'est levé le premier et chaussons» ne mène évidemment pas à cet objectif. Si l'on détermine un certain ordre de choix (par exemple, sur la base du mérite), alors la tâche n'est toujours pas résolue - une personne qui choisit avant, mais qui est relativement indifférente, peut accidentellement prendre la place choisie par d'autres. Sans oublier qu'un tel ordre est une chose controversée en soi.
Nous avons choisi le type de vote, dans lequel le vote de chacun dépend de la façon dont les autres ont voté: si une personne ne se soucie plus ou peu de l’un des deux endroits où s’asseoir, alors la stratégie optimale est de faire semblant où il y a moins de concurrents.
Notre chemin vers une assise parfaite
La première étape consistait à déterminer où vous pouvez généralement vous asseoir. Ici, la tâche était pour tout le monde, car tout le monde était intéressé à faire autant de lieux pratiques que possible - après tout, dans ce cas, la concurrence diminue. Nous avons réalisé une carte et réalisé un travail explicatif «auprès de la population», faisant de chaque lieu un lieu idéal.

Dans un monde idéal, il faudrait que chacun donne des points de préférence à chacun des lieux, mais il est difficile pour une personne d'évaluer au centième en quoi un lieu diffère d'un autre.
Par conséquent, chacun a été invité à choisir des listes de priorités, dont le nombre n'est pas limité du tout: quelles places il souhaiterait occuper en premier lieu, lesquelles en deuxième, et lesquelles en troisième.
Il convient de noter que la logique des préférences parmi les employés était très différente: quelqu'un voulait être plus près de la fenêtre, quelqu'un voulait regarder par la fenêtre, quelqu'un était important pour leur proximité avec le climatiseur et même la couleur des murs. Il est difficile de prendre en compte les préférences elles-mêmes, ici vous ne pouvez donner aux gens que la possibilité de choisir un endroit.
Ensuite, il a fallu déterminer la métrique du succès de l'arrangement. Plus une personne est inconfortable assise, plus un tel modèle doit être condamné à une amende. J'ai décidé de faire une pénalité carrée pour éviter les désagréments flagrants.
Il s'est avéré comme ceci: si une personne a été mise en place à partir de sa liste TOP-1, alors une amende de 2; si de la liste des TOP-2 - une amende de 4, TOP-3 - 8, TOP-4 - 16 et ainsi de suite. Je ne prétends pas que cette métrique est optimale, mais elle semble raisonnable.
J'ai écrit un
programme Python simple - les priorités de ses collègues y sont introduites et il calcule les options de placement avec une pénalité minimale. L'algorithme a été annoncé à l'avance à mes collègues (comme j'étais naïf!). Les listes ont toutes été publiées ouvertement, afin de pouvoir se mettre d'accord si désiré.
Cependant, après avoir vu les calculs, certains employés ont réalisé que vous pouvez essayer de récupérer votre "application" pour obtenir l'endroit souhaité. Les datasientistes sont de tels dataientistes! :)
En conséquence, un deuxième tour des élections a été organisé, lorsqu'il a été possible de modifier leurs priorités. Ainsi, tous étaient à nouveau dans des conditions égales - tout le monde pouvait sélectionner et apporter des modifications.
Ayant collecté les candidatures du deuxième tour, j'ai déjà exécuté le programme pour la dernière fois. Pouf! Il semble que tout le monde soit content.
Au lieu de PS
Il est à noter qu'il n'a pas été tenu compte des souhaits concernant la proximité des salariés entre eux. Mais dans ce paradigme, il est également assez simple de les mettre en œuvre en créant des listes de souhaits (qui veut s'asseoir à côté de qui et quels endroits sont à proximité, selon ces employés), puis d'affiner le modèle pour ne pas répondre à ces souhaits.
Bien sûr, l'option est toujours possible lorsque deux arrangements ont la même pénalité.
Dans ce cas, j'ai déjà décidé de miser sur une pièce - l'optimisation est impuissante :).
Nikolay Knyazev, responsable du groupe d'apprentissage automatique Jet InfosystemsCode Github