【发布时间】:2013-01-03 17:44:24
【问题描述】:
我正在为一个学校项目创建一个游戏,并且我想使用 Dijkstra 的算法作为 AI 的一部分来处理玩家需要躲避的对象。
所以我有一个图(一个邻接矩阵),我想使用 Dijkstra 来获取从每个对象到玩家的路径,但是现在当我调用算法时,如果玩家来了,它不会找到玩家对象。
据我了解,Dijkstra 的算法应该访问所有节点,直到找到目的地,但在我的情况下没有。
到目前为止,我的算法如下所示:
Node* Graph::DijkstrasAlgorithm(Node* sNode, Node* dNode){
std::cout<<"Hello Dijkstra!!"<<std::endl;
for(unsigned int i = 0; i < this->nodeList.size(); ++i){
nodeList.at(i)->setDistance(INT_MAX);
nodeList.at(i)->setVisited(false);
}
std::cout<<"everything is set"<<std::endl;
sNode->setDistance(0);
int numberVisited = 0;
Node* u = new Node();
std::cout<<"before while lus"<<std::endl;
while(numberVisited < numberOfNodes){
u->setDistance(INT_MAX);
for(unsigned int j = 0; j < this->nodeList.size(); ++j){
if((u->getDistance() > this->nodeList.at(j)->getDistance()) && !this->nodeList.at(j)->isVisited() ){
u = this->nodeList.at(j);
u->setVisited(true);
numberVisited++;
}
}
std::cout<<u->getNodeName()<<"=="<<dNode->getNodeName()<<std::endl;
if((u == dNode) || (u->getDistance() == INT_MAX)){
std::cout<<"true"<<std::endl;
break;
}
for(int k = 0; k < u->numberOfneighbors(); ++k){
if(!u->getNeighbors(k)->isVisited())
{
// std::cout<<u->getDistance()<<std::endl;
int alt = u->getDistance() + 1;
if( alt < u->getNeighbors(k)->getDistance()){
u->getNeighbors(k)->setDistance(alt);
u->getNeighbors(k)->setPrevious(u);
}
}
}
}
std::vector<Node* > stack;
u = dNode;
while(u->getPrevious() != NULL){
stack.insert(stack.begin(), u);
u = u->getPrevious();
}
if(!stack.empty())
return stack.at(0);
else
return sNode;
}
在这种情况下,dNode 是目标节点,sNode 是起始节点。
有谁知道我做错了什么?
【问题讨论】:
-
在一个简单的测试用例上使用调试器单步执行了吗?
-
这里更适合codereview。还要尝试至少部分纠正您问题中的错误(我的意思是问题而不是代码)。
-
我创建了一个大小为 4 x 4 的方形图,我检查了不同尺寸的图表是否正确,并且生成的图表完美,但在 4 x 4 上它仍然不起作用正如我所料,我使用了 [link]en.wikipedia.org/wiki/Dijkstra's_algorithm[/link] 的伪代码作为指导方针
-
@Bjorn 我已经尽力清理这个问题了;你能澄清一下“玩家追随对象”是什么意思吗?
-
@izomorphius:codereview 只接受关于工作代码的问题。如果在那里被问到,他们会在审查之前将其发回这里进行修复。