### 问题描述,八皇后

算法描述:爬山法,是以当前最优,可能会导致结果陷入到局部最优,所以本代码为改进版本的随机重启的爬山法。让陷入无限循环的对象,直接重启,进入新的

环境进行爬山。形象的将棋盘的每一行,看成山~而所有位置是0-7为所有的点,最优函数,计算的是整个棋盘的皇后碰撞对数。所以,每一次爬山,就是算,哪个位置

可以使得函数最优

初始化:棋盘,以行为例够形象些,然后去想象爬山

public static int[] init_queen(int[] queen_array){for (int i = 0; i < queen_array.length; i++) {queen_array[i] = (int)(Math.random()*8);}return queen_array;}

爬山函数,准备开始爬山操作

//开始爬山public static void begin_climbing(int[] queen_array){//将当前爬到最优的地方,是不是每个地方都尝试,然后选择最优解的地方,然后开始随机重启//开始爬山之前,对该位置,进行评测,然后,计算换位置后的最优解,然后保存,开始随机下一波爬山//位置随机int function_key = 0;int start_index = 0;int climbing_count = 0;while(true){if (climbing_count==40){queen_array=reset_arry(queen_array);climbing_count = 0;}climbing_count++;function_key = function(queen_array);System.out.println("------------------function = "+function_key);//出口已经写好if(function_key==0){System.out.println("------------------find out array--------------------------");for (int i = 0; i < 8; i++) {System.out.print("-"+queen_array[i]+"-");}System.out.println();break;}int min_Value = queen_array[start_index];//存储的当前下标位置int temp = function_key;for (int i = 0; i < 8; i++) {queen_array[start_index] = i;if (temp>function(queen_array)){min_Value = i;}}queen_array[start_index] = min_Value;//开始随机重启System.out.println("------------------爬山开始--------------------------");start_index = (int)(Math.random()*8);System.out.println("------------------爬山位置"+start_index+"-----------");}}

重置函数:就是将当前棋盘打乱,找到打破僵局

public static int[] reset_arry(int[] queen_array){queen_array = init_queen(queen_array);return queen_array;}

最后,这是适应度函数

public static int function(int[] queen_array){int count = 0;for (int i = 0; i < queen_array.length-1; i++) {for (int j = i+1; j < queen_array.length; j++) {if (queen_array[i]==queen_array[j]|(j-i)==Math.abs(queen_array[i]-queen_array[j])){count++;}}}return count;}

所有代码如下:

package Mountain_climbing_slove_eight_queen;/*** @Author CRH* @Date 2020/11/17 16:41*//*** 传统的爬山法,非常容易走进局部最优,最后走不出来,因为这和其本身的关系相关,针对于爬山法,是讲究当前最优解,没有考虑* 全局概念,所以,如果想要最优解,就需要随机重启,意思是,当走到不行了的时候,需要将整个棋盘进行重置,然后接着进行爬山法,最后* 会得到最优解。*//*** 1.爬山法,将当前每行看成第一个,开始爬山,爬到适当的地方为止,标明其为最OK的点,然后选择随机重启,将下一行进行继续随机重启* 2、适应度函数为冲突的对数* 3、结束条件是冲突函数为0*/
public class mountain_climbing_slove_eight_queen {//爬山法,以当前最优,并寻找最优解public static void main(String[] arg){int[] queen_array = new int[8];queen_array = init_queen(queen_array);begin_climbing(queen_array);}//初始化棋盘public static int[] init_queen(int[] queen_array){for (int i = 0; i < queen_array.length; i++) {queen_array[i] = (int)(Math.random()*8);}return queen_array;}//开始爬山public static void begin_climbing(int[] queen_array){//将当前爬到最优的地方,是不是每个地方都尝试,然后选择最优解的地方,然后开始随机重启//开始爬山之前,对该位置,进行评测,然后,计算换位置后的最优解,然后保存,开始随机下一波爬山//位置随机int function_key = 0;int start_index = 0;int climbing_count = 0;while(true){if (climbing_count==40){queen_array=reset_arry(queen_array);climbing_count = 0;}climbing_count++;function_key = function(queen_array);System.out.println("------------------function = "+function_key);//出口已经写好if(function_key==0){System.out.println("------------------find out array--------------------------");for (int i = 0; i < 8; i++) {System.out.print("-"+queen_array[i]+"-");}System.out.println();break;}int min_Value = queen_array[start_index];//存储的当前下标位置int temp = function_key;for (int i = 0; i < 8; i++) {queen_array[start_index] = i;if (temp>function(queen_array)){min_Value = i;}}queen_array[start_index] = min_Value;//开始随机重启System.out.println("------------------爬山开始--------------------------");start_index = (int)(Math.random()*8);System.out.println("------------------爬山位置"+start_index+"-----------");}}//重置函数public static int[] reset_arry(int[] queen_array){queen_array = init_queen(queen_array);return queen_array;}//适应度函数public static int function(int[] queen_array){int count = 0;for (int i = 0; i < queen_array.length-1; i++) {for (int j = i+1; j < queen_array.length; j++) {if (queen_array[i]==queen_array[j]|(j-i)==Math.abs(queen_array[i]-queen_array[j])){count++;}}}return count;}
}

结语:共勉

优化爬山法之八皇后问题相关推荐

  1. 递归算法学习系列之八皇后问题

    1.引子 中国有一句古话,叫做"不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地 ...

  2. 回溯算法(Backtracking Algorithm)之八皇后问题

    文章目录 1. 回溯算法思想 2. 算法应用 2.1 八皇后问题 1. 回溯算法思想 前面讲过贪心算法并不能保证得到最优解,那怎么得到最优解呢? 回溯思想,有点类似枚举搜索.枚举所有的解,找到满足期望 ...

  3. c语言八皇后问题经典算法,经典算法之八皇后问题

    八皇后问题是一个古老而又著名的问题,是学习回溯算法的一个经典案例.今天我们就一起来探究一下吧! 时间退回到1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题, 在8×8格的国际象棋上摆放八个 ...

  4. Java数据结构算法之八皇后问题

    八皇后问题是由国际象棋手马克斯-贝瑟于1848年提出的问题,是回溯算法的经典案例. 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上 ...

  5. Java学习之八皇后

    递归的第三个实际案例:八皇后 老师给的思路: //1.第一个皇后先放第一行第一列:     //2.第二个皇后放在第二行第一列.然后判断是否 OK,     //如果不 OK,则尝试放在第二列.第三列 ...

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

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

  7. LeetCode 51. N皇后 / 52. N皇后 II(回溯)

    1. 题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案 ...

  8. 【其他】结构技术优化算法--蚁群算法(ant colony optimization)

    目录 1 遗传基因算法 2 模拟退火算法 2.1爬山算法 2.2随机概率优化 3 群体智能算法 3.1蚁群算法 3.2粒子群算法 4总结 1 遗传基因算法 遗传算法(Genetic Algorithm ...

  9. 一文搞懂深度优先搜索、广度优先搜索(dfs、bfs)

    前言 你问一个人听过哪些算法,那么深度优先搜索(dfs)和宽度优先搜索(bfs)那肯定在其中,很多小老弟学会dfs和bfs就觉得好像懂算法了,无所不能,确实如此,学会dfs和bfs暴力搜索枚举确实利用 ...

最新文章

  1. IBM用量子计算机成功模拟分子,登上《自然》封面
  2. 装载:CodePen项目网站简介(以备不时之需)
  3. 阿里云原生开源大家族加入中科院软件所开源软件供应链点亮计 - 暑期 2021
  4. Python 表白?别傻了,女神是拿来撩的!
  5. php-fpm linux_Linux下PHP-fpm配置
  6. 全网首发:CENTOS FreeSwitch集成NVIDIA CODEC
  7. html(jsp)登录页面
  8. 一种基于地理信息的服务方式
  9. php怎么替换斜杠,PHP 反斜杠如何替换掉?
  10. 讨论实现Windows资源管理器的简单方式
  11. 印象深刻的bug汇总(持续更新)
  12. android手机最低内存,安卓想用很久不卡顿?12GB内存是最低标准,这6款硬核配置还便宜...
  13. Linux使用shell定时任务实现ffmpeg视频转码和截图
  14. 记一次requestAnimationFrame之后页面崩溃、内存泄漏问题
  15. 图像处理1--傅里叶变换(Fourier Transform )
  16. Android之BroadcastReceiver
  17. BAT批量替换文件内容
  18. 开放计算十年,西部数据的思考与探索
  19. P4844 LJJ爱数数
  20. 常见的http请求响应的状态码

热门文章

  1. 一、verilog编写三分频电路
  2. Java小白 前端后端开发 环境搭建【jdk+idea+webstorm+maven+nodejs+vue+mysql】
  3. STEP 标准基础概念-刘亚龙
  4. 什么是编程语言,语言之间的区别
  5. 项目上线阿里云(二) 在云上(基于ubuntu系统)安装JDK8,tomcat8
  6. 数据库实验三 数据查询一
  7. 加密聊天软件(功能文档)
  8. oracle column name as sign,Oracle日常性能查看 - ella的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  9. Android Studio校园二手交易市场app
  10. 论基础理论知识的重要性