Поиск пути с тета *, когда неравенство треугольника не выполняется

Я пытаюсь использовать алгоритм тета * (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;
}

0 ответов

Другие вопросы по тегам