Алгоритмы для жизни: как выбрать лучшего кандидата
medium

Алгоритмы для жизни: как выбрать лучшего кандидата

Математик Леонард Эйлер выбирает вам невесту. Или жениха

Есть старая проблема, у которой много названий: «задача секретаря», «выбор супруга» или «задача наилучшего выбора». В общих чертах задача звучит так:

  • нам нужно выбрать одного человека, который лучше всех подходит под наши требования;
  • мы знаем количество кандидатов — N;
  • с кандидатами мы общаемся в случайном порядке;
  • после каждого общения мы должны сразу принять решение — подходит нам этот человек или нет. Если подходит — все остальные сразу уходят и мы с ними уже не сможем пообщаться. Если не подходит — уходит этот человек, больше с ним общаться нельзя;
  • есть ли алгоритм, который позволит выбрать максимально лучшего в такой ситуации?

Разберём разные подходы к решению и посмотрим, есть ли алгоритм, который позволит сделать это максимально эффективно.

Лучшее решение этой задачи — отказаться её решать в таких рамках. 

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

Нужно выбрать ассистента? Опубликуй вакансию, собери отклики, прочитай всё, выставь оценки откликам, прособеседуй лучших, выбери одного, дай испытательный срок. Если получилось — работай с ним, если нет — обратись к следующему по списку. 

Чтобы выбрать наилучшим образом, нужно изучить все варианты, определить критерии выбора, создать для себя какие-то измеримые шкалы, всё измерить, принять решение и дать себе возможность откатиться. Всё. Это правильный ответ. 

Ломайте систему и не соглашайтесь на навязанные рамки.

Алгоритм: выбираем первого кандидата

Самый простой вариант — всегда выбирать первого кандидата. С точки зрения эффективности это плохое решение: чем больше кандидатов, тем меньше вероятность того, что мы выберем достаточно хорошего. 

Если общее количество кандидатов равно N, то вероятность того, что первый кандидат окажется лучшим равен 1/N. Если у нас сто кандидатов, то вероятность успеха — 1/100, то есть 1%. Это мало, поэтому переходим к другим стратегиям.

Алгоритм с числом Эйлера

Единственное, что мы можем контролировать, кроме уровня текущего кандидата — это количество тех, кому мы уже отказали. Это можно использовать как для выяснения уровня кандидатов, так и для повышения вероятности выбора наилучшего из них.

Математики из разных стран думали над решением этой задачи и вот к каким выводам они пришли:

  1. Определяем количество кандидатов — N.
  2. Выбираем из них первые R кандидатов — собеседуем их и запоминаем уровень самого толкового среди них. При этом отказываем всем после собеседования.
  3. Уровень наилучшего кандидата из первых R человек принимаем за базовый уровень.
  4. Начинаем смотреть остальных кандидатов.
  5. Первый кандидат, чей уровень превышает наш базовый уровень, — это наш кандидат и мы его нанимаем.

В общем виде это выглядит так:

Алгоритмы для жизни: как выбрать лучшего кандидата

Самое сложное — это определить то самое количество первых кандидатов R, которым мы точно откажем. Для этого математики вычислили такую формулу. Если не знаете, что означает значок Σ, — это знак суммы в математике, про это у нас есть отдельная статья.

Алгоритмы для жизни: как выбрать лучшего кандидата

Если с этой формулой дальше сделать разную математическую магию, то мы получим:

R = N/e,

где e — это число Эйлера, которое примерно равно 2,7182818284. Это значит, что если у нас 100 кандидатов, нам нужно отказать примерно 38 людям, а начиная с 39-го — брать того, чей уровень выше базового.

Алгоритм для неизвестного числа кандидатов

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

Чтобы выйти из этой ситуации, придумали такое:

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

Получается, что если у нас на наём есть месяц, то примерно 10 дней мы отсматриваем кандидатов и отказываем им, при этом помечаем себе уровень наилучшего кандидата из тех, что были. А начиная со второй декады собеседуем всех, кто пришёл, и сразу берём первого, кто выше найденного базового уровня. Но это мы сильно упростили, конечно, в формулах там всё гораздо сложнее.

Например, за первые дни мы выяснили, что наилучший кандидат, который у нас был, получил виртуальные 5 из 10 баллов по нашей оценке. Начиная с 11 числа мы ищем того, кто будет выше этих 5 баллов, — и берём первого, кто подходит по этому критерию.

Что дальше

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

Любите такие задачи? Подойдите поближе
Внизу кнопка, при нажатии на нее вы попадете на витрину курсов «Практикума» с нуля. Выбираете там то, что вам близко, и погружаетесь в профессию. Через год-полтора вы работаете в какой-нибудь ИТ-компании. И там вы решаете подобные задачи, но уже за деньги. Старт бесплатно.
Начать бесплатно
Любите такие задачи? Подойдите поближе Любите такие задачи? Подойдите поближе Любите такие задачи? Подойдите поближе Любите такие задачи? Подойдите поближе
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
medium