• 对A*算法的改进


     对sunway程序中的BUG所进行的修改
    
    需要注意的是Sunway上面文章“深入A*算法”中引用了一个A*的游戏程序进行讲解,并有这个源码的下载,不过它有一个不小的Bug, 就是新的子节点放入OPEN表中进行了排序,而当子节点在Open表和Closed表中时,重新计算估价值后,没有重新的对Open表中的节点排序,这个问题会导致计算有时得不到最优解,另外在路网权重悬殊很大时,搜索范围不但超过Dijkstra,甚至搜索全部路网, 使效率大大降低。 
    
    Drew 对这个问题进行了如下修正,当子节点在Open表和Closed表中时,重新计算估价值后,删除OPEN表中的老的节点,将有新估价值的节点插入OPEN表中,重新排序,经测试效果良好,修改的代码如下,红色部分为Drew添加的代码.添加进程序的相应部分即可。
    
    在函数GenerateSucc()中 
    ...................................
    
    
     g=BestNode->g+1; /* g(Successor)=g(BestNode)+cost of getting from BestNode to Successor */
    TileNumS=TileNum((int)x,(int)y); /* identification purposes */
    if ((Old=CheckOPEN(TileNumS)) != NULL) 
    { 
    for(c=0;c<8;c++)
    if(BestNode->Child[c] == NULL) /* Add Old to the list of BestNode's Children (or Successors). */
    break;
    BestNode->Child[c]=Old;
    
    if (g < Old->g) 
    {
    Old->Parent=BestNode;
    Old->g=g;
    Old->f=g+Old->h; 
    
     
    //Drew 在该处添加如下红色代码 
    //Implement by Drew 
    NODE *q,*p=OPEN->NextNode, *temp=OPEN->NextNode;
    while(p!=NULL && p->NodeNum != Old->NodeNum)
    {
        q=p;
        p=p->NextNode;
    }
    if(p->NodeNum == Old->NodeNum)
    {
       if(p==OPEN->NextNode)
      {
         temp = temp->NextNode;
         OPEN ->NextNode = temp;
      }
      else
      q->NextNode = p->NextNode;
     }
    Insert(Old); // Insert Successor on OPEN list wrt f 
    } 
  • 相关阅读:
    UVa 820 因特网带宽(最大流)
    UVa 1001 奶酪里的老鼠(Dijkstra或Floyd)
    UVa 821 网页跳跃(Floyd)
    UVa 11624 大火蔓延的迷宫
    UVa 10881 蚂蚁
    UVa 11300 分金币
    UVa 11729 突击战
    《额尔古纳河右岸》读书笔记
    HDU 1083 Courses(二分图匹配模板)
    UVa 10618 跳舞机
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3580700.html
Copyright © 2020-2023  润新知