爬山法实现 八皇后问题 (Python 实现)

本文主要简单阐述爬山法的基本算法思想,并给出用此算法实现八皇后问题详细过程

最基本的爬上搜索算法表示:(节选自《人工智能》第二版):

function HILL-CLIMBING(problem) return a state thate is a locak maximum
    inputs: problem
    local variables: current, a node 
                         neighbor,a node
    current = MakeNode(INITAL-STATE(problem));
    loop do
        neighbor = a highest-valued successor of current ;
        if VALUE[neighbor] <= VALUE[current] then return STATE[current];
        current = neighbor ;

算法特点:

        爬山法是一个向值增加的方向持续移动的简单循环过程--类似于登高,它将会在到达一个“峰顶”时终止,此时相邻状态中没有比它更高的值。这个算法不会维护搜索树,因此当前节点的数据结构只需要记录当前状态和它的目标函数值,它不会前瞻与当前状态不直接相邻的那些状态的值。这里更高的值是根据具体的应用场景来定的,准确的说是更接近目标状态的值,由我们设置的启发式函数来决定哪个值更好,比如我们求解八皇后问题更高的值就是当前格局中皇后冲突对数最少的情况


算法局限性:

      爬山法属于一种局部的贪婪搜索方法,当它在搜索过程中遇到了局部最大值就很难继续向下搜索了,局部极大值是一个比它的每个邻居状态都高得到峰顶,但是比全局最大值(我们要到达的最终状态)要低,爬山法算法到达局部极大值附近就会被拉向峰顶,然后卡在局部极大值处无处可走。因此产生了爬山法的变种如随机爬山法及其变种如随机爬山法,随机重新开始的爬山法,模拟退火搜索能够非常有效的解决N皇后问题。

求解八皇后问题:

  1. #-*- coding: utf-8 -*-
  2. import random
  3. #函数一:参数为当前棋盘布局状态,根据布局判断当前八皇后布局存在冲突的皇后对数
  4. def get_numof_conflict(status):
  5. num = 0
  6. for i in range(len(status)):
  7. for j in range(i + 1,len(status)):
  8. if status[i] == status[j]:
  9. num += 1
  10. offset = j - i
  11. if abs(status[i]-status[j]) == offset:
  12. num += 1
  13. return num
  14. #函数二:参数为当前棋盘布局状态,利用爬山法思想选择邻居状态最好的布局并返回
  15. def hill_climbing(status):
  16. convert = {}
  17. length = len(status)
  18. for col in range(length):
  19. best_move = status[col]
  20. for row in range(length):
  21. if status[col] == row:
  22. continue
  23. status_copy = list(status)
  24. status_copy[col] = row
  25. convert[(col,row)] = get_numof_conflict(status_copy)
  26. answers = [] #最佳后继集合
  27. conflict_now = get_numof_conflict(status) #当前皇后冲突对数
  28. #遍历存储所有可能后继的字典,找出最佳后继
  29. for key,value in convert.iteritems():
  30. if value < conflict_now:
  31. conflict_now = value
  32. for key,value in convert.iteritems():
  33. if value == conflict_now:
  34. answers.append(key)
  35. #如果最佳后继集合元素大于一个 随机选择一个
  36. if len(answers) > 0:
  37. x = random.randint(0,len(answers)-1)
  38. col = answers[x][0]
  39. row = answers[x][1]
  40. status[col] = row
  41. return status
  42. #函数三:求得八皇后满足冲突数为0的一个解,循环输出每一步的后继集合 直到不存在冲>突为止
  43. def Queens():
  44. status = [0,1,2,3,4,5,6,7] #初始状态所有皇后都在对角线
  45. #当存在冲突的个数大于0时 循环求解最佳后继 直到找到八皇后解
  46. while get_numof_conflict(status) > 0:
  47. status = hill_climbing(status)
  48. print status
  49. print get_numof_conflict(status)
  50. print "the answer is"
  51. print
  52. print status
  53. if __name__ == '__main__':
  54. Queens()
代码说明 :

(1)启发式耗散函数 get_numof_conflict求出可以彼此攻击2的皇后对的数  hill_climbing是算法中爬山过程的实现,convert字典中存储的键是所有可能后继状态,值是此状态对应的皇后冲突对数,后面通过遍历来找到最佳后继。爬山法算法通常在最佳后继集合中随机选择一个进行扩展,如果这样的后继多于一个的话

(2)  棋盘的排列用列表 status 表示, 依次表示第一列第二列到第n列的摆放位置。 如列表[0,2,1] 表示3*3矩阵第一列皇后放在最下面一格,第二列放在最上面一格,第三列放在中间一格

(3) 运行结果说明:初始状态每个皇后都在次对角线上 每次运行程序将输出求解一个八皇后正确解的爬山法实现过程 ,依次输出求解过程每一个最佳选择的邻居状态和其存在的皇后冲突对数,可以看出在求解过程中 不断爬山的过程--每进行一步都达到一个更好的格局,冲突次数更少,最后一行显示的是八皇后的一个正确解 冲突数为 0

运行截图



本文主要简单阐述爬山法的基本算法思想,并给出用此算法实现八皇后问题详细过程

最基本的爬上搜索算法表示:(节选自《人工智能》第二版):

function HILL-CLIMBING(problem) return a state thate is a locak maximum
    inputs: problem
    local variables: current, a node 
                         neighbor,a node
    current = MakeNode(INITAL-STATE(problem));
    loop do
        neighbor = a highest-valued successor of current ;
        if VALUE[neighbor] <= VALUE[current] then return STATE[current];
        current = neighbor ;

算法特点:

        爬山法是一个向值增加的方向持续移动的简单循环过程--类似于登高,它将会在到达一个“峰顶”时终止,此时相邻状态中没有比它更高的值。这个算法不会维护搜索树,因此当前节点的数据结构只需要记录当前状态和它的目标函数值,它不会前瞻与当前状态不直接相邻的那些状态的值。这里更高的值是根据具体的应用场景来定的,准确的说是更接近目标状态的值,由我们设置的启发式函数来决定哪个值更好,比如我们求解八皇后问题更高的值就是当前格局中皇后冲突对数最少的情况


算法局限性:

      爬山法属于一种局部的贪婪搜索方法,当它在搜索过程中遇到了局部最大值就很难继续向下搜索了,局部极大值是一个比它的每个邻居状态都高得到峰顶,但是比全局最大值(我们要到达的最终状态)要低,爬山法算法到达局部极大值附近就会被拉向峰顶,然后卡在局部极大值处无处可走。因此产生了爬山法的变种如随机爬山法及其变种如随机爬山法,随机重新开始的爬山法,模拟退火搜索能够非常有效的解决N皇后问题。

求解八皇后问题:

  1. #-*- coding: utf-8 -*-
  2. import random
  3. #函数一:参数为当前棋盘布局状态,根据布局判断当前八皇后布局存在冲突的皇后对数
  4. def get_numof_conflict(status):
  5. num = 0
  6. for i in range(len(status)):
  7. for j in range(i + 1,len(status)):
  8. if status[i] == status[j]:
  9. num += 1
  10. offset = j - i
  11. if abs(status[i]-status[j]) == offset:
  12. num += 1
  13. return num
  14. #函数二:参数为当前棋盘布局状态,利用爬山法思想选择邻居状态最好的布局并返回
  15. def hill_climbing(status):
  16. convert = {}
  17. length = len(status)
  18. for col in range(length):
  19. best_move = status[col]
  20. for row in range(length):
  21. if status[col] == row:
  22. continue
  23. status_copy = list(status)
  24. status_copy[col] = row
  25. convert[(col,row)] = get_numof_conflict(status_copy)
  26. answers = [] #最佳后继集合
  27. conflict_now = get_numof_conflict(status) #当前皇后冲突对数
  28. #遍历存储所有可能后继的字典,找出最佳后继
  29. for key,value in convert.iteritems():
  30. if value < conflict_now:
  31. conflict_now = value
  32. for key,value in convert.iteritems():
  33. if value == conflict_now:
  34. answers.append(key)
  35. #如果最佳后继集合元素大于一个 随机选择一个
  36. if len(answers) > 0:
  37. x = random.randint(0,len(answers)-1)
  38. col = answers[x][0]
  39. row = answers[x][1]
  40. status[col] = row
  41. return status
  42. #函数三:求得八皇后满足冲突数为0的一个解,循环输出每一步的后继集合 直到不存在冲>突为止
  43. def Queens():
  44. status = [0,1,2,3,4,5,6,7] #初始状态所有皇后都在对角线
  45. #当存在冲突的个数大于0时 循环求解最佳后继 直到找到八皇后解
  46. while get_numof_conflict(status) > 0:
  47. status = hill_climbing(status)
  48. print status
  49. print get_numof_conflict(status)
  50. print "the answer is"
  51. print
  52. print status
  53. if __name__ == '__main__':
  54. Queens()
代码说明 :

(1)启发式耗散函数 get_numof_conflict求出可以彼此攻击2的皇后对的数  hill_climbing是算法中爬山过程的实现,convert字典中存储的键是所有可能后继状态,值是此状态对应的皇后冲突对数,后面通过遍历来找到最佳后继。爬山法算法通常在最佳后继集合中随机选择一个进行扩展,如果这样的后继多于一个的话

(2)  棋盘的排列用列表 status 表示, 依次表示第一列第二列到第n列的摆放位置。 如列表[0,2,1] 表示3*3矩阵第一列皇后放在最下面一格,第二列放在最上面一格,第三列放在中间一格

(3) 运行结果说明:初始状态每个皇后都在次对角线上 每次运行程序将输出求解一个八皇后正确解的爬山法实现过程 ,依次输出求解过程每一个最佳选择的邻居状态和其存在的皇后冲突对数,可以看出在求解过程中 不断爬山的过程--每进行一步都达到一个更好的格局,冲突次数更少,最后一行显示的是八皇后的一个正确解 冲突数为 0

运行截图



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现

对经典算法的问题的回顾与感想 对八皇后问题和八数码问题分别用最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法来实现&#xff0c;并且分析他们的性能。 分析 要求实现的各个算法是有共同点的&#xff0c;比如&#xff0c;八皇后问题相关算法拥有相同的状态空间&…

配置BGP

配置BGP<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />一、 实验目的:配置BGP协议,实现两个isp之间的通信二、 实验拓扑结构图三、实验步骤1. 基本接口配置(略) 2. 配置bgp协议isp<?xml:namespace prefix …

MyXls初级教程

这些天使用MyXls导出Excel报表&#xff08;因为Apose.Cells要收费&#xff09;。感觉MyXls虽然功能远没有Cells强大&#xff0c;但是胜在开源、免费而且性能稳定可靠。用作出一般情况下的报表。足矣&#xff01; 记下几个初级使用方法&#xff0c;希望能够给初入门的人一点帮助…

蓝桥杯 - 历届试题 - 日期问题

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq_33531813/article/details/79516258 </div><div id"content_views" class"markdown_views"><!-- flowchart 箭头图标 勿删 --…

分享WCF文件传输---WCFFileTransfer

前几天分享了分享了WCF聊天程序--WCFChat &#xff0c;本文和大家一起分享利用WCF实现文件的传输。程序运行效果&#xff1a;接收文件端&#xff1a;发送文件端&#xff1a;连接WCF服务&#xff0c;选择要传输的文件文件传输成功&#xff1a;我们会在保存文件的默认路径&#x…

字符串的模式匹配--BF算法KMP算法

BF算法是基于主串指针回溯&#xff0c;重新与子串进行逐字符进行比较&#xff0c;主串为S什么要进行回溯呢&#xff0c;原因在于模式P中存在相同的字符或者说由字符&#xff08;串&#xff09;存在重复&#xff08;模式的部分匹配性质&#xff09;&#xff0c;设想如果模式P中字…

用SQL Server 监控 OS Server 的Task Management信息

用SQL Server 监控 OS Server 的Task Management信息 --原文来自于http://www.databasejournal.com/features/mssql/article.php/3562586/Monitor-CPU-Usage-of-All-Running-Processes---Part-II.htm 一&#xff1a; 监控程序部分 1. 在C 盘创一个文件夹&#xff1a;如 C…

匈牙利算法——最大匹配问题详解

2017年中兴提前批校招&#xff0c;就考了一题匈牙利算法。 匈牙利算法是由匈牙利数学家Edmonds于1965年提出&#xff0c;因而得名。匈牙利算法是基于Hall定理中充分性证明的思想&#xff0c;它是部图匹配最常见的算法&#xff0c;该算法的核心就是寻找增广路径&#xff0c;它是…

字符串匹配之KMP---全力解析

PS&#xff1a;文章是转载的 下方的微信公号不是我的 是原作者的。附上原文链接&#xff1a;字符串匹配之KMP jeliy王的博客 近日&#xff0c;一同学面试被问到字符串匹配算法&#xff0c;结果由于他使用了暴力法&#xff0c;直接就跪了(现在想想这样的面试官真的是不合格的&am…

用Dreamweaver实现ASP动态网站建设【8】

八、制作删除数据记录页 用上述学过的方法在Index.asp上创建“删除”连接。新建网页命名为delete.asp&#xff0c;并打开它&#xff0c;在其上创建一个七行二列的表格&#xff0c;并在左边的表格上填写相应的字段名&#xff0c;然后给网页绑定一个记录集&#xff0c;并对其字段…

大学计算机网络复习题

模拟试题 一、填空题 1、局域网中常用的拓扑结构主要有星型、 环形 、总线型三种。 2 、在当前的网络系统中&#xff0c;由于网络覆盖面积的大小、技术条件和工作环境不同&#xff0c;通常分为广域网、 局域网 、和城域网三种。 3、常用的通信介…

【讨论】从吉日的一段话说起+寻找WinForm架构的最佳实践

这两天园子里最火的莫过于吉日的白话反射&#xff0c;导致包子的批判&#xff0c;然后引来了老赵的两篇文章&#xff0c;然后又有若干人等一堆反射技术文章出世。可谓百花齐放&#xff0c;百家争鸣啊。喜欢这种氛围&#xff0c;呵呵。 今天我不谈反射&#xff0c;但和反射有关 …

Oracle分析函数一——函数列表

Oracle 分析函数 Oracle 分析函数——函数列表 SUM &#xff1a; 该函数计算组中表达式的累积和 MIN &#xff1a; 在一个组中的数据窗口中查找表达式的最小值 MAX &#xff1a; 在一个组中的数据窗口中查找表达式的最大值 AVG &#xff1a;…

用MATLAB实现神经网络

一 BP神经网络实现不使用MATLAB神经网络工具箱问题分析MATLAB实现代码运行结果绘制的图像 二 使用MATLAB的神经网络工具箱简易实现BP网络问题分析工具箱中的相关函数一些参考了MATLAB自带的英文手册mapminmax函数newff函数新版本关于nettrainParam的常用属性train函数sim函数 M…

Follow Me:CCIE RS--使用小凡模拟器搭建的CCIE拓扑图

我用小凡模拟器搭建了CCIE LAB 拓扑图有何不对的地方请指正转载于:https://blog.51cto.com/tanfo/216831

非线性最优化(二)——高斯牛顿法和Levengerg-Marquardt迭代

高斯牛顿法和Levengerg-Marquardt迭代都用来解决非线性最小二乘问题(nonlinear least square)。 From Wiki The Gauss–Newton algorithm is a method used to solve non-linear least squares problems. It is a modification of Newtons method for finding a minimum of a …

逆透视变换详解 及 代码实现(一)

逆透视变换详解 及 代码实现&#xff08;一&#xff09; 中主要是原理的说明&#xff1a; 一、世界坐标轴和摄像机坐标轴 从下图中可以看到&#xff0c;世界坐标为(X,Y,Z) 相机坐标为(Xc,Yc,Zc) 而世界坐标变换到相机坐标存在一个旋转矩阵变换R以及一个位移变换T。 根据上图…

C调用C++链接库

C调用C链接库&#xff1a; 1.编写C代码&#xff0c;编写函数的时候&#xff0c;需要加入对C的接口&#xff0c;也就是extern “c" 2.由于C不能直接用"class.function”的形式调用函数&#xff0c;所以C中需要为C写一个接口函数。例如本来要调用student类的talk函数&a…

逆透视变换详解 及 代码实现(二)

根据 逆透视变换详解 及 代码实现(一)的原理 下面我用车上拍摄的车道图像&#xff0c;采用逆透视变换得到的图像&#xff0c;给出代码前我们先看下处理结果。 首先是原始图像&#xff1a; 下图为逆透视变换图像&#xff1a; 下面说具体的实现吧&#xff01;&#xff01; 一、…

[赵星理]《简单男人》--歌曲温暖你的心,激励你前进

简单的男人&#xff0c;简单的歌曲&#xff0c;赵星理《简单男人》送给所有身负家庭责任的人&#xff0c;要让家越来越美&#xff0c;再苦再累也不能后退。加油&#xff01;简单男人词曲&#xff1a;赵星理演唱&#xff1a;赵星理累不累也不许落泪醉不醉苦辣都值得回味要让家越…