Каков самый эффективный способ найти путь через график маленького мира?

строка является изображением SVG. Вы можете просто добавить строку в свой DOM, и вы увидите свой svg.

см .: https://jsfiddle.net/o2kyqxve/1/

\r\n
\r\n  \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n UXXWL94HXO08 

.

13
задан 15 revs, 6 users 79% 14 January 2009 в 21:27
поделиться

6 ответов

Общие сведения

Алгоритм Dijkstra и это оптимизировали вариант*, находят путь с минимальной стоимостью через Ваш график. Важные вещи a) определение Вашего графика правильно и b) определение соответствующей функции стоимости.

Перед лицом изменяющейся функции стоимости Dijksta требует, чтобы повторно вычислила решение.

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

Оптимизация Колонии муравьев, с другой стороны, кажется, намного более гибка в адаптации к изменяющейся функции стоимости путем продолжения повторения после того, как/в то время как функция стоимости изменится.

Эффективность

Это зависит очень от Вашей проблемной области. Если у Вас есть хорошая эвристика (см. раздел Complexity* статья), и редко стоят изменений затем, полиномиальное время выполнения * могло бы способствовать повторенным перерасчетам. ACO, с другой стороны, должен выполнить итерации много раз прежде, чем сходиться на приближенном решении. Если стоившие изменения происходят очень часто, продолжение повторения на постоянном уровне могло бы быть более эффективным, чем обновление A*-solution, так как информация сохраняется в состоянии алгоритма. ACO не обещает оптимальное решение, хотя и вероятно имеет более высокие затраты на запуск прежде, чем сходиться на "хорошее" решение. Снова это очень зависит от Вашего определенного домена, графика и функции стоимости, а также Ваших требований к оптимальности.

11
ответ дан 1 December 2019 в 20:44
поделиться

Разве общий Dijkstra не был бы достаточен?

http://improve.dk/generic-dijkstras-algorithm/

0
ответ дан 1 December 2019 в 20:44
поделиться

Обычно используемый алгоритм для этой проблемы* (Звезда), который является поиском алгоритма обобщенного Dijkstra с добавленной эвристикой - цель эвристики состоит в том, чтобы направить поиск к поисковой цели так, чтобы типичные поиски закончились быстрее.

Этот алгоритм имеет много вариантов, полученных версий и улучшений, поиск Google или страница Wikipedia должны быть хорошей начальной точкой.

7
ответ дан 1 December 2019 в 20:44
поделиться

С*, стоимость пути не должна быть постоянной, таким образом, Вы могли запустить со следующего графика:

A---1---B---1---C
|               |
\-------1-------/

где мы хотим пойти от до C. Первоначально, алгоритм нахождения пути выберет путь A-C, так как ABC равняется 2, тогда как A-C равняется 1. Мы можем добавить дополнительный термин к путям:

A---r---B---r---C
|               |
\-------r-------/

с

r(NM) = k(NM) + users(NM) / 10

где

r(NM) is the cost for a connection between N and M,
k(NM) is the constant cost for a connection between N and M,
users(NM) is the number of objects using the connection

Поскольку пользователи добавляются к системе, маршрут, A-C станет более дорогим, чем ABC в двадцати пользователях (1 + 20/10) = 3, ABC равняется 2. Когда пользователи удалены из системы, маршрут A-C станет наилучшим вариантом снова.

Действительная мощность* является эвристикой, которую Вы используете для вычисления стоимости каждого соединения.

8
ответ дан 1 December 2019 в 20:44
поделиться

Я услышал о реализации NN для обработки этого вида проблемы также. Таким образом, если Вы захотите использовать NNS, то Вы в конечном счете найдете свой путь ;-) но они должны быть нижними по сравнению с "генетическими алгоритмами".

Если бы вычислительное потребление / потребление времени являются проблемой, я высоко предложил бы использовать генетические алгоритмы. Это - точно тип проблем, в которых они являются исключительными.

ГАЗ основан на функции, которая описывает Вашу удовлетворенность для любого данного решения. Можно изменить эту функцию для удовлетворения потребностям (т.е. можно включать не, только соединяют каналом стоимость, но и любой фактор, которого Вы желаете).

0
ответ дан 1 December 2019 в 20:44
поделиться

Definitely A*.* или найдет лучший путь возможными или никакой путь вообще, если никакой путь не будет существовать. Например, путь этой лодки был вычислен с помощью*

A* Example on Game Map
(источник: cokeandcode.com)

Вот интерактивная Демонстрация Java для проигрывания с. Обратите внимание на то, что этот алгоритм замедлен снами, таким образом, Вы видите, что он работает. Без этого замедляются, это нашло бы путь в меньше, чем секунда.

Алгоритм прост, все же мощен. Каждый узел имеет 3 значения, g является стоимостью до этого узла. h является ориентировочной стоимостью от этого узла до цели, и f является суммой обоих (это - предположение для полного пути).* ведет два списка, Открытое и Закрытый список. Открытый список содержит все узлы, которые не были исследованы до сих пор. Закрытый список все узлы, которые были исследованы. Узел рассчитывает, как исследуется, если алгоритм уже протестировал каждый узел, подключенный к этому узлу (соединенный, мог бы только означать горизонтально и вертикально, но также и диагональ, если диагональные перемещения между узлами позволяются).

Алгоритм мог быть описан как

  1. Позвольте P быть начальной точкой
  2. Присвойте g, h, и f оценивает P
  3. Добавьте P к открытому списку (в этой точке P является единственным узлом в том списке).
  4. Позвольте B быть лучшим узлом из Открытого списка (лучше всего == самое низкое значение f)
    • Если B является узлом цели-> выход, Вы нашли путь
    • Если Открытый список пуст-> выход, никакой путь не существует
  5. Позвольте C быть допустимым узлом, подключенным к B
    • Присвойте g, h, и f к C
    • Проверьте, находится ли C в Открытом или Закрытом Списке
      • Если да, проверьте, является ли новый путь самым эффективным (более низкое f-значение)
        • Если так, обновите путь
      • Еще добавьте C к Открыть List
    • Повторите шаг 5 для всех узлов, подключенных к B
  6. Добавьте B к Закрытому списку (мы исследовали всех соседей),
  7. Повторитесь от шага 4.

Также взгляните на Википедию для деталей реализации.

3
ответ дан 1 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: