Миронов В.О., Попов Д.В.

Диспетчер, общий сбор всех Хабристов !!! У нас экстренный пациент, надо доставить его как можно быстрее !!! Именно в таком формате у нас и проходил хакатон, который мы организовывали на базе Финансового университета при Правительстве РФ с поддержкой многопрофильного ИТ-холдинга T1. Для нас это был "пилотный" проект, и мы выполнили его очень бодро и весело. По моему мнению, участники остались довольны и было высказано всеобщее мнение повторить подобное ещё не раз.

Рис. 1. Никто не обещал, что на хаке будет легко
Рис. 1. Никто не обещал, что на хаке будет легко

В соревновании принимали активное действие не только сами участники, но и огромная группа поддержки и зрители. Здесь мы постарались задействовать все ресурсы, чтобы досточтимой публике было интересно и дополнительно подлить драйва в пожар эмоций, а их было, уж поверьте, немало ;-)

Мы устроили целое шоу в сети и постарались сделать хакатон, похожим на реальные «гладиаторские бои» с постоянной динамикой, интересом, необычными квестами и будоражащей интригой. При этом, нам довелось увидеть всё: от нереального алгоритмического “мега-противостояния”, вылета участников, “падения” решений, невероятных взлётов и битвы за первое место, достойного любых международных соревнований.

Сразу скажу, что лидербор, менялся знатно, гонка шла очень горячо и полных три дня. Три дня крутого движения, веселья и прокачки кодерских скилов. За что впоследствии команды были награждены солидным мерчом, а награждение и пасхалки - это вообще была отдельная театральная постановка :-). Заинтриговали ??? Просим подкат, нам есть что рассказать и чем поделиться с айтишным сообществом !!!

Подготовка, кофе, черновики

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

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

Также нам хотелось привлечь как можно больше участников, из разных вузов, дабы получить самые интересные решения. При этом мы не «загоняли» ребят в рамки, только машинки (машинного обучения), мы заранее сказали и придумали задачу так, что дали две ветки:

1. Решение можно получить с помощью машинки;

2. Допускается и алгоритмическое решение;

Нам был не важен подход – важен был итог от решения и учёт не только технической, но и бизнес составляющей задачи. Конечно, в реальном продакшене, учитываются все экономические моменты и затраты. Здесь больше важен скор, качество исполнения самого решения и главное, идейная составляющая самого решения. Суть была в том, чтобы ребята показали, что важно не только решить задачу и чтобы бизнес заработал, но и показать на деле, что решения помогают людям, для которых эти решения и выполняются, то есть целевой аудитории.

Говоря о правилах, мы руководствовались стандартными международными по хакатонам и каких-то нововведений не делали, чтобы у всех собравшихся были единые ожидания и понимание от оценки задачи. За свою активную деятельность мы прошли уже 15 хакатонов и имеем 12 побед, причём самых разных, в качестве непосредственных участников, и нам есть с чем сравнить. Сам же хакатон проходил с 22-го по 26 декабря, прямо в преддверии Нового Года.

Мы были открыты для всех желающих с любых курсов, институтов, колледжей, специальных учебных заведений, лицеев. Ограничений не было никаких, кроме возраста (18+, тут это стандартно). Парни, девчонки, все могли попробовать себя в качестве участников и показать себя. Кстати, для нас было открытием, что у нас была единственная девушка, которая в соло выступила на всём хаке и не испугалась конкуренции, конечно же, она не осталась без нашего внимания и заработала специальный приз жюри.

Рис. 1. Темы можно было придумывать любые, тут был полный креатив от ребят
Рис. 1. Темы можно было придумывать любые, тут был полный креатив от ребят
Рис. 2. Были очень оригинальные решения и примеры, что также принималось во внимание
Рис. 2. Были очень оригинальные решения и примеры, что также принималось во внимание
Рис. 3. Конечно жэе мы устроили голосование за направление хакатона, чтобы подбодрить наших участников активнее участвовать в выборе
Рис. 3. Конечно жэе мы устроили голосование за направление хакатона, чтобы подбодрить наших участников активнее участвовать в выборе

Перед тем как мы начали, мы предоставили участникам возможность самим определить тему и сделалиэто в рамках голосования. Оно у нас длилось аж в целых три раунда, и здесь мы сразу начали «задорить» наших участников, чтобы они бились за любимую задачу, коих было очень немало. Также было дано время на придумывание самих задач и понимание смогут ли участники её действительно решить. Всё было разбито на отдельные этапы. Ребята начали выкатывать идеи, по которым у нас сформировалось небольшое голосование и понимание, что хочет общественность.

Здесь, мы сразу показали участникам, что задачи в реальном бизнесе не появляются просто так. Они все являются насущными проблемами, которые требуется решать исходя из конъюнктуры рынка. Более того, идеи могут возникать самые любые, и конкуренция на рынке всегда зависит от творческого потенциала и желания привнести что-то новое в уже сложившиеся бизнес-потоки.

По итогам голосования, мы поняли, что ребятам захотелось решить задачи из того пула векторов, который у нас есть. Здесь же мы дали им некую свободу действий и понимание ответственности за сформированное у них решение. Мы постоянно с ними общались и обсуждали задачи, которые могут быть на хак��, чтобы, с одной стороны, показать свою экспертную оценку, с другой, приучать ребят критически оценивать бизнес-составляющую. Дополнительно нам надо было знать сколько людей придёт на хак, так как под каждого из них готовились мощности для работы. Здесь нам активно помог ИТ-холдинг Т1, предоставив платформу Сайбокс.

Со стороны T1 также были учебные материалы по работе с платформой и организован мастер-класс, который длился несколько дней. Все мастер-классы, учебные материалы и мощности были предоставлены всем зарегистрированным участникам бесплатно. Дополнительно мы заранее раздали участникам формат оформления шаблона по представлению итогового решения, который включал в себя:

1. Пример оформления презентации;

2. Пример оформления питчинга;

3. Дополнительные материалы для подготовки.

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

Рис. 4. Битва была жаркая и многое пошло в ход
Рис. 4. Битва была жаркая и многое пошло в ход
Рис. 5 Форма опроса тоже не осталась без внимания и уже сразу приглашала участников в активной работе
Рис. 5 Форма опроса тоже не осталась без внимания и уже сразу приглашала участников в активной работе

На выходе, после всех подготовительных процедур у нас было сформировано 4 команды с весьма интересными названиями: L1VON, TensorFlowers, 3.69, mode: будЭйко. Остальные участники были в “соло”. Далее, за каждой командой со стороны нашей компании DenoiseLAB был закреплён куратор, который помогал им в анализе задачи, разборе решений и общем саппорте. Все кураторы общались с командами в закрытых чатах. Участники, которые шли в “соло”, получали рекомендации и саппорт в общем чате.

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

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

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

Задача, метрики и сложность

Наконец, сама задача. Мы взяли, вектор, что уже был на других хакатонах, но значительно переделали сам формат и подачу, снабдив её “свежими” метриками и аналитикой. Здесь мы приводим формулировку, которая была дана участникам в изначальном виде:

“““

Оптимизация размещения клиник в городе Северск

Описание задачи

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

Ваша задача — определить координаты 250 клиник (то есть (N = 250)), которые минимизируют среднее время в пути для всех клиентов, с учётом штрафа за перегрузку клиник и дополнительных условий. Каждая клиника имеет фиксированный лимит (L = 1000) пациентов.

Формат входных данных: На вход подаётся файл Data.csv, содержащий данные о местоположении клиентов. Формат файла:

Колонки: x — координата ( x_i ) клиента (вещественное число) и y — координата ( y_i ) клиента (вещественное число).

Пример входных данных (содержимое файла Data.csv)

x,y
100.5,200.3
105.7,198.9
…

Условие оптимизации

Среднее время в пути клиентов рассчитывается по следующей формуле:

Рис. 6
Рис. 6

где: d(x_i, c_j) — расстояние (по метрике ( L_2 )) от пенсионера ( x_i ) до клиники ( c_j ); K_j — число клиентов, обслуживаемых клиникой ( c_j ); L = 1000 — максимальный лимит пациентов на одну клинику; alpha = 0.05 ; beta = 0.02; y = 0.01.

Пример штрафа

- Если клиника обслуживает 1200 клиентов, а лимит ( L = 1000 ), то штраф будет:

- Если клиника обслуживает 950 клиентов, штраф равен 0, так как ( K_j \leq L ).

✅ Фича №1: Количество жителей района вокруг потенциального места расположения клиники (density_area)

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

✅ Фича №2: Удаленность от существующих клиник (clinick_distance)

Клинику лучше размещать поблизости с транспортом (автобус, трамвай, метро, такси). В колонке указано, какими видами транспорта может пользоваться клиент. Но есть приоритеты: автобус - 3, трамвай - 2, метро - 1, такси - 4. Желательно расположить клинику так, чтобы покрыть максимум возможностей клиентов. У метро самый высокий приоритет.

✅ Фича №3: Возрастная структура населения (client_age)

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

✅ Фича №4: Расстояние до ближайшего парка или зелёной зоны (park_distance)

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

✅ Фича №5: Концентрация социально уязвимых групп (vulnerable_group_density)

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

✅ Фича №6: Социальная инфраструктура (social_infrastructure_rating)

Регион с хорошей социальной инфраструктурой создаёт повышенный спрос на услуги медицины, например аптеки. Чем выше значение тем более привлекательное расположение.

Три метрики для оценки качества решения:

Суммарное время в пути для всех клиентов (Total Travel Time)

Эта метрика оценивает общее время, которое тратят клиенты на дорогу до ближайшей клиники. Чем меньше суммарное время, тем выше качество решения.

Рис. 7
Рис. 7

где: M — количество клиентов; N — количество клиник; d(x_i, c_j) — расстояние от клиента i до ближайшей клиники j; valpha, beta — коэффициенты важности линейного и квадратичного членов.

Перегрузка клиник (Clinics Overload)

Данная метрика отслеживает превышение лимита загрузки каждой клиники. Высокая нагрузка снижает комфорт и доступность обслуживания.

Рис. 8
Рис. 8

где: K_j — фактическое количество клиентов, прикреплённых к клинике j; L — лимит пациентов на одну клинику (1000 человек).

Средняя оценка удобности расположения (Location Convenience Score)

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

Рис. 9
Рис. 9

где: DA_j — плотность населения в районе j; PD_j — расстояние до ближайшего парка в районе j; VD_j — концентрация социально уязвимых групп в районе j; SI_j — уровень социальной инфраструктуры в районе j; w_1, w_2, w_3, w_4 — веса соответствующих параметров.

„„„

Подготовка подходила к концу, задача была сформирована, настало время представить наше уважаемое жюри:

— Коротеев Михаил Викторович: кандидат экономических наук, доцент. Заведующий кафедрой «Искусственного интеллекта». Директор центра «Цифровой трансформации Финансового университета»

  • Миронов Владимир Олегович: кандидат технических наук, доцент. Старший преподаватель кафедры «Искусственного интеллекта». Доцент центра «Цифровой трансформации Финансового университета»

  • Сапрыкина Анастасия Николаевна: Руководитель направления по работе с вузами ИТ‑холдинга Т1. Кандидат экономических наук и ментор по программе «Стартап как диплом».

  • Беднов Алексей Андреевич: директор центра продуктового и стратегического развития T1.

  • Владимир Юрьевич Мужилов: Технический эксперт от T1. Архитектор платформенных решений.

  • Данила Максим��вич Одинец: студент Финансового университета при Правительстве РФ. Специальность: Прикладная математика и информатика.

  • Кураторы команд: (Студенты Финансового университета при Правительстве РФ, кафедра «Искусственного интеллекта», факультета Машинного обучения и анализа Больших Данных): Шипилов Егор Павлович, Кудрявцев Ярослав Игоревич, Кирнасов Никита Тарасович, Апухтин Владислав Борисович, Дубовицкий Фёдор Валерьевич.

Старт, взлет, поехали

Хакатон начался, команды, стремительно сели за работу над проектами, и мы с нетерпением ждали первых решений и прохождение QA сессий. Было сформировано расписание, и каждый участник приходил и подключался в онлайне. И… решения сразу посыпались, с первой же команды, участники представили своё ви́денье по задаче, как её решить и сформировать, что будут делать, как упаковывать и защищать. Здесь мы (организаторы) немного выдохнули, так как первый фидбэк мы получили, ребята поняли задачу и приняли её.

Рис. 10. Бывали вопросы и по метрикам, но в целом все отлично прошло
Рис. 10. Бывали вопросы и по метрикам, но в целом все отлично прошло
Рис. 11. Расписание на QA сессии также заранее предоставлялось участникам
Рис. 11. Расписание на QA сессии также заранее предоставлялось участникам

Так как часть из ребят работала на сервере, часть работала локально (здесь уже как кому было удобно, места у нас были под всех), было принято решение принимать решения на почту, откуда они забирались и передавались для расчёта скора. Сразу скажу, все решения приходили чётко, никого мы не потеряли. В сутки можно было загрузить не более 5, и они принимались исключительно в CSV формате. Также мы выкатили формат нейминга для файла: название команды / ник (если вы в соло)_дата_версия решения_. Например:TensorFlowers_23.12_version_1.

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

Далее, все пошло как по классике, ребята «грузили» решения, мы формировали лидерборд и устраивали всякие акции как для участников, так и для зрителей, чтобы и тем и другим было интересно. Старались обращать внимание на ключевые моменты и подбадривать участников. Дополнительно была организована гонка за пасхалкой, которая очень даже “бустанула” для одной комманды, но обо всем по порядку.

Рис. 12. Саппорт по технической части работал идеально
Рис. 12. Саппорт по технической части работал идеально
Рис. 13. Были и короткие комментарии как и что делать и целые наставления техно-гуру
Рис. 13. Были и короткие комментарии как и что делать и целые наставления техно-гуру
Рис. 14. Наконец, настала пора лидербордов
Рис. 14. Наконец, настала пора лидербордов
Рис. 15. Ну и конечно же пасхалки, куда же без них
Рис. 15. Ну и конечно же пасхалки, куда же без них
Рис. 16. Моральное состояние участников также было важно, так как от него зависит качество получаемых решений
Рис. 16. Моральное состояние участников также было важно, так как от него зависит качество получаемых решений

Пасхалку, конечно же, нашли: так как хак был на медицинскую тематику, всего было три подсказки, и они сводились к самому известному числу в медицине, конечно же, это 36.6. Две команды шли очень «ровно» в поисках, но одна оказалась чуточку быстрее. Все коннекты по подсказкам осуществлялись не в общем чате, а напрямую в чат кураторов. В итоге пасхалка помогла одной команде (mode: БудЭйко) очень бодро бустануться и вылететь на первое место, но по итогам питчинга, они откатились на второе место. Штож, бывает, это хак, здесь уж ничего не попишешь.

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

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

Особым открытием хакатона было участие ЕДИНСТВЕННОЙ девушки, которая выступала в соло и показала очень достойное решение. Здесь, просто, можно снимать шляпу и всячески восторгаться, во-первых, упорством, во-вторых… да просто азартом !!! Меж тем участники придумывали все новые и новые решения, даже некоторые ждали момента, и до победного не выкатывали свои лучшие идеи, обкатывая текучку на типовых ходах. Чтож… почему бы и нет, тоже стратегия, достойная уважения.

Решение, мысли и отчеты

В процессе работы над хаком ребята не раз выкатывали очень “бодрые” и ёмкие решения, которые заслуживали отдельного подхода и изучения хода мыслей одно из таких было представлено командой mode: БудЭйко (Денис Попов, Дмитрий Ковалёв). Приводим вам его в его оригинальном виде:

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

Путём подбора гиперпараметров KMeans мы улучшили метрику с 2363 до 2308. Применение градиентного спуска позволило достичь значения 2297, однако стало очевидно, что потенциал текущего подхода исчерпан и требуется смена парадигмы решения.

Следующим шагом стал углублённый разведочный анализ данных (EDA). Мы выявили, что дополнительные 6 признаков имеют равномерное распределение (skew ≈ 0) и низкую взаимную корреляцию. Это позволило сделать вывод о нецелесообразности применения ресурсоёмких моделей для их обработки. Анализ метрики качества показал, что вклад компоненты расстояния (метрика T) значительно превышает вклад метрики комфорта (LCS). Руководствуясь этим наблюдением, мы приняли решение сконцентрироваться на минимизации расстояний, временно исключив из оптимизации условия комфорта.

На завершающем этапе мы задействовали вычислительные мощности GPU-серверов Scibox и реализовали итоговое решение на базе PyTorch. Ключевыми элементами стали градиентная оптимизация, механизм мягкой кластеризации (soft assignment) и локальные дискретные микросдвиги по границам Вороного. Итоговое значение общей метрики составило 2292.39. Удалось значительно улучшить компоненту T, однако это произошло ценой падения метрики LCS, что и стало нашим ключевым тактическим просчётом. Ретроспективно мы пришли к выводу, что целесообразнее было бы либо точечно учитывать дополнительные признаки для повышения LCS, либо построить ансамбль моделей с блендингом результатов по обеим метрикам.

Рис. 17. В процессе хака мы видели конечно очень "лихие повороты"
Рис. 17. В процессе хака мы видели конечно очень "лихие повороты"
Рис. 18. Лидердбор знатно так "штормило" от колличесва решений и скорости их выдачи
Рис. 18. Лидердбор знатно так "штормило" от колличесва решений и скорости их выдачи

Финал, победа, пораженье

В итоге было сформировано три первых места с награждением, которое проходило онлайн в Финансвовом университете при Правительстве РФ. Прийти мог любой желающий, для этого надо было оформить соотвествующий пропуск. Под занавес мы начали обратный отсчёт по таймингу, дабы ещё подкинуть дровишек в наше бушующее действо, и подбодрить публику, заодно устроили голосование за лучшую команду. В финале мы представили итоги: 1. L1VON, 2. БудЭЙко, 3. СУЕТОЛОГ, 4. 3.69, 5. Полина. Кроме всего, у нас были и спец номинации, которые мы огласили на церемонии награждения, которое состоялось через день после самого хакатона. Как только публика собралась на Хак, мы тут же начали церемонию вручения призов: дипломы, мерч и поздравления были очень разнообразными, но мы постарались и сделали из этого целый праздник.

Рис. 19. Поддержка зрителей была неоценима
Рис. 19. Поддержка зрителей была неоценима
Рис. 20. Наконец, награждение !!!
Рис. 20. Наконец, награждение !!!

Спецноминация_1 (Кальченко, Воробей - за поиск пасхалки и ответ про Хромосомы)

"Против ветра" Здесь награждаем самого дерзкого мечтателя и бунтаря. Вместо привычного маршрута он решил отправиться напролом прямо в неизвестность. Столкнувшись лицом к лицу с ветрами неудач и устоявшихся догм, он сказал: «Нет!» Обычным методам и прорубил собственный путь к великим открытиям. Отныне его девиз — «Кто ищет, тот найдёт».

Спецноминация_2 (Полина, за то что одна вышла против всех)

Вызов принят! Элегантная леди бросила перчатку группе парней-разработчиков и заявила: «Ну-ка посмотрим, кто сильнее». Вооружённая ноутбуком и отменным чувством юмора, она буквально провела собственные сражения на фронтах Python и DataSceience. Теперь ясно одно: девочки играют на равных, и делают это изящно и мастерски!

Спецноминация_3 (Кураторы, за то что помогали мне тащить хак и поддерживали команды)

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

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

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

«Старейшина здравия»: cпециальное достижение, чей участок привлекает большее количество пожилых пациентов (возраст старше 65 лет).

«Парковая терапия»: специальное достижение, чьи клиники расположены близко к зелёным зонам.

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

Если вам интересны новости и аналитика в сфере AI подписывайтесь на каналы, очень ждем вас, нам есть что Вам рассказать и показать:

https://t.me/DenoiseLAB

https://t.me/ai_edtech_commerce

P.S. В статье могут быть правки.