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

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

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

运行截图

爬山法实现 八皇后问题 (Python 实现)相关推荐

  1. Python:爬山法/随机重启爬山法/允许侧移的爬山法解决八皇后问题

    文章目录 1 八皇后问题 2 程序代码 2.1 程序1 2.2 程序2 2.3 程序3 2.3.1 爬山法 2.3.2 随机重启爬山法 2.3.3 允许皇后侧移的爬山法 3 评价 1 八皇后问题 有一 ...

  2. 爬山法求解八皇后问题的全部解法

    爬山法求解八皇后问题的全部解法 程序的概要设计思想 初始状态 冲突函数 寻找邻居状态 寻找全部解集 程序主要函数的作用 运行结果截图 Python源代码 程序的概要设计思想 爬山算法是一种局部贪婪算法 ...

  3. JAVA用爬山法解决八皇后问题_八皇后问题爬山法实现(C语言)

    1 #include 2 #include 3 #include 4 #include 5 // 6 //编程题7 //爬山法(八皇后问题)8 // 9 10 11 //棋子结构体12 //typed ...

  4. 八皇后问题python实现

    八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后 ...

  5. 递归算法——八皇后问题 python

    研究了一下午的八皇后算法,可算是搞明白了,为了避免以后忘记,还是写个博客吧!可能会跟其他文章有相似之处,最终还是希望能好好学习算法,都是经过自己思考后亲自写的代码,虽然过程比较艰难,我写了很多注释. ...

  6. 八皇后问题python实现_八皇后问题的python实现

    以前写的一个八皇后问题求解,思路就是每次循环列出所有的可能解,然后过滤出不符合要求的解.详细见代码: //检查两个点是否在攻击线上 def attack(p1,p2): return p1[0]==p ...

  7. 八皇后问题python_八皇后问题Python实现

    八皇后问题描述 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  8. 八皇后问题python回溯_解决Python基于回溯法子集树模板实现8皇后问题

    这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下 本文实例 ...

  9. LeetCode —— 面试题 08.12. 八皇后(Python)

    设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的"对角线"指的是所有的对角线,不只是平分整个棋盘的那两条对角线. ...

最新文章

  1. C#Post文件上传
  2. 中文分词_中文分词及其应用
  3. 深入Java集合系列之五:PriorityQueue
  4. 【信号】信号集、sigprocmask、sigpending
  5. 用strtotime()和date()函数算出2019年9月的周日日期
  6. 机器学习基石笔记5——为什么机器可以学习(1)
  7. 全链路数据血缘在满帮的实践
  8. Spring4.x(3)---工厂模式设计IOC容器
  9. java开发工作找不到要放弃吗,这样学习Java,才能找到一份Java开发的工作。不要盲目的学!...
  10. 《基 于 N Gram 的无词典 中文分词算法》 n-gram读感
  11. unity学习笔记-uniwebview3的使用以及一些补充(视频问题已解决)
  12. 【Windows优秀软件推荐】:唧唧down——视频和弹幕全清晰度下载
  13. m2 ngff无线网卡接口的笔记本电脑加装苹果网卡,完美安装苹果mac OS
  14. 酒桌上的那些礼仪规矩~
  15. csgo星空天空代码_csgo天空背景怎么改_csgo天空背景更改方法
  16. 树莓派IIC通讯获取BMI08x IMU数据进行姿态解算,并通过UART/TCP在rviz上显示
  17. 手绘标记视频标题文字介绍ae模板
  18. Android开发者接口mock location demo
  19. 【C标准库1】math.h
  20. 批量转化py2topy3脚本

热门文章

  1. Harbor升级和数据库迁移手册
  2. No style sheet with given id found错误
  3. Java代理系列-静态代理
  4. centos 修改ip地址
  5. mysql复制: 一个master对应1个slave
  6. Android studio gradle 无法获取 pom文件
  7. 无内存在优盘可以启动计算机吗,没有U盘不要紧,内存卡做启动盘装Win7方法
  8. java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法
  9. java 实体类规范_实体类的规范
  10. java opencv安装路径_Java搭建opencv开发环境