acm专题-搜索算法.pptVIP

  • 25
  • 0
  • 约1.33万字
  • 约 66页
  • 2018-06-30 发布于四川
  • 举报
acm专题-搜索算法

扩展过程(续) /*测试向左移,先判断其父状态的生成是否和它相反,以及是否可以向左移 */ if ((p-inherit!=3)(col0)) {     q=new struct node;  /* 生成新状态*/  q-parent=p;   q-depth=p-depth+1;     q-next=NULL;  q-inherit=1;     for (int i=0; i3; i++)   for (int j=0; j3;j++)  q-state[i][j]=p-state[i][j];     q-state[row][col]=q-state[row][col-1]; q-state[row][col-1]=0;      h=heuristic(q); /* 计算评价函数值*/      q-f_value=q-depth+h;      if (h==0)  {/*与目标状态进行比较*/     succeed=1; goal=q;       }      else   search(q);  /*插入到OPEN表中恰当位置*/    }/*向左移*/ 将新节点插入到OPEN表中 void search(struct node *x) { /* 将新扩展结点放入OPEN表中恰当位置, */ struct node *p,*q; if (open==NULL) { open=x; x-next=NULL; return; } if (open-f_valuex-f_value) { x-next=open; open=x; return; } p=open; q=p; 将新节点插入到OPEN表中 while ((p!=NULL) (p-f_value=x-f_value)) { if (p-f_value==x-f_value) { int flag=1; for (int i=0;i8;i++) if (p-state[i]!=x-state[i]) { flag=0; break; } if (flag==1) { delete x; return; } } q=p; p=p-next; } x-next=p; q-next=x; return; } 相关题目 4. 一般图搜索算法 一般性图搜索算法(续): 6: M←expand(n), G←G, G←{M, G }; 扩展节点n , 建立集合M, 并把M 中的节点作为n的后继者加入G中。 7: 对M中的所有节点m (1) if m G then 建立指针m→n,OPEN←CONS(M, OPEN); 对M中原来不在G 中的节点建立一个从这些节点到n的指针, 并把它们加入OPEN表。 (2) if m∈OPEN then 根据其扩展路径确定是否应将它们的指针指向n。 (3) if m∈CLOSED then 根据其扩展路径确定是否应改变m的后代的指针。 8: 对OPEN中的节点按某种原则重新排序; 9: GO LOOP; 4. 一般图搜索算法 节点类型: …... …... …... …... …... mj mk ml 4. 一般图搜索算法 广度优先搜索法: 该方法从初始节点开始, 顺序扩展生成下一级各子节点, 放在OPEN 表中已有的节点后 面(实现先生成的子节点先扩展), 然后从OPEN 表中提取最前的一个节点检查是否是目标节点, 否则再扩展, 再重复上述操作。 这种方法认为同一级各节点对问题求解的价值是同等的, 因而对全部节点沿广度进行横向扫描, 按各节点生成的先后次序,先生成、先检查、先扩展, 沿广度遍历所有节点。 这种方法只要问题有解, 即若树图上存在目标节点, 经搜索一定能找到。 所以, 广度优先搜索法是完备的, 是一种推理算法。 但是, 在问题大节点多, 且目标节点距离初始节点较远时将会产生许多无用节点, 搜索效率低, 还可能产生组合爆炸。 因此, 这种方法较适宜问题不大的环境中。 4. 一般图搜索算法 广度优先搜索算法: 1: G:=G0(G0=s), OPEN:=(

文档评论(0)

1亿VIP精品文档

相关文档