В настоящее время я работаю над алгоритмом поиска A *. Алгоритм просто решал бы лабиринты текстовых файлов. Я знаю, что алгоритм A * должен быть очень быстрым в поиске финиша. Кажется, что у меня осталось 6 секунд, чтобы найти путь в лабиринте 20x20 без стен. Он находит финиш с правильным путем, который просто требуется навсегда, чтобы сделать это.A * pathfinding slow
Если бы я знал, какая часть кода была проблемой, я бы просто опубликовал ее, но я действительно не знаю, что происходит не так. Так вот алгоритм, который я использую ...
while(!openList.empty()) {
visitedList.push_back(openList[index]);
openList.erase(openList.begin() + index);
if(currentCell->x_coor == goalCell->x_coor && currentCell->y_coor == goalCell->y_coor)
}
FindBestPath(currentCell);
break;
}
if(map[currentCell->x_coor+1][currentCell->y_coor] != wall)
{
openList.push_back(new SearchCell(currentCell->x_coor+1,currentCell->y_coor,currentCell));
}
if(map[currentCell->x_coor-1][currentCell->y_coor] != wall)
{
openList.push_back(new SearchCell(currentCell->x_coor-1,currentCell->y_coor,currentCell));
}
if(map[currentCell->x_coor][currentCell->y_coor+1] != wall)
{
openList.push_back(new SearchCell(currentCell->x_coor,currentCell->y_coor+1,currentCell));
}
if(map[currentCell->x_coor][currentCell->y_coor-1] != wall)
{
openList.push_back(new SearchCell(currentCell->x_coor,currentCell->y_coor-1,currentCell));
}
for(int i=0;i<openList.size();i++) {
openList[i]->G = openList[i]->parent->G + 1;
openList[i]->H = openList[i]->ManHattenDistance(goalCell);
}
float bestF = 999999;
index = -1;
for(int i=0;i<openList.size();i++) {
if(openList[i]->GetF() < bestF) {
for(int n=0;n<visitedList.size();n++) {
if(CheckVisited(openList[i])) {
bestF = openList[i]->GetF();
index = i;
}
}
}
}
if(index >= 0) {
currentCell = openList[index];
}
}
Я знаю, что этот код является грязным и не самым эффективным способом сделать вещи, но я думаю, что это все еще должно быть быстрее, чем это. Любая помощь будет принята с благодарностью.
Спасибо.
Я хотел бы использовать что-то вроде ctime (http://www.cplusplus.com/reference/clibrary/ctime/) и начать синхронизацию различных операций, которые вы делаете, чтобы найти, где потрачено большинство вашего времени вычислений. Трудно сказать, где алгоритм проводит время, и я нашел, что это хороший способ найти его, когда все остальное терпит неудачу. – NKamrath
BTW, я не хочу ниптать, но правильное название для расстояния - Манхэттен (например, город, потому что он был вдохновлен в городских кварталах). – rlinden