Давши список балів, знайдіть найкоротший шлях, який відвідує всі точки і повертається до початкової точки.
завдання комівояжера добре відома в області науки комп'ютера, як і багато інші способи розрахунку / наближають його. Це вирішено для дуже великих груп балів, але для деяких найбільших потрібен багато процесорних років.
Картопля не спалиться.
Гаряча картопля - це гра, в якій 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 буде включений у суддівство, і він не сутулиться, тому принесіть свою А-гру.
Різне
Ви не можете зберегти інформацію про стан, і кожен виток - це окремий запуск вашої програми. Єдина інформація, яку ви будете отримувати кожного кроку, - це набір балів.
Ви не можете використовувати зовнішні ресурси. Сюди входять мережеві дзвінки та доступ до файлів.
Ви не можете використовувати функції бібліотеки, розроблені для вирішення / допомоги проблеми TSP або її варіантів.
Ви не можете жодним чином маніпулювати або перешкоджати іншим гравцям.
Ви не можете жодним чином керувати програмою управління або будь-якими включеними класами чи файлами або втручатися в них.
Дозволено багаторізне нанизування.
Одне подання на користувача. Якщо ви подасте більше одного запису, я введу лише перший поданий. Якщо ви хочете змінити подання, відредагуйте / видаліть оригінал.
Турнір буде проходити на Ubuntu 13.04, на комп’ютері з процесором i7-3770K та 16 Гб оперативної пам’яті. Він не буде запускатися в VM. Все, що я сприймаю як шкідливе, негайно дискваліфікує поточний та будь-який майбутній запис, який ви подаєте.
Усі записи повинні бути виконані з командного рядка з вільним ( як у пиві ) програмним забезпеченням. Якщо у мене є проблеми зі складанням / запуском вашого запису, я попрошу допомогу в коментарях. Якщо ви не відповісте або я не можу в кінцевому підсумку запустити його, він буде дискваліфікований.
Результати (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 переміг у галочці. Не дозволяйте це відштовхувати вас від участі, оскільки я буду проводити турнір у міру того, як з'являться більше учасників і відповідно змінять прийняту відповідь.