Учитывая список точек, найдите кратчайший путь, который посещает все точки и возвращает к начальной точке.
Задача коммивояжера хорошо известна в области компьютерных наук, как и многие способы ее расчета / аппроксимации. Это было решено для очень больших групп точек, но для некоторых из самых больших требуется много лет процессора.
Не обжечься картошкой.
Hot Potato - игра, в которой 2+ игрока раздают «картошку» по кругу, пока играет музыка. Цель состоит в том, чтобы быстро передать его следующему игроку. Если вы держите картошку, когда музыка останавливается, вы ушли.
Объектом продаж горячего картофеля является:
Учитывая набор из 100 уникальных точек , верните эти точки в лучшем порядке ( более короткое общее расстояние, как определено ниже ). Это «передаст» проблему следующему игроку. Они должны улучшить его и передать следующему, и т. Д. Если игрок не может улучшить его, он уходит и игра продолжается до тех пор, пока не останется один игрок.
Чтобы это не было соревнованием "грубой силы-меня-пути", существуют следующие условия:
Вы не можете занять больше одной минуты, чтобы передать картофель. Если к моменту истечения одной минуты вы не нашли и не приняли более короткое решение, значит, вы вышли.
Вы не можете изменить положение более 25 очков. Точнее,
>= 75
очки должны быть в том же положении, в котором вы их получили. Неважно, какие из них вы решите изменить, а только сумму, которую вы меняете.
Когда остается только один игрок, он становится победителем этой игры и получает одно очко. Турнир состоит из 5*n
игр, где n
указано количество игроков. Каждую игру начальный игрок будет вращать , а оставшийся игрок будет перетасовываться . Игрок с наибольшим количеством очков в конце является победителем турнира. Если турнир заканчивается ничьей за первое место, новый турнир будет сыгран только с этими участниками. Это будет продолжаться, пока не будет галстука.
Начинающий игрок в каждой игре получит набор случайно выбранных очков в произвольном порядке.
Точки определяются как пара целочисленных x,y
координат на декартовой сетке. Расстояние измеряется с помощью Manhattan расстояние , |x1-x2| + |y1-y2|
. Все координаты будут лежать в [0..199]
диапазоне.
вход
Ввод дается с одним строковым аргументом. Он будет состоять из 201 целых чисел, разделенных запятыми, представляющих количество текущих игроков ( m
), и 100 очков:
m,x0,y0,x1,y1,x2,y2,...,x99,y99
Порядок этих точек является текущим путем. Общее расстояние получается путем сложения расстояния от каждой точки до следующей ( dist(0,1) + dist(1,2) + ... + dist(99,0)
). Не забудьте вернуться к началу при расчете общего расстояния!
Обратите внимание, что m
это не количество игроков, которые начали игру, а число, которое все еще в игре.
Выход
Вывод дается так же, как ввод, минус m
; единственная строка, содержащая целые числа через запятую, представляющие точки в их новом порядке.
x0,y0,x1,y1,x2,y2,...,x99,y99
Управляющая программа будет ожидать выхода только в течение одной минуты. Когда получен вывод, он проверит, что:
- выход хорошо сформирован
- вывод состоит из только и все эти 100 точек представить на входе
>=75
точки находятся в исходном положении- длина пути меньше, чем предыдущий путь
Если какая-либо из этих проверок не удалась (или нет выходных данных), вы вышли, и игра перейдет к следующему игроку.
Программа управления
Вы можете найти управляющую программу по этой ссылке . Сама управляющая программа является детерминированной и размещена с фиктивным семенем 1
. Семя, используемое во время подсчета очков, будет другим, поэтому не пытайтесь анализировать списки очередей / точек поворота, которые оно выплевывает.
Основной класс есть Tourney
. Выполнение этого сделает полный турнир с участниками, приведенными в качестве аргументов. Он выплевывает победителя каждой игры и подсчет в конце. Пример турнира с двумя SwapBots выглядит так:
Starting tournament with seed 1
(0) SwapBot wins a game! Current score: 1
(1) SwapBot wins a game! Current score: 1
(1) SwapBot wins a game! Current score: 2
(1) SwapBot wins a game! Current score: 3
(0) SwapBot wins a game! Current score: 2
(1) SwapBot wins a game! Current score: 4
(1) SwapBot wins a game! Current score: 5
(1) SwapBot wins a game! Current score: 6
(1) SwapBot wins a game! Current score: 7
(1) SwapBot wins a game! Current score: 8
Final Results:
Wins Contestant
2 (0) SwapBot
8 (1) SwapBot
Если вы хотите протестировать только одну игру за раз, вы можете Game
вместо этого запустить класс. Это запустит одну игру с игроками в порядке, указанном в качестве аргументов. По умолчанию, он также будет печатать игру за игрой, показывая текущий игрок и длину пути.
Также включены несколько тестов игроков: SwapBot
, BlockPermuter
и TwoSwapBot
. Первые два не будут включены в оценки, поэтому не стесняйтесь использовать и злоупотреблять ими во время тестирования. TwoSwapBot
будет включен в судейство, и он не сутулятся, так что возьмите свою A-игру.
альманах
Вы не можете сохранить информацию о состоянии, и каждый ход - это отдельный прогон вашей программы. Единственная информация, которую вы будете получать каждый ход - это набор очков.
Вы не можете использовать внешние ресурсы. Это включает в себя сетевые вызовы и доступ к файлам.
Вы не можете использовать библиотечные функции, предназначенные для решения / помощи с проблемой TSP или ее вариантами.
Вы не можете манипулировать другими игроками или мешать им.
Вы не можете манипулировать или вмешиваться в управляющую программу или любые включенные классы или файлы каким-либо образом.
Многопоточность разрешена.
Одно представление на пользователя. Если вы отправите более одной заявки, я введу только первую отправленную. Если вы хотите изменить свое представление, отредактируйте / удалите оригинал.
Турнир будет проходить на Ubuntu 13.04, на компьютере с процессором i7-3770K и 16 ГБ оперативной памяти. Он не будет работать в ВМ. Все, что я считаю злонамеренным, немедленно дисквалифицирует вашу текущую и будущую заявку.
Все записи должны запускаться из командной строки с бесплатным ( как в пиве ) программным обеспечением. Если у меня возникнут проблемы с компиляцией / запуском вашей записи, я буду просить помощи в комментариях. Если вы не ответите или я не смогу его запустить, он будет дисквалифицирован.
Результаты (22 мая 2014 г.)
Новые результаты в! UntangleBot довольно разумно обошел конкурентов. TwoSwapBot одержал семь побед, и SANNbot также одержал победу. Вот табло и ссылка на необработанный вывод :
Wins Contestant
22 (2) ./UntangleBot
7 (0) TwoSwapBot
1 (5) SANNbot.R
0 (1) BozoBot
0 (3) Threader
0 (4) DivideAndConquer
Как она стоит прямо сейчас , UntangleBot выиграл галочка. Не позволяйте этому отговорить вас от участия, так как я буду проводить турнир по мере появления большего количества участников и соответственно изменяю принятый ответ.