Автор MikeMirzayanov, история, 8 лет назад, По-русски

Сегодня, 26-го апреля в 18:35, начнется VK Cup 2017 - Уайлд-кард раунд 2.

Участникам раунда будет предложено за неделю максимально продвинуться в решении одной необычной задачи. Официально в этом раунде смогут принять участие команды чемпионата VK Cup 2017, которые прошли в Раунд 2, но не оказались среди тех топ-100 лучших по его результатам, кто проходит в Раунд 3. Кроме того, этот раунд будет открыт для всех желающих для неофициального участия вне чемпионата. Зарегистрироваться на раунд можно будет в любое время пока он идет.

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

Удачи!

UPD 1: Соревнование завершено. Лучшие 20 команд получают путевку в VK Cup 2017 Раунд 3! Спасибо за участие.

  • Проголосовать: нравится
  • +117
  • Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится +33 Проголосовать: не нравится

Но сегодня только 25-е апреля!

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Unusual rules like VK wild round 1?Interesting! Hope surprised rules and problems.

»
8 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

How many participant advance to Round 3?

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Надеюсь, что хотя бы в этот раз задача/ограничения будут подобраны не как в прошлый раз, когда простейшие решение на Java падало по TL 17582651.

»
8 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

If I registered for this round .. can I also compete in Educational Codeforces Round 20 ?

»
8 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

I can only participate out of contest as a single person, why can't i register unofficialy with a team?

»
8 лет назад, # |
  Проголосовать: нравится +7 Проголосовать: не нравится

Would the people not actually in VK Cup be rated for this?

»
8 лет назад, # |
  Проголосовать: нравится +17 Проголосовать: не нравится

Why can't I register it as a team?

»
8 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

Is this round rated?

»
8 лет назад, # |
  Проголосовать: нравится +22 Проголосовать: не нравится

Раньше была возможность использовать java 8 zip, сейчас этого нет — есть вариант, что появится?

»
8 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

А есть ли ограничения на количество посылок?

»
8 лет назад, # |
  Проголосовать: нравится +21 Проголосовать: не нравится

Жалко, что нельзя отменять свои посылки: например сейчас висит мое багнутое решение, которое не дает ответ за 10 секунд и зря расходует ресурсы кф((

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    http://codeforces.me/blog/entry/44548?locale=ru#comment-290814

    Согласен! Тут под ^ этим комментом кто-то написал, что это проблема решается локальным пакетом тестирования — минималист :D Для удобства уж лучше добавить, я вот дофига решений отправил локально непроверенных

»
8 лет назад, # |
  Проголосовать: нравится +19 Проголосовать: не нравится

Тупо. Жадно. Переборно.

Мы набрали ~10075 баллов с какой-то дичью.

Сортируем профессоров по убыванию общего кол-ва уроков, которое они должны провести и аналогично сортируем группы.

Теперь пытаемся пройтись по всем профессорам и для каждого профессора перебираем 42 * 42 (магические константы :D) перестановки дней * перестановки уроков.

Теперь в таком порядке проходимся по группам и пытаемся назначить все уроки текущей группе.

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

Теперь ту же фигню мутим, но изменяем порядок — теперь проходимся по группам и назначаем профессоров.

Вроде с горем-пополам нашли какое-то норм решение. Но не тут то было!

Теперь его ещё подоптимайзим — для какой-то группы будем свапать уроки её профессоров пытаясь минимизировать усталость.

А потом ещё для каждого профессора попробуем просвапать уроки для его групп.

В конце выводим это чудо-наоптишмайзенное решение.

У кого какие решения?

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Мы находили начальное расписание венгерским алгоритмом.

    Не помню сколько он набирал сам по себе, но после жадной оптимизации вышло набрать немного больше.

    С нежадной оптимизацией как-то не сложилось.

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +17 Проголосовать: не нравится

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

    • »
      »
      »
      8 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

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

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

»
8 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Берет что-то около 10075. Сплошной нахаченный рандом.

Написал отдельно два решения: одно лучше оптимизирует группы, другое — преподов, выполнял оба по 5 секунд.

Решение делилось на две части: сначала сгенерим произвольное (более-менее неплохое) расписание, потом в течение 500 мс будем брать произвольную пару (в последнем решении пара не произвольная, а какая-то из рандомного дня рандомной группы, что находится близко к началу дня, не обязательно самая близкая), вынимать ее и ставить в наиболее оптимальное место.

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

Добавляю следующим образом: сортирую дни по длине занятых в них отрезков по возрастанию, выписываю все свободные клетки, ставя им ту цену, что добавляется при постановке, сортирую их и пытаюсь взять наиболее дешевые. При равенстве смотрю по цене дней соответственно. Пытаюсь обновить ответ после каждой итерации удаления-добавления пары (проверяя, что все пары поставились).

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

»
8 лет назад, # |
  Проголосовать: нравится +25 Проголосовать: не нравится

Берет 10117.016 Решение состоит из двух частей.

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

Вторая часть: берем два рандомных урока и пытаемся поменять местами. Если улучшили ответ, то меняем местами и сохраняем в таблице расписаний. Работает: 9.5 сек

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

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +31 Проголосовать: не нравится

    Быстро и легко пишется! Вообще не ожидал, что такое решение так хорошо улучшает. Получается все кто с 10117... отличаются только нахаченностью решения :D

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +36 Проголосовать: не нравится

      Вот-вот! Я не могу поверить, что у меня написано вот ровно то же, просто чутка недохачено! :D Ожидал, что какие-то серьезные идеи у людей в топе.

»
8 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Когда ждать финальное тестирование?

»
8 лет назад, # |
  Проголосовать: нравится +44 Проголосовать: не нравится

Не терпится узнать, когда будет финальное тестирование?

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится +47 Проголосовать: не нравится

Как-то было анонсировано, что не будет систестов(Соревнование сейчас перешло в "закончено + дорешивание")? Каждый год были систесты, отличающиеся от претестов, и перестановка участников зачастую резко менялась, из-за того, что многие участники переобучали свои решения под конкретные тесты.

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

Кто-то может пояснить где я упустил изменение по сравнению с предыдущими годами?

»
8 лет назад, # |
  Проголосовать: нравится +21 Проголосовать: не нравится

Возьмите первые 30 команд, пожалуйста! :D Крик души

»
8 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

Кстати, а что за авторское решение?

»
8 лет назад, # |
  Проголосовать: нравится +31 Проголосовать: не нравится

10117.158:

Построим какое-то начальное расписание. Далее будем какое-то количество раз убрать все пары какого-то лектора/группы с вероятностью 50% и после чего возвращать их жадно в случайном порядке.

»
8 лет назад, # |
  Проголосовать: нравится +15 Проголосовать: не нравится

Разве не правда, что описанная задача является задачей целочисленного квадратичного программирования, и для таких небольших ограничений успешно решается за разумное время (почти) любым предназначенным для этого пакетом?

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    А что за "задачей целочисленного квадратичного программирования"?

  • »
    »
    8 лет назад, # ^ |
    Rev. 7   Проголосовать: нравится +5 Проголосовать: не нравится

    При наивном подходе будет много (порядка 10**5) переменных. Это по всей видимости не будет работать за вменяемое время(афаик большинство солверов используют одной из стадий симплекс), хотя я могу ошибаться.

    Есть идеи как обойтись малым числом переменных?

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится

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

      Тем более, нам (участникам) не так уж и приницпиально найти именно оптимальное решение, было бы достаточно "погонять" солвер 10 секунд и остановиться на достигнутом :)

»
8 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

When can we view contestant solutions?

»
8 лет назад, # |
  Проголосовать: нравится +27 Проголосовать: не нравится

Переместились с 1 места на 24 :( Финальные тесты очень порадовали!

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится +11 Проголосовать: не нравится

Кол-во человек набравших больше 32 тысяч ровно 32(42), и тем более это степень двойки (1 << 5) по-моему идеально кол-во человек чтобы взять:)

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Их же 42, разве нет? А с неофициальными — 51.

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      32 Россия Poohlyash_ТаТаРиН Team: dani_bw, TaTaPiH 32203.507 33 Украина МАМОЧКА НА САНОЧКАХ: pisos_pro, Mem4ik 32196.96

      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        32196.96 > 32000, верно?

        • »
          »
          »
          »
          »
          8 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          сейчас я понял что ничего не понял, бывает, как я вообще мог это написать)) извини