matlab解决关于人工智能的四皇后问题
2014-10-10 14:38
134 查看
(1)问题描述与算法介绍
四皇后或者多皇后问题是研究人工智能的一个基础问题,问题具体是什么网上有很多了,就不详细说了,我这里就matlab上如何解决的参考和修改写了一些程序代码。四皇后问题的解决方案很多,本文主要采用的是回溯算法来解决的。
(2)代码详情:
function Q = Queen
global index; %定义全局变量
n = 4; %这个可以修改从而是多皇后问题
A=zeros(n,n); %初始化矩阵
index = zeros(1,n);
i=1;%行号
j=1;%列号
%-------------------------------------------
while(i>0)
%%-----------对于固定的某一行上看是否有符合的--------
while(j<=n)
if safeplace(i,j) %检测是否可以放置
A(i,j) = 1;
index(i) = j; %可以放置,记录位置
break; %同时退出本行寻找
else
j=j+1; %不可以放置,到下一个位置检测
end
End
%%-------------------------------
if j<=n %该行可以找到,到下一行
i = i+1; %下一行
j=1; %该行可以找到,则在下一行上又从第一个开始检测
else %不可以找到,回溯回上一行
i=i-1; %回溯到上一行
if i~=0 %不为0,说明还有可能,为0那么就结束了,这是程序结束的关键
j=index(i); %记录上一行位置
A(i,j)=0; %对于位置清0
index(i)=0; %对应标记清0
j=j+1; %下一列
end
End
%%------------------------------------
if (index(n)~=0) %最后一行标记不为0,则能找到一个解
disp(A); %显示解的矩阵
End
%%--------------------------------------
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function p=safeplace(x,y) %安全性检测
global index;
for a = 1:x-1
b = index(a);
if(x==a||y==b||x-y==a-b||x+y==a+b) %位置不能同行同列同斜线
p=0;
return;
end
end
p=1;
(3)结果显示
现在在命令窗口直接运行queen函数即可,得到结果如下:
>> queen
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0
可以看到这两种情况,当然改变n的值可以运行多皇后问题了。。。
四皇后或者多皇后问题是研究人工智能的一个基础问题,问题具体是什么网上有很多了,就不详细说了,我这里就matlab上如何解决的参考和修改写了一些程序代码。四皇后问题的解决方案很多,本文主要采用的是回溯算法来解决的。
(2)代码详情:
function Q = Queen
global index; %定义全局变量
n = 4; %这个可以修改从而是多皇后问题
A=zeros(n,n); %初始化矩阵
index = zeros(1,n);
i=1;%行号
j=1;%列号
%-------------------------------------------
while(i>0)
%%-----------对于固定的某一行上看是否有符合的--------
while(j<=n)
if safeplace(i,j) %检测是否可以放置
A(i,j) = 1;
index(i) = j; %可以放置,记录位置
break; %同时退出本行寻找
else
j=j+1; %不可以放置,到下一个位置检测
end
End
%%-------------------------------
if j<=n %该行可以找到,到下一行
i = i+1; %下一行
j=1; %该行可以找到,则在下一行上又从第一个开始检测
else %不可以找到,回溯回上一行
i=i-1; %回溯到上一行
if i~=0 %不为0,说明还有可能,为0那么就结束了,这是程序结束的关键
j=index(i); %记录上一行位置
A(i,j)=0; %对于位置清0
index(i)=0; %对应标记清0
j=j+1; %下一列
end
End
%%------------------------------------
if (index(n)~=0) %最后一行标记不为0,则能找到一个解
disp(A); %显示解的矩阵
End
%%--------------------------------------
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function p=safeplace(x,y) %安全性检测
global index;
for a = 1:x-1
b = index(a);
if(x==a||y==b||x-y==a-b||x+y==a+b) %位置不能同行同列同斜线
p=0;
return;
end
end
p=1;
(3)结果显示
现在在命令窗口直接运行queen函数即可,得到结果如下:
>> queen
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0
可以看到这两种情况,当然改变n的值可以运行多皇后问题了。。。
相关文章推荐
- [置顶] matlab_N皇后问题的解决
- 关于Matlab绘图中的下标问题解决方案(转)
- 关于matlab需要重新激活问题的解决方法
- 关于matlab 2014以前版本过期问题解决
- 关于matlab中图像太大只能缩小显示问题的解决
- 关于JAVA调用Matlab遇到的问题+JDK重装后原有项目报错的解决办法
- 关于目标跟踪matlab代码调试时一个问题的解决办法
- 关于c#调用matlab时,deploytool选项没有.NET Assembly的问题的解决
- 2016/10/16 关于解决matlab编辑器中文乱码的问题
- 【Matlab 2010b 64位】关于matlab licence许可到期问题的解决办法
- 关于html编辑器的回车换行问题解决方案
- asp中关于数据库无法更新问题的解决方法
- 解决控件遮挡问题:关于有窗口元素和无窗口元素
- 关于数据动态绑定问题的解决方法
- 关于 clock_gettime() 的一个问题以及解决方法
- 关于上个Flex-Jsp-DB例子中Flex和Jsp传递中文参数问题的解决方法!(Tomcat服务器)
- 关于DateTime在Pocket PC客户端不能正确存入数据库的问题及解决方法
- 关于Eclipse RCP的两个小问题和解决方法
- [导入]关于ASP.NET返回文件的MIME的未解决问题
- 如果我是国王:关于解决 Java 编程语言线程问题的建议