A*算法解决八数码问题

详解A*算法:
https://blog.csdn.net/hitwhylz/article/details/23089415
java实现:
https://blog.csdn.net/hiphopmattshi/article/details/7538012
c++版本:
https://blog.csdn.net/yums467/article/details/50833966

A*算法的伪代码

 创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。 

 算起点的估价值;

 将起点放入OPEN表;

    while(OPEN!=NULL)

  {

    从OPEN表中取估价值f最小的节点n;

          if(n节点==目标节点){

          break;

           }

          for(当前节点n 的每个子节点X)

        {

          算X的估价值;

               if(X in OPEN)

             {

                 if( X的估价值小于OPEN表的X估价值 ){

                把n设置为X的父亲;

               更新OPEN表中的估价值; //取最小路径的估价值 

                      }

           }

         if(X inCLOSE) {

                 if( X的估价值小于CLOSE表的X估价值 ){

                把n设置为X的父亲;

           
                  将该节点从close表中除去

             把X节点放入OPEN //取最小路径的估价值 

                        }

               }

          if(X not inboth){

           把n设置为X的父亲;

           求X的估价值;

           并将X插入OPEN表中; //升序排列open

          }

     }//end for

  将n节点插入CLOSE表中;

  按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。

   }//end while(OPEN!=NULL)

 保存路径,即从终点开始,每个节点沿着父节点移动直至起点,这就是你的路径;

猜你喜欢

转载自blog.csdn.net/yangmolulu/article/details/90754030