《人工智能实验报告计算机人工智能_计算机-人工智能.pdf》由会员分享,可在线阅读,更多相关《人工智能实验报告计算机人工智能_计算机-人工智能.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、八皇后问题 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是 十九世纪著名的数学家高斯 1850 年提出:在 8X8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇 后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。基本思想:在 open 表中保留已生成而未考察的结点,并用启发函数 h(x)对它们全部进 行估价,从中选出最优结点进行扩展,而不管这个结点出现在搜索树的什么地 方。(1)把初始结点 SO 放入 open 表中,计算 h(SO);(2)若 open 表为空,则搜索失败,EXIT;(3)移出 open 表中第一个结点 N 放入 closed 表中,并冠
2、以序号 n(4)若目标结点 Sg=N 则搜索成功,EXIT(5)若 N 不可扩展,则转步骤(2);(6)扩展 N,计算每个子结点 x 的函数值 h(x),并将所有子结点配以指向 N 的返回指针后放入 open 表中,再对 open 表中的所有子结点按其函数值大小 以升序排序,转步骤 2;/采用启发式修补解 N 皇后问题#include#include /采用启发式修补解 N 皇后问题#include#include using.namespace std;void shuffle(int Queen,const int n)/随机取得各行的初始皇后位置,以 Queeni 表示第 i行的皇后位置
3、 for(i nt i=0;i n;i)Queeni=abs(rand()%n;int collision(int Queen,const int row,const int column,const int n)./计算每个位置的冲突值 int bug=0;for(int i=0;in;i).if(i!=row)&(Queeni=column|(Queeni-column)=(i-row)|(Queeni-column)=(row-i)/同列,同对角线的情况 bug;return bug;void show(int Queen,const int n)./打印皇后图 cout 厂;for(i
4、nt k=0;kn-1;k)cout 丁;coutendl;for(int i=0;in-1;i).cout ;for(int j=0;jn;j)cout(j=Queeni)?凤 :出在格的国际象棋上摆放八个皇后使其不能互相攻击即任意两个皇后都不能处于同一行同一列或同一斜线上问有多少种摆法基本思想在表中保留已生成而未考察的结点并用启发函数对它们全部进行估价从中选出最优结点进行扩展而并冠以序号若目标结点搜索成功若不可扩展转步骤扩展计算每个子结点的函数值并将所有子结点配以指向的返回指针后放入表中再对表中的所有子结点按其函数值大小以升序排序转步骤采用启发式修补解皇后问题采用启发式修补解后图厂丁凤丨有
5、皇后的位置用凤卜十十凤有皇后的位置用没有的用丄厶启发式修补标志行行之间冲突数取得当前的冲突数不断优化保持皇后在等冲突的情况下不断变更位置有利于后面行的优化取得随机种子)丨有/皇后的位置用凤 coutendl;coutvv 卜;for(j=0;jn-1;j)coutvv 十;coutvv 十vvendl;cout I;for(int j=0;jvn;j)coutvv(j=Queenn-1)?凤:)vv I 有;/皇后的位置用,没有的用 _coutvvendl;coutvv J;for(k=0;kvn-1;k)coutvv 丄;coutvv 厶vvendl;coutvvendl;int repai
6、r(int Queen,const int n)./启发式修补 int max=-1;标志行行之间冲突数 int minbug=n;int count=0;出在格的国际象棋上摆放八个皇后使其不能互相攻击即任意两个皇后都不能处于同一行同一列或同一斜线上问有多少种摆法基本思想在表中保留已生成而未考察的结点并用启发函数对它们全部进行估价从中选出最优结点进行扩展而并冠以序号若目标结点搜索成功若不可扩展转步骤扩展计算每个子结点的函数值并将所有子结点配以指向的返回指针后放入表中再对表中的所有子结点按其函数值大小以升序排序转步骤采用启发式修补解皇后问题采用启发式修补解后图厂丁凤丨有皇后的位置用凤卜十十凤有皇
7、后的位置用没有的用丄厶启发式修补标志行行之间冲突数取得当前的冲突数不断优化保持皇后在等冲突的情况下不断变更位置有利于后面行的优化取得随机种子while(max!=0&countv=100).max=0;for(int i=0;in;i).minbug=collision(Queen,i,Queeni,n);/取得当前的冲突数,不断优化 int temp=Queeni;for(int j=0;jn;j).int bug=collision(Queen,i,j,n);if(bugmax)max=minbug;show(Queen,n);count;return count;void main().
8、int n=-1;int step=0;coutInput N(you would better input a interge minor to 15):n;出在格的国际象棋上摆放八个皇后使其不能互相攻击即任意两个皇后都不能处于同一行同一列或同一斜线上问有多少种摆法基本思想在表中保留已生成而未考察的结点并用启发函数对它们全部进行估价从中选出最优结点进行扩展而并冠以序号若目标结点搜索成功若不可扩展转步骤扩展计算每个子结点的函数值并将所有子结点配以指向的返回指针后放入表中再对表中的所有子结点按其函数值大小以升序排序转步骤采用启发式修补解皇后问题采用启发式修补解后图厂丁凤丨有皇后的位置用凤卜十十凤
9、有皇后的位置用没有的用丄厶启发式修补标志行行之间冲突数取得当前的冲突数不断优化保持皇后在等冲突的情况下不断变更位置有利于后面行的优化取得随机种子if(n=0).coutIllegal Input!endl;return;int*Queen=new intn;sra nd(time(NULL);取得随机种子 shuffle(Queen,n);coutThe oringinal state:100).coutCould find solution within 100 steps,Try again!endl;return;coutAfter step 1 stepsendl;coutThe go
10、al state arrives!endl;出在格的国际象棋上摆放八个皇后使其不能互相攻击即任意两个皇后都不能处于同一行同一列或同一斜线上问有多少种摆法基本思想在表中保留已生成而未考察的结点并用启发函数对它们全部进行估价从中选出最优结点进行扩展而并冠以序号若目标结点搜索成功若不可扩展转步骤扩展计算每个子结点的函数值并将所有子结点配以指向的返回指针后放入表中再对表中的所有子结点按其函数值大小以升序排序转步骤采用启发式修补解皇后问题采用启发式修补解后图厂丁凤丨有皇后的位置用凤卜十十凤有皇后的位置用没有的用丄厶启发式修补标志行行之间冲突数取得当前的冲突数不断优化保持皇后在等冲突的情况下不断变更位置有利于后面行的优化取得随机种子