Какие алгоритмы вычисляют направления от точки A к точке B на карте?

Это позволит получить все файлы в пути / в / файлы с расширением .swf в массив, а затем отсортировать этот массив по файлу mtime

$files = glob('path/to/files/*.swf');
usort($files, function($a, $b) {
    return filemtime($a) < filemtime($b);
});

. В приведенном выше примере используется функция лямбда и требует PHP 5.3. До 5.3 вы делали бы

usort($files, create_function('$a,$b', 'return filemtime($a)

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

С результирующим массивом вы затем перебирали файлы следующим образом:

foreach($files as $file){
    printf('
            %1$s
            %2$s', 
            $file, // or basename($file) for just the filename w\out path
            date('F d Y, H:i:s', filemtime($file)));
}

Обратите внимание, что поскольку вы уже вызвали filemtime при сортировке файлов нет дополнительных затрат при повторном вызове в цикле foreach из-за кеша stat .

535
задан A. Rex 25 October 2010 в 21:30
поделиться

11 ответов

Разговор, поскольку кто-то, кто провел 18 месяцев, работая в отображающейся компании, которая включала работу над алгоритмом маршрутизации... да, Dijkstra , действительно работает с несколькими модификациями:

  • Вместо того, чтобы делать Dijkstra однажды от источника до dest, Вы запускаете в каждом конце и разворачиваете обе стороны, пока они не встречаются в середине. Это устраняет примерно половину работы (2*pi* (r/2) ^2 по сравнению с pi*r^2).
  • , Чтобы постараться не исследовать глухие переулки каждого города между Вашим источником и местом назначения, у Вас может быть несколько слоев данных карты: 'магистральный' слой, который содержит только магистрали, 'вторичный' слой, который содержит только вторичные улицы и т.д. Затем Вы исследуете только меньшие разделы более подробных слоев, расширяясь по мере необходимости. Очевидно, это описание не учитывает много детали, но Вы получаете идею.

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

513
ответ дан Michal Sznajder 26 October 2010 в 08:30
поделиться

Я вижу то, что произошло с картами в OP:

Взгляд на маршрут с промежуточной определенной точкой: маршрут идет немного назад из-за той дороги, которая не является прямой.

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

1
ответ дан Loren Pechtel 25 October 2010 в 21:30
поделиться
  • 1
    У меня есть matplotlib 1.1.0. Но я импортирую pylab на Mac поэтому, возможно, версия включенного matplotlib не 1.1.0, но я don' t konw, как быть уверенным в этом. – cedm34 12 January 2012 в 08:51

алгоритмы Графика как алгоритм Dijkstra не будут работать, потому что график огромен.

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

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

Однако мне также очень было бы интересно слышать о событиях других народов. Конечно, видные примеры как поиск Google Map особенно интересны. Я мог вообразить что-то как направленная самая близкая соседняя эвристика.

8
ответ дан Konrad Rudolph 25 October 2010 в 21:30
поделиться

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

, Учитывая, что это - приложение Google, также разумно предположить, что большое волшебство сделано через обширное кэширование.:) Я не был бы удивлен при кэшировании лучших 5%, наиболее распространенные запросы маршрута Google Map допускали большой блок (20%? 50%?) запросов, которым ответит простой поиск.

3
ответ дан Parappa 25 October 2010 в 21:30
поделиться

У меня были еще некоторые мысли об этом:

1) Помнят, что карты представляют физическую организацию. Сохраните широту/долготу каждого пересечения. Вы не должны проверять много вне точек, которые лежат в направлении Вашей цели. Только если Вы находите себя заблокированными, делают необходимо пойти вне этого. При хранении наложения превосходящих соединений, можно ограничить его еще более - Вы никогда не будете обычно идти через одного из тех способом, который уходит от Вашего конечного места назначения.

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

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

3
ответ дан Loren Pechtel 26 October 2010 в 08:30
поделиться
  • 1
    Обычный macports пользователь добавляет/opt/local/bin к их пути, прежде чем системные каталоги так дали Python выбором порта. У Вас, вероятно, есть он после. – Mark 16 March 2012 в 14:29

Этим вопросом была активная область исследования в прошлых годах. Основная идея состоит в том, чтобы сделать , предварительная обработка на графике однажды , к [1 111] убыстряются весь после запросов . С этой дополнительной информацией маршруты могут быть вычислены очень быстро. Однако, Алгоритм Dijkstra является основанием для всех оптимизаций.

Паукообразное насекомое описало использование двунаправленного поиска и граничного сокращения на основе иерархической информации. Эти методы ускорения работают вполне хорошо, но новые алгоритмы превосходят эти методы по характеристикам любой ценой. С текущими алгоритмами кратчайшие пути могут быть вычислены в значительном меньше времени, чем [1 114] одна миллисекунда на континентальной дорожной сети. Внедрение FAST неизмененного алгоритма потребностей Dijkstra приблизительно [1 115] 10 секунд .

Разработка статьи Быстрые Алгоритмы Планирования Маршрута дает обзор прогресса исследования в том поле. Посмотрите ссылки той бумаги для получения дополнительной информации.

самые быстрые известные алгоритмы не используют информацию об иерархическом состоянии дороги в данных, т.е. если это - магистраль или локальная дорога. Вместо этого они вычисляют на шаге предварительной обработки собственную иерархию, которая оптимизировала для ускорения планирования маршрута. Это предварительное вычисление может затем использоваться для сокращения поиска: Далеко от запуска и целевых медленных дорог не должен быть рассмотрен во время Алгоритма Dijkstra. Преимущества очень хороши производительность и правильность гарантия результата.

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

при необходимости в расстояниях кратчайшего пути для вычислений решения для TSP, затем Вы, вероятно, интересуетесь матрицами, которые содержат все расстояния между Вашими источниками и местами назначения. Для этого Вы могли рассмотреть Вычисления Кратчайшие пути Many-Many Используя Магистральные Иерархии . Обратите внимание на то, что это было улучшено более новыми подходами за прошлые 2 года.

107
ответ дан Jesse Rusak 26 October 2010 в 08:30
поделиться

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

4
ответ дан Marcin 26 October 2010 в 08:30
поделиться
  • 1
    Позвольте/opt/local/bin прибыть прежде/usr/bin. Установите путь, например, этот путь в .profile или .bash_profile: ПУТЬ =/opt/local/bin: $PATH, тогда или перезапускают Terminal.app или перечитывают файл, который Вы изменили. Ответ о том, как выбрать желаемый Python, найден здесь: stackoverflow.com/questions/6116697/… – boerre 19 March 2013 в 10:31

Я не работал над Google или Картами Microsoft или Yahoo прежде, таким образом, я не могу сказать Вам, как они работают.

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

Мы использовали технику под названием ACO (Оптимизация колонии муравьев), чтобы запланировать и направить грузовики. Эта техника является методом AI, который был применен к проблеме коммивояжера для решения проблем маршрутизации. Прием с ACO должен создать ошибочное вычисление, основанное на известных фактах маршрутизации так, чтобы модель решения графика знала, когда выйти (когда достаточно небольшая ошибка).

можно google ACO или TSP для нахождения больше на этой технике. Я не использовал ни одного из инструментов AI с открытым исходным кодом для этого однако, так не может предложить один (хотя я слышал, что РОЙ был довольно всесторонним).

9
ответ дан Bill 26 October 2010 в 08:30
поделиться

Просто обратившись к треугольным нарушениям неравенства, надо надеяться, дополнительным фактором, для которого они оптимизируют, является здравый смысл. Вы не обязательно хотите самый короткий или самый быстрый маршрут, поскольку он может привести к хаос и разрушение . Если Вы хотите, чтобы Ваши направления предпочли главные маршруты, которые благоприятны для грузовика и могут справиться с отправлением каждого sat-nav-following драйвера вниз их, Вы быстро отбрасываете треугольное неравенство [1].

, Если Y является узкой жилой улицей между X и Z, Вы, вероятно, только хотите использовать ярлык через Y, если пользователь явно просит X-Y-Z. Если они просят X-Z, они должны придерживаться главных дорог, даже если это немного далее и берет немного дольше. Это подобно парадокс Braess - если все пытаются следовать самым коротким, самым быстрым маршрутом, получающаяся перегрузка означает, что это не самый быстрый маршрут ни для кого больше. Отсюда мы отклоняемся от теории графов в теорию игр.

[1] На самом деле, любая надежда, что произведенные расстояния будут функцией расстояния в математическом смысле, умирает, когда Вы позволяете односторонние дороги и теряете требование симметрии. Потеря треугольного неравенства также просто втирает соль в рану.

18
ответ дан stevemegson 26 October 2010 в 08:30
поделиться
  • 1
    Извините, didn' t видят это прежде. Можно использовать также. Если Вы захотите добавить к текущим опциям, то Вы будете использовать + =. Если Вы хотите заменить опции, тогда просто используют =. – eltiare 2 April 2014 в 19:31

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

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

f(n) = k*h(n) + g(n)

, где k - некоторая константа больше 0.

6
ответ дан 22 November 2019 в 22:24
поделиться

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

7
ответ дан 22 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

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