Блог пользователя dev_il

Автор dev_il, 14 лет назад, По-русски
Как вы решаете задачи с Марафона?? Хотелось бы услышать от опытных в этом деле людей какие-нибудь полезные советы, идеи. А то надоедает каждый раз читая таску с Марафона думать лишь о полном переборе =) .. Буду очень рад услышать ваши советы
  • Проголосовать: нравится
  • +15
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Хороший вопрос, поддерживаю. Лично я участвовал один раз, впрочем, не очень плохо. Решал такую задачу. Пользовался генетическим алгоритмом. Ключевым моментом была скорость создания новых особей - соптимайзив ее почти до максимума, получилось добраться из середины почти до top10. В этом помогли, во-первых, некоторые навыки ДП (как ни странно) и, во-вторых, большое количество эвристик. Ассемблерных вставок и прочих извращений не использовал, хотя и STL тоже. Так что этот метод может быть вполне юзабельным.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
а можно поконкретнее? как пользовался генетическим алгоритмом? .. или мне почитать про эти алгоритмы и всё станет ясно?? .. просто я открыл вики, и мне показалось что там как-то совсем абстрактно про это. разве нет?

  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Лучше сначала почитать про метод отжига. Генетический алгоритм, грубо говоря, достигает результатов похожим способом
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

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

1) Просто повернуть одну в некоторой точке. Это будет мутация.

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

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

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

  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Таким образом, выделяются самые важные части - адекватная минимизируемая функция, быстрое получение ее значений и быстрое получение новых экземпляров.
    Когда я решал Planarity, у меня все уперлось в быстрое нахождение количества пересечений ребер - т.е. в получение значений функции. У OBepkJloEP ключевым моментом была скорость создания нового экземпляра. В некоторых задачах бывает сложно понять, что именно надо оценивать, чтобы добиться желаемого результата.
    Как я понял, аналогичным образом решаются процентов 70-80 марафонов. В остальных случаях, конечно, надо закапываться в теорию, но подчас это не так эффективно. С тем же Planarity, я перерыл с десяток статей по рисованию графов, которые либо сводились к простым методам оптимизации (имитация отжига, генетические алгоритмы), которые для успеха надо было лишь нормально подогнать к ограничениям, либо были слишком узкоспециализированные и сложные и вообще не подходили к задаче
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А как ты сводил задачу к генетическому алгоритму? Я в вики прочитал что нужно решение закодировать с помощью вектора (генотип) и уже с ним проводить всякие манипуляции (скрещивание, мутации). Ты тоже так делал?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      посмотрел Planarity твоё. Возникли следующие вопросы.
      1. У тебя вроде немного поинтов там. Чем это обосновано? Что-то не так в генетическом алгоритме (в плане что-то долго вычисляется) ? Просто интересно нормально ли то, что у тебя не очень много поинтов и можно ли твой сабмит улучшить.
      2. Почему переписывал на плюсах ) ? думал будет намного быстрее?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я с самого начала полез не в ту степь (начал искать чудо-методы) - потратил кучу времени на это.
        Далее, там, насколько мне помнится, коряво написан сам генетический алгоритм (застревает на локальном максимуме и не идет дальше). Плюс очень медленно выполняется подсчет числа пересечений (кажется, за четвертую степень).
        На плюсах - посмотреть, сравнить скорость, ага))
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
этот вопрос задай лучше Андрею Лопатину, он аццкий батька в этом деле))))
я думаю, марасонить не так то просто, чтобы что-то умное кодить, нужно в теории прошариться как следует ;-)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    хм =) .. хороший совет. только он действительно означает что мне нужно ему его задать или ты просто хотел просветить нас всех насчёт его? На кодфорсе его ведь вроде нет + думаю он человек занятой, чтобы мне взять и что-то объяснять.. А тут как раз люди специально на кодфорс заходят, обсуждения устраивают
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Сам в Марафонах никогда хорошо не участвовал.
Общался с одним чуваком, который на них неплохо укатывал, и один раз был в шаге от ТЦО. Он использует всегда генетические алгоритмы.

Я думаю на самом деле что большинство участников используют генетические алгоритмы. Но я не изучал вопрос - это только предположение.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Ну, в любом случае, после каждого марафона в разделе, ему посвященном, открывается тема "Post your approach", где можно ознакомиться с идеями лидеров
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Из моего не слишком большого опыта в марафонах(12 контестов) сложилось следующее впечатление: есть два больших класса задач: оптимизационные(где надо что-нибудь минимизировать/максимизировать и есть возможность оценки своего решения) и всё остальное.
В оптимизационных задачах обычно используют стандартные методы(генетические алгоритмы, имитация отжига и т.п.), а для прохождения в топ нужно использовать всяческие умные ускорения, как асимптотические, так и неасимптотические, и различные эвристики. Такими были, например, первые два раунда последнего ТСО. Еще был случай(Nasa Topcoder Challenge), когда очень и очень неплохие результаты давала обычная динамика. Но всё-таки к таким задачам подход вполне однообразный.
Среди остальных же задач встречается всякое, различные ИИ, дешифрование, поиск различных вещей , ну и вообще почти всё что угодно:) Здесь нужно хорошенько поработать над задачей и искать интересные идеи. Для меня показателен пример контеста про разбитую плитку, где можно было получить баллов 90 из 100 максимальных просто рассмотрев, как строятся тесты, и сделав соответственный прекалк.
Вообще, обычно в марафонах рулят хорошие свои идеи, стандартные алгоритмы если и встречаются, то только как кусочек задачи. Поэтому подход к каждой задачке свой, хотя, думаю, опыт "красных" тоже им неплохо помогает:)