Обход графа с помощью * алгоритма

#c #algorithm #graph #traversal #a-star

#c #алгоритм #График #обход #a-star

Вопрос:

Привет, я изучаю искусственный интеллект и собираюсь попробовать свою домашнюю работу, которая заключается в реализации * алгоритма для обхода графика. я использую коды c , и то, что я сделал на данный момент, приведено ниже кода, который представляет собой только класс Graph функции insertedge и vertices. но теперь я не понимаю, как определить функцию затрат (f = h (n) g (n)) …

также мне помогло бы любое изменение кода или объяснение того, как A * работает для графиков. то, что я нашел в Google, касалось поиска пути через a *, и это ничего не имеет с графиком обхода.

 #include <iostream>
using namespace std;

class Graph;
class node {
    friend class Graph;
private:
    char data;
    int cost;
    node *next;
    node *vlist;
    bool goal;
    bool visited;
public:
    node(char d,int c, bool g){
        cost = c;
        goal = g;
        next = NULL;
        data = d;
        vlist = NULL;
        visited = false;
    }
};

class Graph {
private:
    node *Headnodes;
    char n;
public:
    Graph ()
    {
        Headnodes = NULL;
    }
    void InsertVertex(char n, int c, bool g);
    void InsertEdge(char n, char m, int c);
    void PrintVertices();
    void Expand(char n);
};

/////////////////
//  INSERTION  //
/////////////////
void Graph::InsertVertex(char n, int c, bool g){
    node *temp = new node(n,c,g);
    if(Headnodes==NULL)
    {
        Headnodes=temp;
        return;
    }

    node *t=Headnodes;
    while(t->vlist!=NULL)
        t=t->vlist;
    t->vlist=temp;
}

void Graph::InsertEdge(char n, char m, int c){
    int temp_cost = 0;
    if(Headnodes==NULL)
        return;

    node *x=Headnodes;
    while(x!=NULL){
        if(x->data==m)
            temp_cost = (x->cost c);
        x = x->vlist;
    }
    node *t=Headnodes;
    node *temp=new node(m,temp_cost,false);

    while(t!=NULL){
        if(t->data==n){
            node *s=t;
            while(s->next!=NULL)
                s=s->next;
            s->next=temp;
        }
        t=t->vlist;
    }
}

int min_cost = 1000;
bool enough = false;
void Graph::PrintVertices(){
    node *t=Headnodes;
    while(t!=NULL){
        cout<<t->data<<"t";
        t=t->vlist;
    }
}

void Graph::Expand(char n){
    cout << n << "t";
    char temp_min;
    node *t=Headnodes;
    while(t!=NULL){
        if(t->data==n amp;amp; t->visited == false){
            t->visited = true;
            if (t->goal)
                return;
            while(t->next!=NULL){
                if (t->next->cost <= min_cost){
                    min_cost=t->next->cost;
                    temp_min = t->next->data;
                }
                t = t->next;
            }
        }
        t=t->vlist;
    }
    Expand(temp_min);
}

int main(){
    Graph g;
    g.InsertVertex('A',5,false);
    g.InsertVertex('B',1,false);
    g.InsertVertex('C',9,false);
    g.InsertVertex('D',5,false);
    g.InsertVertex('E',1,false);
    g.InsertVertex('F',3,false);
    g.InsertVertex('G',2,false);
    g.InsertVertex('J',1,false);
    g.InsertVertex('K',0,true);

    g.InsertEdge('A','B',2);
    g.InsertEdge('A','C',1);
    g.InsertEdge('B','A',2);
    g.InsertEdge('B','D',1);
    g.InsertEdge('B','E',1);
    g.InsertEdge('C','A',1);
    g.InsertEdge('C','F',1);
    g.InsertEdge('C','G',1);
    g.InsertEdge('E','J',3);
    g.InsertEdge('E','K',3);

    g.PrintVertices();

    cout<<"nn";
    g.Expand('A');

    return 0;
}
  

Комментарии:

1. ИМХО, единственный ответ, которого это заслуживает, — «STFW». Поскольку вы упомянули, что использовали Google, «W» означает «Википедия». Их статьи о Дейкстре и A * довольно исчерпывающие (кода нет, но описания алгоритмов хороши). Что касается очевидных упущений в вашем коде выше, у вас нет никаких данных, на которых можно основывать свою эвристику ( h(n) ), поэтому вы не можете это определить. Также visited этого недостаточно, вам нужно сохранить f(n) и вам нужна очередь с ориентировочными расстояниями.

Ответ №1:

То, что у вас есть, — это всего лишь алгоритм поиска по графу.

Вы забыли суть алгоритма A *, то есть стоимость h (n), которая получается в результате эвристического вычисления.

Вы должны реализовать метод, h (n), который будет вычислять, на основе ваших эвристик, возможную стоимость от фактического пути до конечного пути, и это значение будет использоваться для расчета стоимости прохождения:

f ‘ (n) = g (n) h’ (n), будучи g (n) уже известной стоимостью, в вашем случае, x-> стоимость.

g (n) — общая стоимость расстояния, которое потребовалось, чтобы добраться от начальной позиции до текущего местоположения.

h ‘(n) — расчетная стоимость расстояния от текущей позиции до конечного пункта назначения / состояния. Эвристическая функция используется для создания этой оценки того, какое расстояние потребуется для достижения целевого состояния.

f ‘ (n) — это сумма g (n) и h'(n). Это текущий предполагаемый кратчайший путь. f (n) — это истинный кратчайший путь, который не обнаруживается до тех пор, пока алгоритм A * не будет завершен.

Итак, что вам нужно сделать:

  • Реализовать метод evuristic_cost(actual_node, final_node);
  • Используйте это значение вместе с фактической стоимостью, как в приведенном выше уравнении, например: min_cost=t-> next-> cost evuristic_cost(t-> next, final_node) ;

Мне действительно нравится объяснение здесь: Ссылка , более чистая, чем объяснение в википедии.