爬山法实现 八皇后问题 (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,一经查实,立即删除!

相关文章

系统容灾备份选型的决策表

冷备Master/SlaveMaster/Master两阶段提交Paxos一致性差最终一致性最终一致性强一致性强一致性事务不支持全局事务本地事务全局事务全局事务延迟低低低高高吞吐高高高低中等数据丢失概率很多很少很少不会丢失不会丢失Failover无只读读/写读/写读/写摘自对Google App Engine Dat…

至誠而不動者

至誠而不動者&#xff0c;未之有也&#xff1b; 吾學問廿年齡亦而立然未能解斯一語&#xff0c;今茲關左之行願以身驗之&#xff0c;若乃死生大事姑置焉。 巳未五月 二十一會猛士

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

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

Domino的压缩数据库的Load Compact命令

以下各表描述了完成 Compact 服务器任务时可以使用的选项。第一列列出了在 Domino Administrator 中使用“任务”“开始”工具或“文件”附签运行 Compact 时显示的选项。第二列列出了等价的命令行选项&#xff0c;可以在使用控制台命令或使用“程序”文档运行 Compact 时使用。…

go数据结构整理

初始化基本一样&#xff0c;不同点需要注意&#xff0c;make使用&#xff0c;nil变量的访问 array 初始化&#xff1a; 57 //修改元素值函数&#xff0c;指针版本和副本版本&#xff0c;指针版会修改原值58 func modify(arr [3]int, i int, v int) {59 //func modify(arr …

配置BGP

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

临时表和内存表的区别

看到很多朋友对这些概念有些混淆&#xff0c;我来发表下我自己的观点。内存表&#xff1a;1. 参数控制&#xff1a;max_heap_table_size2. 到达上线后报错。3. 表定义保存在磁盘上&#xff0c;数据和索引保存在内存里面。4. 不能包含TEXT,BLOB等字段。临时表&#xff1a;1. 参数…

哈工大C语言公开课练兵编程(二)

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

MyXls初级教程

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

竞赛ACM,究竟能为你的职场加分多少?

注&#xff1a;ACM 竞赛全称为 ACM 国际大学生程序设计竞赛&#xff0c;英文全称&#xff1a;ACM International Collegiate Programming Contest&#xff0c;简称 ACM-ICPC 或 ICPC &#xff09;。因为大家习惯简称为 ACM&#xff0c;文章中出现的 ACM 若无额外备注&#xff0…

话里话外:家族化管理模式和职业化管理模式孰优孰劣

中国改革开放三十年&#xff0c;在民营企业中有大批老板现今五六十岁&#xff0c;现在或未来都要考虑为企业选好接班人的问题。他们该如何传位呢&#xff1f;“世袭制”古已有之&#xff0c;“能者居之”亦古已有之。中国有句俗话“穷人家的孩子早当家”&#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…

蓝桥杯 日期问题

版权声明&#xff1a;本文为作者原创文章&#xff0c;转载请注明出处。 https://blog.csdn.net/Glasier/article/details/79630724 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f579…

linux 命令速查手册之十

今天粘贴的是linux命令之 用户管理8.1 adduser功能说明&#xff1a;新增用户帐号。语  法&#xff1a;adduser补充说明&#xff1a;在Slackware中&#xff0c;adduser指令是个script程序&#xff0c;利用交谈的方式取得输入的用户帐号资料&#xff0c;然后再交由真正建立帐号…

字符串的模式匹配--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…

VS2005中,access对只读目录的属性判断不准确

只读目录&#xff0c;C:/>attrib A S H R testdirC:/>attrib testdirA SHR C:/testdir (1)VC6.0的执行结果&#xff1a;***********test stat***********************file [c:/testdir] exists!file [c:/testdir] is directory!file [c:/testdir] can be read!file …