目录

  • 题目要求
  • 设计思路
    • 1.染色体编码
    • 2.适应度函数
    • 3.选择算子
    • 4.交叉算子
    • 5.变异算子
    • 6.精英替换
  • 运行结果
  • 源程序

题目要求

在8*8的国际象棋棋盘上放置了八个皇后,要求没有一个皇后能攻击另一个皇后,即任意两个皇后都不处于棋盘的同一行、同一列或同一对角线上。要求设计并实现解决八皇后问题的遗传算法。

设计思路

遗传算法是模拟自然选择和遗传学机理的生物进化过程的一种计算模型,主要特点为直接对结构对象进行操作,无需求导和对函数连续性的限定,具有较好的并行性和全局寻优能力。
染色体编码方案适应度函数的设计遗传操作(选择、交叉、变异)的设计控制参数的设定,是遗传算法的核心问题,所以需要针对八皇后问题建立适合遗传算法的模型。

1.染色体编码

可以将8*8棋盘看作一个8行8列的矩阵,以行向量为染色体,每位基因值为该列上棋子所处的行值,即可表征所有棋子的位置。如图1所示,染色体population=[5,8,4,1,7,8,6,3]。

在遗传算法开始时种群存在多个个体,就可以将其组合起来。若种群个体数量为n,则可以形成一个n*8的矩阵,每一行即为每个个体的染色体。

2.适应度函数

遗传算法中的适应度函数即为对最优解的要求。那针对八皇后问题,则是需要得到互不攻击的一种棋子摆放情况,其中攻击包括:列攻击,行攻击,主对角线攻击,副对角线攻击。
(1)列攻击:由于在染色体的编码为行向量,那么每一位只能存放一个数据,所以默认所有个体都不会产生列攻击。
(2)行攻击:当染色体行向量中,存在某两位或更多位的值相同时,即存在互相攻击情况。
(3)主对角线攻击:当染色体行向量中,存在某两位或更多为的下标之差等于对应下标的值之差时,即两者间斜率为1,即存在互相攻击情况。
(4)副对角线攻击:当染色体行向量中,存在某两位或更多为的下标之差等于对应下标的值之差的负值时,即两者间斜率为-1,即存在互相攻击情况。
当上述攻击每发生一次时,适应度函数加1。因此在本例中与传统遗传算法相反,一个个体的适应度越大代表这个解越差,只有适应度为0时才是符合要求的解,所以也可以将本例中的适应度理解为攻击度,即攻击度越小越好。

3.选择算子

遗传算法中的选择是为了从种群中选择出满足要求的个体,以便得到更优秀的后代。在本次设计中,采用了轮盘赌的选择方式。但需要注意的是,上述的适应度计算方案让最优秀个体的值反而最小,因此在轮盘赌算法时,优秀的个体所占的区域反而更小。所以,设定一个最大值max,在轮盘赌时用最大值减去适应度值fit_population,得到一个个体越优秀值越大的轮盘适应度wheel_fit。互相不攻击的最大值max为 n*(n-1)/2,本例中即为28。所以wheel_fit = 28 - fit_population
每次轮盘赌根据生成的随机数选择出两组较为优秀的个体,进入后续的交叉繁衍。

4.交叉算子

遗传算法中的交叉是为了在整体解空间中尝试更多的组合情况。因此本次设计中采用映射交叉算子,即随机生成交叉点,对上一步选择出的父代和母代染色体进行映射互换。

5.变异算子

遗传算法中的变异是为了使其具备局部的随机搜索能力。本次设计中采用的均匀变异算子,即用符合编码范围内的随机数,以某一较小概率来替换染色体上某一位的基因值。本次设计的变异发生平均概率设定为10%。

6.精英替换

为优化寻优算法,加速收敛过程,本次设计采用了精英替换策略,首先在每次繁衍开始时挑选精英个体,然后在每次遗传操作完成后,淘汰此时最差的个体并由精英个体进行替换。本次设计的精英替换数量设定为1。

运行结果

连续运行设计程序十次,最大迭代次数8949次,最小迭代次数731次,平均迭代次数约为4140次,均能得到符合要求的解。

源程序

%遗传算法求解八皇后问题
clear;
clc;
n = 8;  %棋盘大小为 n*n
num_population = 10;  %这个种群有10个个体
population = randi(n,[num_population,n]);  %生成种群初始染色体
G = 1;
G_max = 1e5;  %繁衍上限
generation = zeros(1,G_max);%计算每个初始种群的适应度
fit_population = ones(num_population,1);
for i = 1:num_populationfit_population(i) = GA_fitness(population(i,:));
end    while prod(fit_population)~=0 && G<=G_max    %循环直到找到解或超过繁衍上限elite = 1;      %每次繁衍种群更新量%按照适应度选出精英[~,index] = sort(fit_population);  %升序排列后,每个适应度在原列表的位置order = index(1:elite);            elite_population = population(order,:);  %得到精英染色体%轮盘赌选择新种群max = 28*ones(num_population,1);wheel_fit = max - fit_population;pro_fit = wheel_fit ./ sum(fit_population);pro_wheel1 = rand(10,1);  %生成随机概率pro_wheel2 = rand(10,1);father = GA_selection(pro_fit,population,pro_wheel1);mother = GA_selection(pro_fit,population,pro_wheel2);%随机生成交叉位置,染色体交叉繁衍for i=1:num_populationcross = randi(n-1);population(i,:) = [father(i,1:cross),mother(i,cross+1:n)];end%染色体随机变异for i=1:num_populationmu_pro = rand(1);mu_location = randi(n);if mu_pro <= 0.1population(i,mu_location) = randi(n);endend%更新种群的适应度for i = 1:num_populationfit_population(i) = GA_fitness(population(i,:));end%找出繁殖的后代中最差的个体,把精英加入种群[~,index] = sort(fit_population,'descend');index_bad = index(1:elite);population(index_bad,:) = [];    %删除最差的个体population_temp = [population; elite_population];population = population_temp;%更新种群的适应度for i = 1:num_populationfit_population(i) = GA_fitness(population(i,:));endgeneration(G) = min(fit_population);G = G + 1;
end
plot(generation(1:G-1));
title('遗传算法最优解迭代过程');
legend('最优种群适应度值');
xlabel('迭代次数');
ylabel('适应度值');
axis auto;
if prod(fit_population)==0disp('遗传算法收敛');order = find(fit_population == 0);disp('可能的解为 ');disp(population(order,:));
elsedisp('遗传算法不收敛');
end
disp(['经历了 ',num2str(G-1),' 代遗传']);function [fitness] = GA_fitness(state)%适应度计算函数%输入是种群中个体的染色体fitness = 0; n = length(state);   %每列的状态,看有多少个能互相攻击,每两两攻击算一次 先算行攻击for j=1:nfor k=(j+1):nif state(j)==state(k)fitness = fitness + 1;end  if state(j)-state(k) == j-k || state(j)-state(k) == k-j fitness = fitness + 1;end         endendendfunction [ selection ] = GA_selection( pro_fitness , population , wheel )
% 父母代选择函数
% 输入分别是 归一化的适应度,种群,概率轮盘num_population = 10;  selection = population; %初始化父母代pro_array = cumsum(pro_fitness);for i=1:num_populationk=1;while k <= num_populationif wheel(i) < pro_array(k)selection(i,:) = population(k,:);break;elsek = k + 1;endendend
end

遗传算法求解八皇后问题—matlab相关推荐

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

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

  2. 八皇后问题遗传算法c语言,遗传算法解决八皇后问题

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 八皇后问题描述 19 世纪著名的数学家 Gauss 在 1850 年提出八皇后问题后, 该问题成为各类语言程序设计的经典 ...

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

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

  4. python遗传算法八皇后_遗传算法之:八皇后问题

    八皇后问题: 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法.正确的解有很多个,遗传算法并不直接计算一共有多少个解,而是寻找满 ...

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

    爬山法求解八皇后问题的全部解法 程序的概要设计思想 初始状态 冲突函数 寻找邻居状态 寻找全部解集 程序主要函数的作用 运行结果截图 Python源代码 程序的概要设计思想 爬山算法是一种局部贪婪算法 ...

  6. 【建模算法】基于遗传算法求解TSP问题(matlab求解)

    [建模算法]基于遗传算法求解TSP问题(matlab求解) TSP (traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增 ...

  7. 【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1337期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab遗传算法求解旅行商问题[含Matlab源码 1337期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  8. 遗传算法解决八皇后问题

    遗传算法解决八皇后问题 程序设计的概要思想 编码方案 适应度的计算 初始种群 选择算子 交叉算子 变异算子 终止策略 程序的主要函数及其作用 运行结果截图 Python源代码 程序设计的概要思想 遗传 ...

  9. 遗传算法解决八皇后问题(java源码)

    本文源码下载链接:https://download.csdn.net/download/goulvjiang3176/11221063 另有贪心算法解决八皇后问题的源码下载链接:https://dow ...

最新文章

  1. 如何用Dart写一个单例
  2. python3 requirements使用方法 ~= >= <
  3. Task三个列子的分享
  4. boost::phoenix模块使用 istreambuf_iterator 测试 lambda 函数对象
  5. 开关电源磁性元件理论及设计pdf_邵革良首席科学家丨高性价比PFC电源设计及其电感技术...
  6. mysql中like与rlike_MySQL中RLIKE运算符的使用详解-mysql教程-
  7. 如何保护Mac的数据安全?
  8. vivadohlsdsp_FPGA硬件加速学习vivado hls-----------------卷积加速
  9. SpringMVC 工作原理详解
  10. 云服务器win10系统初始密码,win10忘记系统密码?教你重置-
  11. 关于js的数组方法部分整理
  12. 永磁同步直线电机驱动控制原理与matlab建模仿真
  13. fork和lockf应用
  14. MySQL数据操作语言——插入语句、修改语句和删除语句
  15. 在线vr模型展示-3D可视化展示解决方案
  16. java找不到的模板_java – 在当前主题中找不到样式’coordinat...
  17. 新开餐饮店如何市场定位,都应该注意些什么?
  18. linux分区方案 500g,linux系统分区建议
  19. IDEA安装数据库插件Database Navigator和IDEA连接数据库
  20. thinkphp3.1.3 getshell_C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形的方法详解_C#教程...

热门文章

  1. 烹饪专业的计算机课程,烹饪专业的专业课程有哪些需要学习
  2. 计算机上的做蛋糕游戏,做蛋糕烹饪游戏电脑版
  3. 思科网络安全 第九章考试答案
  4. 尚硅谷数据结构和算法01-数据结构介绍和稀疏数组
  5. restlet_JAX-RS 的一个列子
  6. 下棋机器人棋子图像识别的软件代码之matlab仿真
  7. iOS App外包开发解决闪退问题
  8. PYTHON学习路径计划图整理
  9. 永恒之蓝MS17-010漏洞利用 writeup
  10. 独立模式(Standone Mode)启动Spark