#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) ;
Мне действительно нравится объяснение здесь: Ссылка , более чистая, чем объяснение в википедии.