优化A *寻路,运行速度非常慢。可能的错误(?)visual c ++

时间:2015-02-09 23:21:45

标签: visual-c++ optimization path-finding a-star

您好我的A *寻路算法存在一些问题。该算法确实成功执行,但是在调试环境中它会在大约10秒内执行,在释放时它仍然需要2-3秒。这个速度太慢了。我怀疑这可能是由于代码中的错误,或者它没有得到很好的优化。

正在使用寻路的地图是一个30 * 30的网格,每个方格彼此相距10个单位。

我注意到在运行算法时,当搜索打开和关闭列表以查看节点是否已经存在时,已经存储在其中一个列表中的节点总是具有较低的成本,因此没有更新节点。不确定这是否正常。此外,我不确定在这种情况下,quicksort是否适合使用。

以下是代码:

用作节点的coords struture:     结构坐标     {     int x;     int z;     coords * parent;     成本;     int得分;     };

排序比较功能:

bool decompare(coords* o1, coords* o2)
{
return (o1->score < o2->score);
}

主要的路径查找循环:

    while (!goalFound) //While goal has not been found
    {
        current = openList.front(); //Retrieve current state from the open list
        openList.pop_front();

        for (int count = 1; count < 5; count++)
        {
            if (!goalFound)
            {
                coords* possibleState = new (coords); //Allocate new possible state
                found = false;
                if (count == 1)
                {
                    possibleState->x = current->x;
                    possibleState->z = current->z + 10; //North
                }

                else if (count == 2)
                {
                    possibleState->x = current->x + 10; //East
                    possibleState->z = current->z;
                }

                else if (count == 3)
                {
                    possibleState->x = current->x; //South
                    possibleState->z = current->z - 10;
                }

                else if (count == 4)
                {
                    possibleState->x = current->x - 10; //West
                    possibleState->z = current->z;
                }

                if (possibleState->x >-1 && possibleState->x <291 && possibleState->z >-1 && possibleState->z < 291) //If possible state is in game boundary
                {
                    possibleState->cost = current->cost + 10; //Add 10 to current state to get cost of new possible state
                    int a = (possibleState->x / 10) + (30 * (possibleState->z / 10)); //get index of map
                    if (map[a] != wallTest) //Test possible state is not inside a wall
                    {
                        p = openList.begin();
                        while (p != openList.end() && !found) //Search open list to see if possible state already exists
                        {
                            if (possibleState->x == (*p)->x && possibleState->z == (*p)->z) //Already exists
                            {
                                found = true;
                                if (!possibleState->cost >= (*p)->cost)  //Test possible state has lower cost
                                {
                                    (*p)->parent = current; //Update existing with attributes of possible state
                                    a = abs((*p)->x - goalState->x);
                                    b = abs((*p)->z - goalState->z);
                                    (*p)->cost = possibleState->cost;
                                    (*p)->score = (possibleState->cost) + ((a)+(b));

                                }

                            }

                            else
                            {
                                found = false; //Set not found
                            }
                            p++;
                        }
                        q = closedList.begin();
                        while (q != closedList.end())
                        {
                            if (possibleState->x == (*q)->x && possibleState->z == (*q)->z)
                            {
                                found = true;
                                int a = (*q)->cost;
                                if (possibleState->cost < a) //Test if on closed list
                                {
                                    (*q)->parent = current;
                                    a = abs((*q)->x - goalState->x);
                                    b = abs((*q)->z - goalState->z);
                                    (*q)->cost = possibleState->cost;
                                    (*q)->score = (possibleState->cost) + ((a)+(b)); //If cost lower push onto open list
                                    coords* newcoord;
                                    newcoord->x = (*q)->x;
                                    newcoord->z = (*q)->z;
                                    newcoord->score = (*q)->score;
                                    newcoord->cost = (*q)->cost;
                                    openList.push_back(newcoord);
                                    closedList.erase(q);
                                }
                            }
                            q++;
                        }

                        if (!found) //If not found on either list
                        {
                            possibleState->parent = current; //Push onto open list
                            a = abs((possibleState)->x / 10 - goalState->x / 10);
                            b = abs((possibleState)->z / 10 - goalState->z / 10);
                            (possibleState)->score = (possibleState->cost) + ((a)+(b));
                            openList.push_back(possibleState);
                        }
                        sort(openList.begin(), openList.end(), decompare); // Sort the open list by score
                    }

                    if (possibleState->x == goalState->x && possibleState->z == goalState->z) //if goal found
                    {
                        openList.push_back(possibleState);
                        node = possibleState;
                        goalFound = true;

                        while (node != 0)
                        {
                            wayPoints.push_back(*node);
                            node = node->parent;
                            wayCount = wayPoints.size() - 1;
                        }
                    }
                }
            }
        }

        closedList.push_back(current);
    }
    player->setWayPoints(wayPoints);
    wayPoints.clear();
    player->setMoved(2);
    player->setPath(1);
    openList.clear();
    closedList.clear();
    goalFound = false;
    player->setNewPath(1);
    return true;
}
else {
    return false;
}

}

是否有任何错误需要在此代码中排序,任何人都可以看到?或者只是需要进行重要的优化?感谢

0 个答案:

没有答案