Как рассадить всех по науке и не превратить кабинет в рассадник ненависти

wohgmo31kkn2gzhq41mikawbksq.jpeg

Рано или поздно в жизни большинства команд наступает он — переезд. Вас приводят в чистое пустое помещение, которому предстоит стать местом, где вы будете проводить большую часть своей жизни. Если вы дизайнер, то первым делом придумаете, как развесить картины и поставить цветы, чтобы помещение заиграло новыми красками. Если вы опытный офисный самурай, то сразу наметанным глазом определите наилучшее место и первым заявите на него права. Если вы руководитель отдела, то вас наверняка посетит головная боль по поводу рассадки всех сотрудников. Но если вы при этом возглавляете команду датасайентистов, то монетка Python вам в помощь.

Конечно, все определяет ваш стиль управления. Если вы предпочитаете авторитарные решения, то можете просто указать властным перстом, куда всем следует идти. И не беда, если кто-то противится садиться лицом в стену или друг к другу. Однако со времен отмены крепостного права в 1861 году такой стиль в нашей стране планомерно теряет популярность. И если вы все же озабочены комфортом сотрудников, то стоит собрать и как-то учесть их предпочтения. Но вот тут-то и подкрадывается дьявол, тот самый, который в деталях: как собрать, как учесть, кому отдавать предпочтение и т.д.

Ввиду многолетнего опыта организации олимпиад для школьников, где равенство условий — один из основных приоритетов, я был настроен на создание прозрачных и понятных механизмов, при которых более опытные или быстрые сотрудники не получают каких-то преимуществ.

Всем не угодишь или все-таки…?


Мы делаем предпосылку, что сотрудники могут иметь предпочтения по рассадке, и хотим минимизировать возможное недовольство. То есть надо организовать систему распределения мест так, чтобы одни сотрудники, действуя оптимальным для себя образом, не входили в явный конфликт с другими. Стратегия «кто первый встал, того и тапки» к этой цели явно не ведет. Если же определить какой-то порядок выбора (например, исходя из заслуг), то задача все равно не решается — человек, который выбирает раньше, но которому относительно все равно, может случайно занять место, облюбованное другими. Не говоря уж о том, что такой порядок — вещь сама по себе спорная.

Мы выбрали тип голосования, при котором голос каждого зависит от того, как проголосовали остальные: если человеку более-менее все равно, на какое из двух мест садиться, то оптимальная стратегия претендовать на то, где меньше конкурентов.

Наш путь к идеальной рассадке


Первым делом надо было определить, где вообще можно садиться. Тут задача была на всех, ибо все заинтересованы сделать как можно больше удобных мест — ведь в этом случае конкуренция уменьшается. Мы составили карту и провели разъяснительную работу «среди населения», продвигая каждое место как идеальное.

kdkqp24ptblltczmbyqpzamlrw8.png

В идеальном мире надо бы, чтобы каждый поставил баллы предпочтения каждому из мест, но человеку сложно до сотых долей оценить, чем одно место отличается от другого.
Поэтому каждому было предложено выбрать списки приоритетов, число которых вообще не ограничено: какие места он хотел бы занять в первую очередь, какие — во вторую, а какие — в третью.

Тут надо отметить, что логика предпочтений у сотрудников сильно разнилась: кто-то хотел быть ближе к окну, кто-то — смотреть в окно, кому-то была важна близость к кондиционеру и даже цвет стен. Сами предпочтения учесть сложно, тут можно только дать людям возможность выбрать место.

Дальше требовалось определиться с метрикой успешности расстановки. Чем неудобнее сидит человек, тем больше должна штрафоваться такая модель. Я решил сделать квадратичный штраф, чтобы избежать вопиющих неудобств.

Получилось так: если человека посадили на место из его списка ТОП-1, то штраф 2; если из списка ТОП-2 — штраф 4, ТОП-3 — 8, ТОП-4 — 16 и так далее. Я не утверждаю, что эта метрика оптимальная, но выглядит разумной.

Я написал простую программу на Python — в нее вводятся приоритеты от коллег, и она рассчитывает варианты расстановки с минимальным штрафом. Алгоритм объявил коллегам заранее (как я был наивен!). Списки все публиковали в открытую, чтобы иметь возможность при желании договориться.

Однако, увидев расчеты, некоторые сотрудники поняли, что можно попробовать подобрать свою «заявку», чтобы получить искомое место. Датасайентисты такие датасайентисты!:)

В итоге был организован второй тур выборов, когда можно было вносить изменения в свои приоритеты в закрытую. Таким образом, все опять находились в равных условиях — каждый мог подбирать и вносить изменения.

Собрав заявки со второго тура, я прогнал программу уже финально. Фуфх! Вроде все довольны.

Вместо P.S.


Стоит отметить, что тут не учитывались пожелания по поводу близости сотрудников друг к другу. Но в данной парадигме их также довольно просто реализовать, создав списки пожеланий (кто с кем хочет сидеть рядом и какие места находятся рядом, по мнению этих сотрудников), а дальше штрафовать модель за неисполнение данных пожеланий.

Конечно, всегда возможен вариант, когда две расстановки имеют одинаковый штраф.
В этом случае я уже решил полагаться на монетку — оптимизация дальше бессильна :).

Николай Князев, руководитель группы машинного обучения «Инфосистемы Джет»

Сам код: github.com/irumata/OfficeUtils

© Habrahabr.ru