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

Автор ilyaraz, 13 лет назад, По-русски

Рассмотрим евклидову версию задачи TSP: на плоскости есть n точек, нужно построить цикл минимальной длины, который проходит через все точки ровно по одному разу.


Объявляется простой мини-конкурс: найти как можно лучшее решение для одного конкретного теста (в нем нет ничего особенного, это просто случайный тест из 100 точек).

Тест лежит здесь: http://pastebin.com/zYHSXXwE . В первой строке записано число точек, дальше записаны координаты самих точек.

Чужим кодом для решения TSP пользоваться запрещается. Ваши результаты и ссылки на найденные циклы (перестановка чисел от 0 до n - 1) пишите в комментариях.

Оптимальное решение: 7.83176. Первый нашедший -- ilyakor (с помощью http://pastebin.com/DiYcmPcw). Поздравляю! И спасибо всем, кто принял участие.

Предыдущие рекорды: 7.83935 by cmd7.88385 by cmd7.93560 by I_love_Nastya7.94123 by I_love_Nastya7.95026 by cmd8.10851 by cmd8.44558 by ilyakor, 9.00594 by ilyakor, 9.15607 by Jokser9.47153 by Jokser.
  • Проголосовать: нравится
  • +48
  • Проголосовать: не нравится

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

Явно не самое лучшее решение, но чтобы подогреть интерес, выложу:

9,47153439264957

50 25 7 79 4 20 58 49 84 63 70 80 98 75 39 22 59 69 31 65 64 52 29 81 1 97 12 66 88 82 15 94 74 73 6 27 78 92 2 36 8 18 33 55 9 37 45 44 17 28 85 43 62 91 83 19 10 38 46 48 26 54 0 42 60 95 68 86 34 30 41 77 90 13 61 35 72 24 87 96 71 5 56 53 89 21 40 16 93 14 32 57 99 76 51 11 47 23 67 3

Код:

http://pastebin.com/nzkBnfRe

  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Он же не все точки обошел. Должна получится перестановка чисел от 0 до n - 1.
    • »
      »
      »
      13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да, действительно не все. Опечатался в ccw, сейчас исправлю результат и код.
  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Может пока не выкладывать код? А то как-то возникает непреодолимое желание посмотреть код, до того как подумать...
    • »
      »
      »
      13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну код, чтобы доказать, что не с неба взял перестановку и ответ. А это решение - отстой, я нашел получше. Там код не буду выкладывать.
»
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Немного улучшил решение.

9,15606758132600

50 65 64 52 29 81 1 97 12 66 88 82 15 94 74 73 6 27 78 92 2 36 8 18 33 55 9 37 45 44 17 28 85 43 62 91 83 19 10 38 46 48 26 54 0 42 60 95 68 86 34 7 4 79 20 58 25 49 84 80 70 63 75 98 39 22 59 69 31 41 30 77 90 13 61 35 72 24 87 96 71 5 56 53 89 21 40 16 93 14 32 57 99 76 51 11 47 23 67 3

Код:

http://pastebin.com/d4eWA7z6
»
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А вообще к каким цифрам хоть стремиться? :)
»
13 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
Маленький совет для автора поста - имя юзера брать в квадратные, а не круглые скобки ;)
  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Большое спасибо, как раз искал, как это сделать, в посте MikeMirzayanov почему-то были круглые скобки.
    • »
      »
      »
      13 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится
      Это чтобы было видно что скобки вообще есть, а иначе бы текст заменился на ник :) Сам некоторое время тупил над этим..
»
13 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Совсем тупое решение получило 9.00594 (само решение: 32 57 11 47 51 23 76 99 67 3 98 75 39 22 80 84 49 58 25 7 20 4 79 14 93 16 48 26 21 89 53 0 54 56 5 87 24 42 60 68 72 35 61 13 34 90 77 69 31 65 50 64 52 29 81 1 97 66 12 88 82 94 74 18 33 15 8 36 2 6 92 78 27 73 86 95 85 43 62 91 83 19 10 46 38 40 96 71 28 17 44 45 37 55 9 30 41 59 70 63). До оптимума похоже далеко.

  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Вписал в пост!
    • »
      »
      »
      13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Небольшая модификация тупняка:
      8.44558
      33 18 74 94 82 15 8 36 2 6 92 78 27 73 86 61 13 34 90 77 69 31 65 50 64 52 29 81 66 12 88 97 1 30 41 59 22 80 84 49 58 25 7 20 4 79 32 57 11 47 51 23 76 99 67 3 98 75 39 70 63 14 93 16 48 26 21 89 53 0 54 56 42 60 68 72 35 95 24 87 5 71 96 40 46 38 10 19 83 91 62 43 85 28 17 44 45 37 55 9
      • »
        »
        »
        »
        13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Вписал в пост!
        • »
          »
          »
          »
          »
          13 лет назад, # ^ |
            Проголосовать: нравится +10 Проголосовать: не нравится
          Тупняк + простой чит:
          7.83176
          52 29 81 1 97 12 66 88 82 94 74 15 33 18 8 36 2 6 73 92 78 27 55 9 37 45 44 17 28 85 43 62 91 83 19 10 38 46 48 16 93 14 32 57 11 47 51 99 76 23 67 3 98 75 39 22 80 70 63 84 49 58 25 7 20 4 79 96 40 26 21 89 54 0 53 56 71 5 87 24 42 60 68 95 72 35 86 61 13 34 90 77 41 30 31 69 59 65 50 64
»
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
8.1085122432
86 61 13 34 90 77 69 31 30 41 73 6 92 2 36 8 18 33 15 74 94 82 88 66 12 97 1 81
29 52 64 50 65 59 80 22 39 75 98 3 67 23 76 99 51 47 32 57 11 63 70 84 49 58 25
7 20 4 79 14 93 16 40 96 71 5 87 24 60 42 56 53 0 54 89 21 26 48 46 38 10 19 83
91 62 43 85 28 17 44 45 37 9 55 27 78 95 68 72 35

  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    7.9502646673
    95 35 72 24 87 5 71 96 40 16 93 14 79 4 20 7 25 58 49 84 70 63 11 57 32 47 51 99
     76 23 67 3 98 75 39 22 80 59 69 31 65 50 64 52 29 81 12 66 88 97 1 30 41 77 90
    34 13 61 86 73 6 92 78 27 2 36 8 18 74 94 82 15 33 9 55 37 45 44 17 28 85 43 62
    91 83 19 10 38 46 48 26 21 89 54 0 53 56 42 60 68

    • »
      »
      »
      13 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится
      7.8838506584
      65 31 69 59 22 80 84 49 63 70 39 75 98 3 67 23 76 99 51 47 11 57 32 14 93 16 48
      46 38 10 19 83 91 62 43 85 28 17 44 45 37 55 9 33 15 82 94 74 18 8 36 27 78 92 2
       6 73 86 61 35 72 95 68 60 42 24 87 5 96 71 56 53 0 54 89 21 26 40 79 4 20 58 25
       7 13 34 90 77 41 30 1 97 88 66 12 81 29 52 64 50

      • »
        »
        »
        »
        13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
        7.8393456597
        17 28 85 43 62 91 83 19 10 38 46 48 16 93 14 32 57 11 47 51 99 76 23 67 3 98 75
        39 70 63 49 84 80 22 59 69 31 65 50 64 52 29 81 12 66 88 97 1 30 41 77 90 34 13
        7 25 58 20 4 79 96 40 26 21 89 54 0 53 56 71 5 87 24 42 60 68 95 72 35 61 86 73
        6 2 92 78 27 36 8 18 74 94 82 15 33 9 55 37 45 44

»
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
7.94123
13 61 86 35 72 95 68 60 42 24 87 5 71 56 53 0 54 89 21 26 40 96 79 4 20 7 25 58 49 84 63 70 80 22 59 65 69 31 1 97 88 66 12 81 29 52 64 50 39 75 98 3 67 76 99 23 51 47 11 57 32 14 93 16 48 46 38 10 19 83 91 62 43 85 28 17 44 45 37 55 9 33 15 18 74 82 94 8 36 2 27 78 92 6 73 30 41 77 90 34
  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    7.9355987313226241959
    75 39 22 80 70 63 84 49 58 25 7 20 4 79 40 26 21 89 54 0 53 56 71 96 5 87 24 42 60 68 95 78 27 92 8 36 2 6 73 86 35 72 61 13 34 90 77 41 30 31 69 59 65 50 64 52 29 81 1 97 12 66 88 82 94 74 18 15 33 9 55 37 45 44 17 28 85 43 62 91 83 19 10 38 46 48 16 93 14 32 57 11 47 51 99 76 23 67 3 98
»
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Не так давно был пост на хабре про муравьиные алгоритмы, решил сегодня испробовать..
Мои глупые мурашки смогли максимум 8.26157 набегать за это время :)
  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Наилучшая известная эвристика, которая решает точно почти все тесты -- это локальные оптимизации + генетические алгоритмы. :)
    • »
      »
      »
      13 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится
      А как Вы, товарищ автор, постановили что оптимум именно такой? :)
      • »
        »
        »
        »
        13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А об этом вы узнаете, когда я досдам, наконец, сессию и напишу про это пост. Ну а если хочется сейчас, то читайте на http://www.tsp.gatech.edu/ и смотрите на http://github.com/ilyaraz/toy_tsp.

        Да, общественность в лице ilyakor интересуется вашим кодом. Можете на pastebin выложить?
        • »
          »
          »
          »
          »
          13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Пожалуйста http://pastebin.com/fTn2xEYk, вдруг кто глупых ошибок найдёт, ведущих к выводу расстояния чуть большего чем есть на самом деле ;)
    • »
      »
      »
      13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      На беларуской республиканской олимпиаде на пробном туре дают каждый год комивояжера зарешать с частичной оценкой в зависимости от того насколько результат близок к оптимальному. Товарищ tourist долго приближался к fullscore и то ли в прошлом то ли в позапрошлом году таки смог набрать 100, на сколько мне известно локальными оптимизациями. Так что было бы интересно услышать/увидеть его мнение/код по этой задаче :)
      • »
        »
        »
        »
        13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А какие ограничения?
        • »
          »
          »
          »
          »
          13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          50 вроде, насчет рандомности не знаю, но на глаз тесты не были похожи на ручные :)
      • »
        »
        »
        »
        13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Тут был рандомный инстанс, его решить просто. (Ну т.е. моё решение - немного рандомизированная жадность, с 2-opt локальными улучшениями (т.е. рассматриваются рёбра i-i0 и j0-j, если перестроить их на i-j и i0-j0 оптимальнее, - то перестраиваем); аналогично можно сделать 3-opt, 4-opt, ...).

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

        Так что интересно, рандомные ли были входные данные на беларуской олимпиаде. И если нет - что tourist такое крутое придумал, что смог эффективно их решать :)
»
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Илья, тупой вопрос, но тут ещё много раз его зададут: откуда ты знаешь что данное решение оптимально?
»
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
7,93446853282123
66 12 81 29 52 64 50 65 31 69 59 22 80 84 49 63 70 39 75 98 3 67 23 76 99 51 47 11 57 32 14 79 4 20 58 25 7 61 35 72 95 68 60 42 24 87 5 56 0 54 53 71 96 89 21 26 40 16 93 48 46 38 10 19 83 91 62 43 85 28 17 44 45 37 55 9 33 15 82 94 74 18 8 36 2 92 27 78 6 73 86 34 13 90 77 41 30 1 97 88

Код выложу в случае надобности. Пока скажу лишь, что использовал свою курсовую трёхлетней давности - там немаленький проект на C#.
  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    О чем курсовая? Эвристики для TSP?
    • »
      »
      »
      13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Решение TSP алгоритмом муравья.

      Кстати, если поиграться с параметрами алгоритма, можно и улучшить решение:
      7,84878460538378
      81 1 97 12 66 88 82 94 74 15 33 18 8 36 2 6 73 92 78 27 55 9 37 45 44 17 28 85 43 62 91 83 19 10 38 46 48 16 93 14 32 57 11 47 51 99 76 23 67 3 98 75 39 22 80 70 63 84 49 58 25 7 20 4 79 96 71 40 26 21 89 54 0 53 56 5 87 24 42 60 68 95 72 35 86 61 13 34 90 77 41 30 31 69 59 65 50 64 52 29

      Ещё чуть-чуть и будет как авторское :)
      • »
        »
        »
        »
        13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        О, а какие конкретно параметры? Я чтото не смог доиграться но нужного уровня :)
        • »
          »
          »
          »
          »
          13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Там есть ряд эвристик, таких как ant colony strategy, elitist, min-max strategy, detection... У них есть свои параметры.
          Обычно на контестах я пишу без эвристик минут за 15-20 и неплохо заходит.