启发式搜索之八皇后问题
问题描述->移步前面
主要公式fx=gx+hx
* g(x):针对于初始节点,到目标节点实际所需要付出的带价
* h(x):针对初始节点,到目标节点所需要的估计带价
* 在八皇后问题上,估计带价,是自己预定的,此处设置,其为皇后的碰撞对数,当然,估计是最优
* 的问题,就是0,无碰撞才是最优的结果。
注释都有,自行消化
package Heuristically_reserach_eight_queen;/*** @Author CRH* @Date 2020/11/25 10:05*/
public class Heuristically_research_egith_queen {/*** 启发式搜索,包含有序搜索算法,以及A*算法,* 主要公式fx=gx+hx* g(x):针对于初始节点,到目标节点实际所需要付出的带价* h(x):针对初始节点,到目标节点所需要的估计带价* 在八皇后问题上,估计带价,是自己预定的,此处设置,其为皇后的碰撞对数,当然,估计是最优* 的问题,就是0,无碰撞才是最优的结果。*/public static void main(String[] args){int[] queen_array = new int[8];int[] queen_array1 ={1,1,1,1,1,1,1,1};queen_array = init_queen(queen_array);//初始化完成// System.out.println("-----------测试点-----------------------"+function_g(queen_array1,7));begin_heuristcally(queen_array,0);}//开始查找public static void begin_heuristcally(int[] queen_array,int index){//其实和之前的评价函数类似,等同于,该点进行评估,然后针对,是否在该点进行落子,落皇后int hx = 0;int fx = function_g(queen_array,index);;for (int i = 0; i < 8; i++) {queen_array[index]=i;int gx = function_g(queen_array,index);//这是该位置,实际评估的函数值//然后开始进行评定fx = gx +hx;if (fx>0){//假设gx>fx说明该点,不满足条件,与预估不符合,然后开始将其,复原,寻找下一节点,具体操作就是,将其往下,继续走}else if (fx == 0){//现行判断是否达到出口条件,然后考虑是否进入下一步if (index==7){//表示问题已经到了最后一步,但是还是最优,进而表明其实优解System.out.println("--------------------已经找到最优解-----------------------");print_queen(queen_array);break;}else {//表明,这个地方,为优解,进而向下一步进行->index+1;begin_heuristcally(queen_array,(index+1)%8);//直接进行取取余,不用担心下标越界}}}}//初始化函数public static int[] init_queen(int[] queen_array){for (int i = 0; i < queen_array.length; i++) {//queen_array[i] = (int)(Math.random()*8);queen_array[i] = 0;}return queen_array;}//实际函数的计算,参数position是针对该点前面的评价函数,进行评定,节省查找时间,进行优化public static int function_g(int[] one_geTi,int position){int flight_count = 0;for (int i = 0; i <= position-1; i++) {for (int j = i+1; j <= position; j++) {if (one_geTi[i]==one_geTi[j]|((j -i) == Math.abs(one_geTi[i]-one_geTi[j]))){flight_count++;}}}return flight_count;}public static void print_queen(int[] queen){for (int i = 0; i < queen.length; i++) {System.out.print(queen[i]+" ");}System.out.println();}
}
结语:共勉
启发式搜索之八皇后问题相关推荐
- 递归算法学习系列之八皇后问题
1.引子 中国有一句古话,叫做"不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地 ...
- 回溯算法(Backtracking Algorithm)之八皇后问题
文章目录 1. 回溯算法思想 2. 算法应用 2.1 八皇后问题 1. 回溯算法思想 前面讲过贪心算法并不能保证得到最优解,那怎么得到最优解呢? 回溯思想,有点类似枚举搜索.枚举所有的解,找到满足期望 ...
- 优化爬山法之八皇后问题
### 问题描述,八皇后 算法描述:爬山法,是以当前最优,可能会导致结果陷入到局部最优,所以本代码为改进版本的随机重启的爬山法.让陷入无限循环的对象,直接重启,进入新的 环境进行爬山.形象的将棋盘的每 ...
- c语言八皇后问题经典算法,经典算法之八皇后问题
八皇后问题是一个古老而又著名的问题,是学习回溯算法的一个经典案例.今天我们就一起来探究一下吧! 时间退回到1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题, 在8×8格的国际象棋上摆放八个 ...
- Java数据结构算法之八皇后问题
八皇后问题是由国际象棋手马克斯-贝瑟于1848年提出的问题,是回溯算法的经典案例. 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上 ...
- Java学习之八皇后
递归的第三个实际案例:八皇后 老师给的思路: //1.第一个皇后先放第一行第一列: //2.第二个皇后放在第二行第一列.然后判断是否 OK, //如果不 OK,则尝试放在第二列.第三列 ...
- LeetCode 51. N皇后 / 52. N皇后 II(回溯)
1. 题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案 ...
- 一文搞懂深度优先搜索、广度优先搜索(dfs、bfs)
前言 你问一个人听过哪些算法,那么深度优先搜索(dfs)和宽度优先搜索(bfs)那肯定在其中,很多小老弟学会dfs和bfs就觉得好像懂算法了,无所不能,确实如此,学会dfs和bfs暴力搜索枚举确实利用 ...
- 程序员的算法课(3)-递归(recursion)算法
一.什么是递归 递归是一种数学上分而自治的思想. 递归将大型复杂问题转化为与原问题相同但规模较小 的问题进行处理 递归需要有边界条件,当边界条件不满足时,递归继续进行:当边界条件满足时,递归停止 [百 ...
- c 递归下降识别程序_程序员的算法课(3)-递归(recursion)算法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...
最新文章
- CentOS 7 相关命令
- 把一张的数据添加到另一张中
- Docker - 在CentOS 7中安装Docker
- 论文浅尝 | ExCAR: 一个事件图知识增强的可解释因果推理框架
- 嵌入式nosql php,NoSQL 嵌入式数据库NeDB示例
- 如何查询以太信道接口_浅谈百兆千兆以太网物理层
- 一次性解决导航栏的所有问题
- mysql 执行计时_ps-top 用于MySQL的数据库top工具
- 网站发布(项目上线流程)
- 【Linux】04 实验笔记
- Java正则表达式实现计算器_Python利用正则表达式实现计算器算法思路解析
- 批处理变量输出时提示“ECHO处于关闭状态”
- 肇东一中2021高考成绩查询,肇东一中高考录取喜报
- 自己做网站有哪些方法呢?方法分享
- 在浏览器地址栏中,传数组参数
- JAVA我的世界怎么做成就_Editing 成就/Java版
- Canvas 画椭圆的方法
- 服务器错误信息36887,TLS 协议所定义的严重错误代码是 10。Windows SChannel 错误状态是 1203...
- 歌曲光辉岁月和弦走向探究
- 内地两例确诊病人尚有44名密切接触者未能寻获