八皇后问题
基本遗传算法
适应度函数= 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