人工智能作业 - 遗传算法解八数码问题

八皇后问题

在这里插入图片描述

基本遗传算法

在这里插入图片描述

适应度函数= 28-互相攻击的皇后对的数目。
整个算法的流程图如下:
在这里插入图片描述
注意事项
在这里插入图片描述

实现思路

用字符串str表示当前的局势,依次表示每第 i 行的第 str[i] 列,直接过滤掉了同行的冲突问题,而同列就是两个值一样。
比如“21376504”对应的局势是:
在这里插入图片描述

代码实现

(八皇后互相攻击那块写的不对,因为对角同行也是同行)
伪代码:

1.设置算法参数
2.进入遗传算法开始循环体
	2.1 生成初始种群
	2.2 选择复制
	2.3 交插
		2.3.1 计算出需要交插的个数n
		2.3.2 把适应性比较好的直接放入下一代,把剩下n个交插
	2.4 变异
		2.4.1 计算变异个数m
		2.4.2 把适应性好的直接放入下一代,剩下m个变异
	2.5 检查是否得到目标状态或者迭代次数达到最大
		返回目标状态或者进行下一层迭代
3. 输出结果,同时输出结果矩阵

完整代码:

package AIClass;

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;

class Individual implements Comparable<Individual>{
   
	private Integer value ;
	private String status;
	
	Individual(String status){
   
		this.value = calValue(status);
		this.status = status;
	}
	
	public String toString() {
   
		return "value = "+value+",status = "+status;
	}
	
	public int compareTo(Individual o) {
   
		return o.value.compareTo( this.value );

	}
	
	//适应函数计算,适应函数为28时,表示达到目标。值越大表明适应性越好。
	public Integer calValue(String s) {
    
		//记录互相攻击的对数
		Integer res = 0; 
		for(int i = 0;i<8;i++) {
   
			for(int j = i+1;j<8;j++) {
   
				//i为第一个点的位置,j为第二个点的位置,如果在同一行或者同一列,res+1.
				if( s.charAt(i) == s.charAt(j) || ( (j-i) == Math.abs( s.charAt(i) - s.charAt(j
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛阳八中我最棒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值