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

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

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

(sidenote: можно ли использовать нейронные сети здесь?)

Спасибо


Я смотрю ACO. Есть ли что-то лучше, чем ACO для такого рода проблем?


Вправо алгоритм A * находит самый дешевый или быстрый маршрут без балансировки нагрузки.

Предположим, что самый быстрый или самый короткий маршрут - не самый важный маршрут, что более важно, следуя пути, где взвешенные узлы имеют определенное значение. no1.

NO2. При использовании A * трафик на этом маршруте перегружается, а затем этот путь является избыточным. Так что, как класс A *, у него нет определенных функций, которые ACO, т.е. Встроенная балансировка нагрузки.

- если они не ошибаются и не поняты A *

Тогда что бьет ACO?


Это действительно похоже на шоу между ACO и A *, было так много положительных разговоров об A *, я, конечно, буду глубже погружаться в него.

Во-первых, в ответ на Давида; Я могу запустить симуляцию ACO на заднем плане и придумать лучший путь, так что да, есть начальная стоимость запуска, но, к счастью, запуск не является существенным. Поэтому я могу позволить себе несколько раз запускать симуляцию. Единственной реальной проблемой является поиск подключенных источников и узлов назначения. В то время как кажется, что A * сможет сделать это довольно легко. Теперь, что происходит, когда эта сеть становится ужасно большой, как в миллионах узлов. Будет ли A * легко масштабироваться?

Я продолжу исследование A *. Но я оставляю вам последний вопрос!

Будет ли A * иметь возможность масштабирования, а также Antnet (ACO)?

Ответы

Ответ 1

Общие примечания

Алгоритм Дейкстры и оптимизированный вариант A * найдет путь с "минимальной стоимостью" через ваш график. Важные вещи: a) правильное определение графика и б) определение соответствующей функции затрат.

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

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

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

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

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

Ответ 2

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

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

где мы хотим перейти от A к C. Изначально алгоритм поиска пути выбирает путь A-C, так как A-B-C равно 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

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

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

Ответ 3

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

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

Ответ 4

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

A * Пример карты игры http://www.cokeandcode.com/images/path1.png

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

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

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

  • Пусть P - начальная точка
  • Назначьте значения g, h и f для P
  • Добавить P в открытый список (в этот момент P является единственным node в этом списке).
  • Пусть B - лучший node из открытого списка (bist = наименьшее значение f)
    • Если B является целью node → quit, вы нашли путь
    • Если открытый список пуст → quit, не существует пути
  • Пусть C - действительный node, связанный с B
    • Назначить g, h и f в C
    • Проверьте, находится ли C в открытом или закрытом списке
      • Если да, проверьте, эффективен ли новый путь (более низкое значение f)
        • Если это так, обновите путь
      • Остальное добавить C в открытый список
    • Повторите шаг 5 для всех узлов, подключенных к B
  • Добавить B в закрытый список (мы изучили все соседи)
  • Повторите шаг 4.

Также ознакомьтесь с Wikipedia для деталей реализации.

Ответ 6

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

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

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