Почему мой алгоритм поиска пути по путевым точкам не работает?

0

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

std::vector<waypoint> Area::getPath(waypoint currentWP, waypoint destWP)
{
    if(currentWP == destWP)
        return returnPath;

    for(unsigned int i=0; i<currentWP.links.size(); i++)
    {
        if(checkDest(*currentWP.links[i], destWP))
        {
            returnPath.push_back(*currentWP.links[i]);
            getPath(*currentWP.links[i], destWP);
        }
    }
    return returnPath;
}

bool Area::checkDest(waypoint currentWP, waypoint destWP)
{
    if(currentWP == destWP)
        return true;

    for(unsigned int i=0; i<currentWP.links.size(); i++)
    {

        if(checkDest(*currentWP.links[i], destWP))
            return true;
    }
    return false;
} 

waypoint - это структура с элементами x, y и массивом ссылок (типа * waypoint), которые определяют, где вы можете идти от путевой точки.

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

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

Заранее большое спасибо.

#0  0x00007ffff6bd29a5 in _int_malloc () from /usr/lib/libc.so.6
#1  0x00007ffff6bd4c50 in malloc () from /usr/lib/libc.so.6
#2  0x00007ffff747c35d in operator new(unsigned long) () from /usr/lib/libstdc++.so.6
#3  0x000000000040579a in __gnu_cxx::new_allocator<waypoint*>::allocate     (this=0x7fffff7ff1e0, __n=1) at /usr/include/c++/4.8.2/ext/new_allocator.h:104
#4  0x00000000004052cf in std::_Vector_base<waypoint*, std::allocator<waypoint*>     >::_M_allocate (this=0x7fffff7ff1e0, __n=1) at /usr/include/c++/4.8.2/bits/stl_vector.h:168
#5  0x0000000000404b1b in std::_Vector_base<waypoint*, std::allocator<waypoint*> >::_M_create_storage (this=0x7fffff7ff1e0, __n=1) at /usr/include/c++/4.8.2/bits/stl_vector.h:181
#6  0x0000000000403ccf in std::_Vector_base<waypoint*, std::allocator<waypoint*> >::_Vector_base (this=0x7fffff7ff1e0, __n=1, __a=...) at /usr/include/c++/4.8.2/bits/stl_vector.h:136
#7  0x0000000000402c33 in std::vector<waypoint*, std::allocator<waypoint*> >::vector (this=0x7fffff7ff1e0, __x=std::vector of length 1, capacity 1 = {...}) at /usr/include/c++/4.8.2/bits/stl_vector.h:312
#8  0x0000000000402771 in waypoint::waypoint (this=0x7fffff7ff1d0) at Waypoint.h:6
#9  0x0000000000409c3e in Area::checkDest (this=0x6ba3b0, currentWP=..., destWP=...) at Area.cpp:166
#10 0x0000000000409cdd in Area::checkDest (this=0x6ba3b0, currentWP=..., destWP=...) at Area.cpp:172
#11 0x0000000000409cdd in Area::checkDest (this=0x6ba3b0, currentWP=..., destWP=...) at Area.cpp:172
  • 2
    Здравствуй. Просить людей обнаруживать ошибки в вашем коде не особенно продуктивно. Вы должны использовать отладчик (или добавить операторы печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая его с тем, что вы ожидаете. Как только они расходятся, вы нашли свою проблему. (И затем, если необходимо, вы должны создать минимальный тест-кейс .)
  • 0
    Программа получила сигнал SIGSEGV, Ошибка сегментации. 0x00007ffff6bd29a5 в _int_malloc () из /usr/lib/libc.so.6 Это то, что напечатал GDB. И backtrace просто показывает функцию checkDest ove и снова, и я не уверен, почему она все-таки заканчивается.
Показать ещё 4 комментария
Теги:
path-finding
infinite-loop
segmentation-fault

1 ответ

0
Лучший ответ

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

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

Поместите блоки try/catch вокруг вашего дублированного обнаружения, поэтому, когда вы посещаете узел, который вы посетили, прежде чем сможете распечатать узлы и определить топологию графа.

  • 0
    Спасибо, я попробую это.
  • 0
    Этот факт решил проблему, спасибо.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню