DStar 也称 D* 算法
DStar 是 Dynamic A Star 的简称
与 A* 算法类似,通过维护一个 OpenList 来对场景中的路径节点进行搜索,不同的地方是 D* 算法是从 终点 向 起点 进行查询
从终点开始搜索的优势是,当 AI 在移动过程中出现了原本可行走的路变成不可行走时,可以不用完全重新规划路线,最开始搜索过一次的信息能够继续使用
所以,通常来说 D* 算法分为两个阶段
每个节点有三种状态
class DNode : public Node
{
public:
enum Tag
{
NEW = 0,
OPEN = 1,
CLOSED = 2
};
/**
* @brief Construct a new DNode object
* @param x 坐标点 X
* @param y 坐标点 Y
* @param g 到达目标点的成本代价
* @param h 根据启发式的代价
* @param id Node 节点 ID
* @param pid Node 父节点 ID
* @param t 状态枚举值
* @param k 历史最小 g 值
*/
DNode(const int x = 0, const int y = 0, const double g = std::numeric_limits<double>::max(),
const double h = std::numeric_limits<double>::max(), const int id = 0, const int pid = -1, const int t = NEW,
const double k = std::numeric_limits<double>::max())
: Node(x, y, g, h, id, pid), t_(t), k_(k)
{
}
private:
int t_; // DNode's tag among enum Tag
double k_; // DNode's k_min in history
};
默认情况下,每个节点的 k、h、g 都是 infinite, t 是 DNode::New
new DNode(i, j, std::numeric_limits<double>::max(), std::numeric_limits<double>::max(), grid2Index(i, j), -1, DNode::NEW, std::numeric_limits<double>::max());