Самый быстрый путь с ускорением в точках

Это просто то, что я придумал сам, но это кажется забавной проблемой, и это меня поставило в тупик.

У вас есть набор точек в двухмерном пространстве, одна из которых обозначена как «Начало», а другая - «Конец». Каждая точка имеет координаты (в метрах от начала координат), а также «число ускорения» (в метрах / секунду дельта-V). Достигнув точки (включая начало), вы можете ускориться на величину ускорения до этой точки в любом направлении. Стоимость Edge зависит от вашей текущей скорости, но вы также должны двигаться в правильном направлении.

Есть ли эффективный алгоритм поиска кратчайшего пути до конечной точки? Я не придумал ничего лучше, чем «Попробуйте каждый путь и проверьте результаты». Алгоритмы Джикстры и другие простые алгоритмы не работают, потому что вы не можете легко сказать, что один путь к промежуточной точке лучше или хуже, чем другой, если они прибывают с разными начальными скоростями.

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

РЕДАКТИРОВАТЬ: Чтобы было ясно, направление имеет значение. Вы поддерживаете вектор скорости при перемещении по графику, а ускорение означает добавление к нему вектора, величина которого ограничена числом ускорения в этой точке. Это означает, что есть ситуации, когда создание огромной скорости пагубно, так как вы будете двигаться слишком быстро, чтобы «направиться» к другим ценным точкам / пункту назначения.


person Edward Peters    schedule 02.07.2016    source источник
comment
Вам нужно будет предоставить более подробную информацию. Как бы работала ваша концепция ускорения? Снижает ли он все граничные затраты на пути за счет числа ускорения? Что, если вы накапливаете ускорение, намного превышающее крайние затраты? Введение такой концепции, как ускорение, предполагает, что было бы неплохо ввести соответствующую идею трения / сопротивления, иначе вы можете получить неконтролируемую скорость. Пока я не думаю, что ваш вопрос достаточно ясен, чтобы мы могли сформулировать правильное решение, но считаю ли я его очень интересным.   -  person lightalchemist    schedule 02.07.2016
comment
Я сомневаюсь, что у этой проблемы есть аналитическое решение. Я бы начал с решения гораздо более простой задачи: наибыстрейшего маршрута, который берет точки в заданном порядке. (Это пространство поиска имеет количество измерений, равное количеству промежуточных точек, и я не вижу подхода лучше, чем отжиг.) Когда у вас есть этот метод, вы можете создать модифицированный метод Дейкстры.   -  person Beta    schedule 02.07.2016
comment
@lightalchemist Под ускорением я подразумеваю изменение скорости. (Итак, стоимость края = евклидово расстояние / скорость, но разрешено только в том случае, если вы путешествуете в правильном направлении ... так что) Неконтролируемая скорость - это нормально (это должно быть математической головоломкой, а не симуляцией ... хотя я это сделал изначально представьте это для космического корабля, собирающего тайники с топливом, так что трение все равно не будет проблемой.)   -  person Edward Peters    schedule 02.07.2016
comment
@Beta Хм ... да, даже если вы знаете порядок, есть некоторые вопросы о том, какие значения вы хотите использовать в каждой точке. Хорошая подзадача. Я не думаю, что это позволит модифицировать Джикстры, потому что вы все равно не сможете выбрать ближайшую точку.   -  person Edward Peters    schedule 02.07.2016
comment
Если можно достичь только конечного числа различных возможных векторов ускорения, то это очень похоже на игру Vector Racetrack, которую я решил здесь: stackoverflow.com/a/6598303/47984. Короче говоря, вы можете решить его с помощью Дейкстры, но в пространстве состояний, где у вас есть вершина для каждой комбинации (местоположение, вектор скорости входа), а не только для каждого местоположения.   -  person j_random_hacker    schedule 02.07.2016
comment
@j_random_hacker Я думал, что у вас будет бесконечное количество возможных векторов ускорения, но я считаю, что вы могли бы разбить его на диапазоны, где каждая точка в диапазоне чисто хуже, чем точка в верхней части этого диапазона, поэтому вы бы только приходится рассматривать конечное число. Однако это может быть очень большое конечное число.   -  person Edward Peters    schedule 04.07.2016
comment
Понятно. Мне также кажется, что этих заслуживающих внимания векторов может оказаться ограниченное число, но найти их может быть сложно.   -  person j_random_hacker    schedule 04.07.2016
comment
Это несколько похоже на недавно заданную проблему марафона Topcoder: community.topcoder.com / longcontest /   -  person uSeemSurprised    schedule 05.07.2016


Ответы (2)


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

введите здесь описание изображения

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

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

person hugomg    schedule 02.07.2016
comment
Я не думаю, что это проблема гамильтонова пути (это может быть сложнее, а не проще), потому что нет гарантии, что посещение каждой точки будет лучше. Ускорение - это скорость, а не просто набор скорости ... поэтому, если вам нужно сильно менять направление, чтобы поразить каждую точку, вы можете выйти из него, двигаясь медленнее, чем если бы вы нажали 4 или 5, которые были примерно коллинеарны с вашим место назначения. - person Edward Peters; 02.07.2016
comment
Умм ... Я думаю, вам тогда может потребоваться четко указать режим, как физика работает в вашей модели. Когда я прочитал это, я понял, что ускорение было простым увеличением скорости, которое сделало любые будущие кромки дешевле для прохождения. - person hugomg; 02.07.2016
comment
Ладно, отредактировал задачу, чтобы было понятнее. Я думал, что это направление имеет значение (так что, если ваша скорость будет достаточно высокой, это не будет полноценным графиком). Думаю, я согласен с тем, что в проблеме, как вы ее описали, в определенных ситуациях она может сводиться к гамильтонову траектории. - person Edward Peters; 02.07.2016

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

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

person Vesper    schedule 03.07.2016
comment
Я не уверен, что понимаю весь ваш ответ ... не могли бы уточнить пару вещей, которые, похоже, могут быть неправильными для меня? назначьте максимальную скорость вдоль линии, чтобы иметь возможность повернуть от этого узла к любому другому, звучит так, будто он теряет слишком много информации, потому что вы можете достичь некоторых узлов, а не других, или достичь некоторых узлов, но только в диапазонах скоростей, которые мешают вам от достижения других и т. д. Согласно правилу отсечения, если существует путь от текущего до следующего узла с меньшей скоростью и меньшим временем, затрачиваемым от конца, что вы подразумеваете под меньшей скоростью? Иногда скорость хороша. - person Edward Peters; 04.07.2016
comment
О максимальной скорости - это может быть на узел, узел ближе к вектору позволит более высокие скорости. Меньшая скорость означает, что если вы запрашиваете путь AB, определите, какой скорости можно достичь при повороте в точке A, чтобы добраться до точки B, выясните, что в точке B есть путь, который пришел из точки A, но потратил меньше времени на достижение точки B И был медленнее в точке AB, это означает, что ваш текущий путь отстает и может быть отброшен. - person Vesper; 04.07.2016
comment
Но есть одно предостережение, о котором я подумал: что, если вы начнете с точки A и сможете посетить точку A, чтобы ускориться? Тогда этот алгоритм не сработает, если за A. есть узел. Представьте себе конфигурацию: B --- A --- C, источник - A, цель - C, и вы можете ускориться на 5 в точке A и на 10 в точке B, используя AC довольно долго. Правильный путь может закончиться ABAC, скажем, если вы путешествуете по 4 из A в B, вернетесь в 6 из B в A, а затем через 11 из A в C, что будет быстрее, чем движение по 5 из A в C напрямую, и быстрее, чем по азбуке. - person Vesper; 04.07.2016
comment
Я не думаю, что медленнее от A-B всегда лучше, даже если на это уходит меньше времени ... что, если A, B, C коллинеарны, а расстояние от B до C преобладает? Тогда вы хотите двигаться как можно быстрее когда вы нажимаете B, потому что способность управлять менее важна, чем увеличение скорости. Другое дело, что это не просто попарно: я мог бы войти в B со скоростью, которая доводит меня до C, но не до D, или даже это заставит меня использовать почти все свое ускорение при D отмене бокового импульс, так что мне нужно ехать до E как вкопанный. - person Edward Peters; 04.07.2016
comment
Фактически, я собираюсь задать аналогичный вопрос относительно вашей проблемы, поскольку определенная комбинация данных делает расчет оптимального времени даже для одного пути серьезной проблемой. Вы правы, по крайней мере, в том, что максимальная скорость от A до B не всегда хороша. Считайте этот ответ по крайней мере сомнительным, возможно, ваша проблема действительно не поддается оптимизации. - person Vesper; 04.07.2016