Запрос алгоритма для поиска N рыцарей глобального кратчайшего пути

#algorithm #chess #shortest

#алгоритм #шахматы #кратчайший

Вопрос:

Я столкнулся с любопытной проблемой.

У меня есть неограниченная шахматная доска, N начальных местоположений рыцарей и N целевых местоположений.

Задача состоит в том, чтобы найти минимальное количество ходов для всех рыцарей, чтобы достичь всех целевых местоположений.

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

Извините за мой английский, я использую его редко.

Комментарии:

1. Стемплинг: как спотыкание, но хардкорное .

Ответ №1:

Вы можете вычислить матрицу затрат, как предложил Рики, используя поиск в ширину. итак, стоимость [i] [j] обозначает стоимость выбора рыцаря i для перехода в конечное местоположение j. Затем вы можете использовать венгерский алгоритм для поиска окончательного ответа, который может быть вычислен в сложности O (N ^ 3).

Ответ №2:

Я предполагаю, что вы знаете, как это сделать для одного Knigt.

Вы можете переформулировать свою задачу в виде линейной программы:

Я буду использовать следующие обозначения :

У нас есть N рыцарей и N местоположений en.

xij = 1 если вы выбрали коня i для перехода в местоположение j и 0 в противном случае

cij минимальная длина перемещения коня i в местоположение j

Тогда у вас есть следующая линейная программа :

переменные:

xij для i j в [0, N]

Функция стоимости :

C = SUM(cij.xij для (i, j) в [0,N] x [0, N])

ограничения:

СУММА (xij для j в [1, N]) = 1 // ровно одна книга переходит от i к j

СУММА (xij для i в [1, N] ) = 1

(Матрица (xij) является случайной матрицей)

если X является матрицей (xij), у вас есть n! возможная матрица. Эта проблема может быть NP-сложной (для этой системы нет простого решения, решение системы очень похоже на тестирование всех возможных решений).


Редактировать:

Эта проблема называется проблемой присваивания, и существует несколько алгоритмов для ее решения за полиномиальное время . (проверьте ответ @purav для примера)

Как упоминалось @Purav, хотя такого рода проблемы могут быть NP-сложными, в этом случае их можно решить за O (n ^ 3)




О проблеме, поднятой @j_random_hacker :

Проблема

Если рыцарь находится в конечной точке, следующие рыцари не должны проходить через эту конечную точку. Таким образом, Cij может потребоваться обновить после перемещения каждого коня.

Примечания :

1. несколько оптимальных путей :

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

Пример с 2 рыцарями

Допустим, у вас есть 2 K и 2 конечные точки (‘x’), оптимальный путь нарисован.

     -x
   |
   | 
   x
   |
K-- --K
  

вы перемещаете нужное K в первую точку (1 ход), вторая не может использовать оптимальный путь.

     -x
   |
   |  
   K
   |
K-- --:
  

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

    --K
  |
 -    
|   K
|   |
:    --:
  

и любая комбинация путей работает :

1 U 2 R, затем 2 U 1 R и т. Д. … До тех пор, пока я сохраняю одинаковое количество ходов ВВЕРХ, ВЛЕВО, ВПРАВО и ВПРАВО, и что они действительны.

2. порядок, в котором перемещаются кони :

Во-вторых, я могу выбрать порядок своего хода.

пример:

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

     -K
   |
   | 
   x
   |
:-- --K


    -K
   |
   | 
   K
   |
:-- --:
  

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

Комментарии:

1. @j_random_hacker по поводу вашего первого возражения я написал «в целом», что, я думаю, верно. Но в данном случае это может быть не так, я не говорил, что это невозможно решить за полиномиальное время. Я должен был выкопать это больше. спасибо за ваши комментарии, я собираюсь отредактировать свой пост.

2. Это улучшение 🙂 Но есть еще несколько проблем. Алгоритмы для задачи о назначении не являются линейным временем, как вы утверждаете — согласно Википедии, наиболее известным является O (n ^ 3) (как вы сами говорите). Чтобы понять, почему ошибочно говорить, что каждая проблема IP является NP-трудной, подумайте, что вы можете сформулировать даже очень простые задачи (например, выбор максимального числа n) как проблему IP — очевидно, что ее можно решить за линейное время! Также недостаточно сказать, что «маловероятно», что одному рыцарю придется обойти другого — вам нужно доказать, что этого не может быть…

3. … поскольку в противном случае весь ваш подход дает вам нижнюю границу стоимости кратчайшего пути (т. Е. Он может сообщать о стоимости, которая ниже любого фактического кратчайшего пути). В этом случае я уверен, что это можно доказать. Вот схема: учитывая решение, «перематывайте» ходы с конца, пока не увидите ход коня, который не соответствует некоторому кратчайшему пути между его начальной и конечной точками. Предположим, что этот конь — x, а ход — от a до b, и что последнее пристанище x — p . Тогда причина, по которой x ушел «со своего пути», должна быть в том, что все остальные квадраты на кратчайших путях…

4. … между a и p заняты другими рыцарями. Выберите одного из этих других рыцарей произвольно (назовите его y). Теперь мы можем построить другое решение, в котором y переходит в p вместо x, потому что мы знаем, что y «в чистом виде», и нам все равно, какой конь на самом деле заканчивается на p, если какой-то конь делает. Итак, в этом новом решении y движется к p, оставляя свободным квадрат, на который теперь может переместиться x, поскольку он направляется к исходному месту отдыха y (т. Е. Позиции рыцарей x и y будут поменяны местами в окончательном решении). Вы можете продолжать перематывать и повторять это по мере необходимости до тех пор, пока…

5. … вы получаете решение, в котором каждый конь движется по кратчайшему пути к некоторому конечному квадрату. На самом деле в этом эскизе доказательства есть некоторые пробелы (например, действительно ли y «в чистоте»), но я думаю, что их можно было бы решить (или, может быть, кто-то может придумать гораздо более простую стратегию доказательства!) Боюсь, моя последняя жалоба заключается в том, что я вообще не могу разобрать ваше последнее предложение. Хорошо, извините за стену текста!

Ответ №3:

BFS все еще может работать здесь. Вам нужно немного настроить свои состояния, но это все равно будет работать:

пусть S — множество возможных состояний:
S={((x1,y1),(x2,y2),...,(xn,yn))|knight i is in (xi,yi)}

Для каждого s в S определите:
Successors(s)={all possible states, moving 1 knight on the board}

Ваши целевые состояния — это, конечно, все перестановки ваших целевых точек [на самом деле вам не нужно разрабатывать эти перестановки, просто проверьте, достигли ли вы состояния, в котором все квадраты «заполнены», что легко проверить]

start=(start_1,start_2,...,start_n) где start_i — начальное местоположение коня i.

Запуск BFS из start [начальной позиции каждого коня] гарантированно найдет решение, если оно существует [потому что BFS завершена]. Это также гарантированно будет кратчайшим возможным решением.

(*) Обратите внимание, что случай с одним рыцарем является частным экземпляром этого решения с n = 1.

Хотя BFS будет работать, это займет много времени! коэффициент ветвления здесь равен 4n, поэтому алгоритму потребуется разработать O((4n)^d) вершины, где n — количество рыцарей, а d — количество шагов, необходимых для решения.

Возможные оптимизации:

  1. Пробел: обратите внимание, что, поскольку BFS использует много памяти [ O((4n)^d) ], вы можете захотеть использовать итеративное углубление DFS, которое ведет себя как BFS, но потребляет гораздо меньше памяти [ O(nd) ], но требует больше времени для запуска.
  2. Время: Для ускорения поиска решения вы можете использовать звезду с допустимой эвристической функцией. Также гарантируется поиск решения, если оно существует, а также гарантирует, что найденное решение является оптимальным, и, вероятно, [с хорошей эвристикой] потребуется развивать меньше вершин, чем BFS.

Ответ №4:

Итак, я нашел решение.

BFS не будет хорошо работать на неограниченной шахматной доске. Нет смысла использовать какой-либо алгоритм кратчайшего пути — количество ходов коня от местоположения a до местоположения b может быть вычислено за O (1) время — M. Деза, Словарь расстояний, стр. 251

http://www.scribd.com/doc/53001767/Dictionary-of-Distances-M-Deza-E-Deza-Elsevier-2006-WW

Проблема назначения может быть решена с использованием алгоритма mincost-maxflow (например. Эдмондс-Карп):

http://en.wikipedia.org/wiki/Edmonds–Karp_algorithm