留言 | 关于 | 联系
基础数学 语言相关算法实现 其它知识
返回首页
当前位置: 首页 > 程序设计 > 算法实现 > 人工智能学习(3)--广度优先搜索

人工智能学习(3)--广度优先搜索

时间:2010-03-26 20:52来源:网络 作者:iampolaris 点击:
人工智能学习之广度优先搜索,给出了广度优先搜索算法的介绍和程序实现。

在深度优先搜索中,深度越大的结点越先得到扩展。如果把它改为深度越小的结点越先得到扩展,就是广度优先搜索法。

广度优先搜索算法的基本思想:

  1. 建立一个空的状态队列SS;
  2. 建立一个空的状态库SB;
  3. 把初始状态S(0)存入队列SS中;
  4. 若队列状态是目标状态,则搜索成功,算法运行中止。如该状态的形式为S(path),则解就是(path);
  5. 若某种搜索极限已经达到(如空间用完等),则搜索失败,算法运行结束,没有解;
  6. 按某种原则取一个可以应用于SS第一个状态S(path)并产生合适的新状态的规则Rn,产生新状态T(path,n),并将其置于SS的最后,转(4)。若扩展失败,即没有新状态产生,则将SS中第一个状态从SS中除去,送入SB中,执行下步;
  7. 若SS成为空队列,则搜索失败,算法运行结束,没有解。否则转(5)。

注:在实际解题中,算法可能有许多不同的变型,要视具体情况应变。下给出算法可供参考:

广度优先基本算法伪代码如下:
 

program BFS;
初始化;建立数据库data;初始状态存入数据库;
设队列首指针closed:=0;队列尾指针open:=1;
repeat
取下一个closed所指结点;
for r:=1 to rmax do {r为产生规则编号}
begin
if 子结点符合条件 then
begin
open增1,把新结点存入数据库队尾;
if 新结点与原有结点重复 then
删去该结点(open减1)
else
if 新结点即目标 then 输出并退出;
end
enduntil closed>=open{队列空};

广度优先搜索的显著特点是,在产生新的子结点时,深度越小的越得到优先扩展,即先产生它的子结点。当结点到根结点的费用和结点的深度成正比,特别是当每一结点到根结点的费用等于深度值时,用广度优先得到的解一定是最优解。但只要将上述算法进行改进也可以求得最优解,这就成了代价优先搜索。

下面是一个24点程序的代码: 
 

  1. #include <iostream> 
  2. #include <string> 
  3. #include <cmath> 
  4.  
  5. using namespace std; 
  6.  
  7. const double PRECISION=1E-6; 
  8. const int COUNT_OF_NUMBER=4; 
  9. const int NUMBER_TO_BE_CAL=24; 
  10. double number[COUNT_OF_NUMBER]; 
  11. string expression[COUNT_OF_NUMBER]; 
  12.  
  13. bool Search(int n) 
  14.     if(n==1) 
  15.     { 
  16.          
  17.         if(fabs(number[0]-NUMBER_TO_BE_CAL)<PRECISION) 
  18.         { 
  19.             cout<<expression[0]<<endl; 
  20.             return true
  21.         } 
  22.         else 
  23.         { 
  24.             return false
  25.         } 
  26.     } 
  27.      
  28.      
  29.      
  30.     for(int i=0;i<n;i++) 
  31.     { 
  32.         for(int j=i+1;j<n;j++) 
  33.         { 
  34.             double a,b; 
  35.             string expa,expb; 
  36.             a=number[i]; 
  37.             b=number[j]; 
  38.             number[j]=number[n-1]; 
  39.             expa=expression[i]; 
  40.             expb=expression[j]; 
  41.             expression[j]=expression[n-1]; 
  42.             expression[i]='('+expa+'+'+expb+')'
  43.             number[i]=a+b; 
  44.             if(Search(n-1)) 
  45.                 return true
  46.             expression[i]='('+expa+'-'+expb+')'
  47.             number[i]=a-b; 
  48.             if(Search(n-1)) 
  49.                 return true
  50.             expression[i]='('+expb+'-'+expa+')'
  51.             number[i]=b-a; 
  52.             if(Search(n-1)) 
  53.                 return true
  54.             expression[i]='('+expa+'*'+expb+')'
  55.             number[i]=a*b; 
  56.             if(Search(n-1)) 
  57.                 return true
  58.             if(b!=0) 
  59.             { 
  60.                 expression[i]='('+expa+'/'+expb+')'
  61.                 number[i]=a/b; 
  62.                 if(Search(n-1)) 
  63.                     return true
  64.             } 
  65.              
  66.             if(a!=0) 
  67.             { 
  68.                 expression[i]='('+expb+'/'+expa+')'
  69.                 number[i]=b/a; 
  70.                 if(Search(n-1)) 
  71.                     return true
  72.             } 
  73.             number[i]=a; 
  74.             number[j]=b; 
  75.             expression[i]=expa; 
  76.             expression[j]=expb; 
  77.         } 
  78.     } 
  79.     return false
  80.  
  81. void main() 
  82.     for(int i=0;i<COUNT_OF_NUMBER;i++) 
  83.     {   
  84.         char buffer[20]; 
  85.         int x; 
  86.         cin>>x; 
  87.         number[i]=x; 
  88.         itoa(x,buffer,10); 
  89.         expression[i]=buffer; 
  90.     } 
  91.      
  92.     if(Search(COUNT_OF_NUMBER)) 
  93.     { 
  94.         cout<<"Success."<<endl; 
  95.     } 
  96.     else 
  97.     { 
  98.         cout<<"Fail."<<endl; 
  99.     } 

 

 

顶一下
(10)
90.9%
踩一下
(1)
9.1%
发表评论
评价:
验证码:点击我更换图片
推荐内容