Поиск пути с тета *, когда неравенство треугольника не выполняется
Я пытаюсь использовать алгоритм тета * (aigamedev.com/open/tutorial/lazy-theta-star), чтобы найти самый быстрый путь в прямоугольной сетке. Расстояния являются евклидовыми, но скорость между узлами зависит от времени и варьируется между направлениями. Таким образом, неравенство треугольника, являющееся предпосылкой для алгоритма, нарушается. Тем не менее, в большинстве случаев это работает превосходно. Как я могу изменить код, чтобы он хорошо работал и в турбулентных областях? Я подозреваю, что мне, возможно, придется пересмотреть некоторые закрытые узлы и вернуть их обратно в открытый список. Если да, то при каких условиях? Обширный веб-поиск не помог.
vertex_t *thetastar(vertex_t *startnode, vertex_t *finishnode, double starttime) {
vertex_t *s, *s1;
double gold, gnew;
int dir; //8 directions to search for node neighbours
//Initialize
vertex[0].row = startnode->row;
vertex[0].col = startnode->col;
vertex[0].g = starttime;
vertex[0].h = h(&vertex[0], finishnode);
vertex[0].open = true;
vertex[0].closed = false;
vertex[0].parent = &vertex[0];
openlist[0] = &vertex[0];
openlist[1] = NULL;
//Find path
while ((s = pop(openlist)) != NULL) {
if (s->row == finishnode->row && s->col == finishnode->col) {
return s;
}
s->closed = true;
for (dir = 0; dir < 8; dir++) {
if ((s1 = nghbrvis(s, dir)) != NULL) {
if (!s1->closed) {
if (!s1->open) {
s1->g = inftime;
s1->parent = NULL;
}
gold = s1->g;
//Path 2
if (lineofsight(s->parent, s1)) {
gnew = (s->parent)->g + c(s->parent, s1);
if (gnew < s1->g) {
s1->parent = s->parent;
s1->g = gnew;
} }
//Path 1
gnew = s->g + c(s, s1);
if (gnew < s1->g) {
s1->parent = s;
s1->g = gnew;
}
if (s1->g < gold) {
s1->h = h(s1, finishnode);
if (s1->open)
remove(s1, openlist);
insert(s1, openlist);
} } } } }
return NULL;
}