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

  • 程序的概要设计思想
    • 初始状态
    • 冲突函数
    • 寻找邻居状态
    • 寻找全部解集
  • 程序主要函数的作用
  • 运行结果截图
  • Python源代码

程序的概要设计思想

爬山算法是一种局部贪婪算法,每次更新一次状态,都对相邻状态的冲突状态进行排序,选择最好的相邻状态进行更新,因此易陷入局部极值,从而无法得到最优解。

初始状态

为了方便对状态序列进行操作,爬山法程序采用一维数组x[i]进行编码,只是x[i]的范围变成0~7。一维数组中各元素互不相同。每个编码元素由随机函数产生。

冲突函数

冲突函数与遗传算法中的适应函数类似,只是在本程序中修改为终止条件为0。

寻找邻居状态

每更新一次状态,即每挪动一个皇后,都有56个邻居状态。计算这些新邻居状态的冲突值,选择冲突值最小的邻居状态作为下一个状态。如果本次的初始状态可以由爬山法寻找到最优解,那么爬山法的收敛速度是很快的,因此寻找新邻居的次数如果大于100次,可以认为在这个初始状态下,爬山法寻找不到解。

寻找全部解集

解决八皇后问题的全部解集,在爬山法的程序中可以实现。多次进行爬山法求解,然后进行答案去重操作。随着爬山法求解次数的增多,解集中的解答数量上升。当爬山法求解次数大于800次时,解集中解答数量不在变化,为92,因此可以认为爬山法求解八皇后问题的解集数量收敛于92。
最终得到的结果为,八皇后问题有92个解。
注:
这里求得的92并非严格意义上的完全不同的解,即如果一对解是对称的,那么在本程序中认为它们是两个解。

N·沃思在他的名著《算法+数据结构=程序》一书中给出了求解八皇后问题全部解的Pascal源程序。沃思同时指出,该程序不能识别对称的解,虽然一切可能的解有92个,但是只有12个真正不同的解。

这里给出求出全部不同的八皇后问题的解的C语言程序的刊登在淮南师范学院学报上的论文。有点不应该的是,这篇论文上有个无关痛痒的错别字。
尹星云. 八皇后问题的全部12个不同的解[J]. 淮南师范学院学报, 1997(1):72-74.

此外,补充上次遗传算法解决八皇后问题,因为我采用8列单算子的编码表示个体,本来以为遗传算法虽然全局收敛性比爬山法稍好,但其效率不高且性能不稳定,不大可能在有限的时间内求解出所有92种解。但这篇刊登在华中科技大学学报上的论文采用3种基本算子复合表示一个个体的方式大大提高了计算效率,节约了片内资源,并且有严谨的数学建模过程和严密的结论证明。
周康, 魏传佳, 刘朔, et al. 八皇后问题所有解的模拟DNA算法[J]. 华中科技大学学报(自然科学版), 2009(6).

程序主要函数的作用

初始化皇后状态,每行只有一个皇后:
def initiate(status)

定义冲突函数,主要排查对角线上有多个皇后的情况,返回冲突的皇后对数:
def conflict

定义相邻元素:
def neighbour(status)t(status)

爬山法函数:
def climbing(status)

八皇后问题求解函数:
def qeen():

输入异常处理
def default():

运行结果截图





Python源代码

import random
from time import sleep
import matplotlib.pyplot#初始化皇后状态,每行只有一个皇后
def initiate(status):while len(status)<8:r=random.randint(0,7)if not (r in status):status.append(r)return status#定义冲突函数,主要排查对角线上有多个皇后的情况,返回冲突的皇后对数
def conflict(status):n=0for i in range(8):for j in range(i+1,8):if status[i]==status[j]:n += 1if status[j]-status[i]==i-j or status[j]-status[i]==j-i:n += 1return  n#定义相邻元素
def neighbour(status):next = {}for i in range(8):for j in range(8):if status[i] == j:continuecopy = list(status)copy[i] = jnext[(i, j)] = conflict(copy)return next#爬山法函数
def climbing(status):#当前互相冲突的皇后对数conflictnow=conflict(status)#最佳后继集合ans=[]#寻找最佳后继next=neighbour(status)for key,value in next.items():if value < conflictnow:conflictnow=valuefor key,value in next.items():if value == conflictnow:ans.append(key)#若后继元素大于一个,则随机选择一个if len(ans)>0:rnd=random.randint(0,len(ans)-1)i, j = ans[rnd][0], ans[rnd][1]status[i]=jreturn statusdef qeen():#若找不到解,循环的最大次数max=100total=0status=[]status=initiate(status)#print("The initial status is {}".format(status))climbing(status)while conflict(status)>0:status=climbing(status)total+=1if total==max:#print("Climbinghill algorithm cannot find the answer in {} times".format(max))return []if total < max:#可行解的可视化'''print("The answer is {} which is found in {} times".format(status,total))x=[0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5]y=[status.index(0)+0.5,status.index(1)+0.5,status.index(2)+0.5,status.index(3)+0.5,status.index(4)+0.5,status.index(5)+0.5,status.index(6)+0.5,status.index(7)+0.5]matplotlib.pyplot.title("Using ClimbingHill Algorithm to Solve 8-Queens' Problem")matplotlib.pyplot.axis([0,8,0,8])matplotlib.pyplot.grid()matplotlib.pyplot.plot(x, y, '*')matplotlib.pyplot.show()'''return status#输入异常处理
def default():try:global teststests=eval(input("Please Enter Testing Times(Enter 0 To Complete This Program):"))except:print("Please Enter integer As Testing Times!")return Falsereturn True#多次重复求解,寻找不同的解集
while True:t, failed=0,0solve=[]#测试次数try:tests=eval(input("Enter Testing Times(Enter 0 To Complete This Program):"))except:print("Please Enter integer As Testing Times!")boolean=Falsewhile boolean!=True:boolean=default()if tests==0:break#去掉重复的解,保留不同的解for i in range(tests):status = qeen()if status==[]:failed+=1continueelif not(status in solve):solve.append(status)t+=1else:t+=1print("Climbinghill algorithm failed times:{}".format(failed))print("Climbinghill algorithm succeeded times:{}".format(t))print("Climbinghill algorithm's succeeded rate:{:.2f}%".format((t-failed)/t*100))print("Different solutions' number:{}".format(len(solve)))#选择是否输出全部不同的解集ifprint=input("Do you wanna print all the different solutions? Y(y)/N(n)")while ifprint!='Y' and ifprint!="N" and ifprint!='y' and ifprint!='n':ifprint = input("Please Enter Y/y or N/n :")if ifprint=='y' or ifprint=='Y':s,t=0,0for i in solve:s+=1if t==5:print("{:3}:{}".format(s,i))t=0else:t+=1print("{:2}:{}".format(s,i),end="")print("")print("----------------Testing times:{}----------------".format(tests))

爬山法求解八皇后问题的全部解法相关推荐

  1. C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题

    C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...

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

    本文主要简单阐述爬山法的基本算法思想,并给出用此算法实现八皇后问题详细过程 最基本的爬上搜索算法表示:(节选自<人工智能>第二版): function HILL-CLIMBING(prob ...

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

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

  4. C语言编程统计八皇后问题的解的个数,八皇后问题C语言解法

    偶遇八皇后问题,随即自己写了一个仅供参考 #include #include #define SIZE 8 void Circumsribe(int(*checkerboard)[SIZE], int ...

  5. 遗传算法求解八皇后问题—matlab

    目录 题目要求 设计思路 1.染色体编码 2.适应度函数 3.选择算子 4.交叉算子 5.变异算子 6.精英替换 运行结果 源程序 题目要求 在8*8的国际象棋棋盘上放置了八个皇后,要求没有一个皇后能 ...

  6. 遗传算法求解八皇后问题C++实现

    一. 实验问题简介 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 本次实验利用遗传算法求解八皇后问题的一个可行 ...

  7. 八皇后问题python_python求解八皇后问题

    今天突然有个行外的朋友扔了一张图给我,希望我能帮他用python做一下这个作业--八皇后问题. 八皇后问题是一种经典的数学求解问题,规则是在8×8的国际象棋棋盘上,要求在每一行(或者每一列)放置一个皇 ...

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

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

  9. 八皇后问题 递归求解法

    #include <iostream> #include <fstream> #include <string.h>/** 八皇后问题递归方法实现 */ using ...

最新文章

  1. Vue中组件数据的传递
  2. 目标跟踪之camshift---opencv中meanshift和camshift例子的应用
  3. python文件式_python中文件操作的六种模式及对文件某一行进行修改的方法
  4. Python 实现批量从不同的Linux服务器下载文件
  5. Getting Started With Hazelcast 读书笔记(第七章)
  6. 计算机网络与通信02339,4月全国高等教育自学考试计算机网络与通信试题及答案解析.docx...
  7. DB2数据库中DB2字符串类型
  8. EF CodeFirst 学习 1 - 用fluent API设置元数据,
  9. iOS获取音频设备信息
  10. Oracle ADF开发实战指南pdf
  11. 某生鲜平台面试题:如何保证库存在高并发的场景下是安全的?
  12. 手机页面rem响应式布局
  13. 盘点员工工作效率低的8大原因
  14. Java1-35 Java学习笔记
  15. 抖音流量密码时间段,一天中这个时候发推荐几率大
  16. 不错的每日站会的一个实践
  17. matlap心形代码+二维画图
  18. java身体指数计算判定BMI
  19. 动物克隆技术应用价值_浅谈生物克隆技术及其未来应用问题与前景
  20. Android Studio开发蓝牙应用(二)

热门文章

  1. 那些你需要知道的互联网广告投放知识
  2. 专注少儿成长,掌门少儿打造多维思维启蒙体验
  3. OpenLayers5在EPSG:4326投影坐标系下测量长度和面积
  4. Https证书的安装
  5. 工资3000,靠“视频剪辑”月入40000:会赚钱的人,从不靠拼命!
  6. 爬取起点小说总排行榜
  7. 2015-点餐系统(服务器)
  8. 防水蓝牙耳机哪个好?防水音质好的蓝牙耳机推荐
  9. 工程职业伦理(2018年秋)学堂在线习题
  10. Visual Assist 10.9.2248 破解版(支持VS2017)