遗传算法简单介绍与MATLAB实现(三)
2017-10-08 11:27
288 查看
遗传算法简单介绍与MATLAB实现(三)
新的题目
我们先来看一下可能会遇到的比较常见的问题:找一堆点的中心。假如我们现在有十个点:
序号 | x | y |
---|---|---|
1 | 1.4 | 3.6 |
2 | 2.7 | 0.1 |
3 | 1.5 | 6.9 |
4 | 4.6 | 3.6 |
5 | 5.2 | 1.2 |
6 | 5.6 | 2.7 |
7 | 8.2 | 3.5 |
8 | 3.8 | 2.1 |
9 | 4.6 | 2.9 |
10 | 8.7 | 3.3 |
以上就是题目,所以我们可以先用公式来形容一下,我们需要找一个点(x0,y0),令该点到其他十个点的距离之和为d,则有
d=∑i=110(x0−xi)2+(y0−yi)2−−−−−−−−−−−−−−−−−−√
所以我们现在面对的就是求
mind
现在看起来应该比较清楚了,但是有一个问题,就是上一章中,我们讲的是求最大值,即令最优解是最大值。如果我们想要改成求最小值的话,那么程序中要有很多地方需要改,如果一个不慎,很有可能哪里没有改过来就导致程序的结果出现了bug,因此我们稍微变换一下,把我们想求的变成最大值就好
max1d
这样子就能够适应我们之前讲的程序了。
模型与遗传算法连接处
那么要怎么用遗传算法解决呢?上一章中我在CalFitness这个函数说明了它很重要,就是因为它是被解决模型和遗传算法的连接部分。我们曾经说过,某个个体的适应度其实就是被求模型的解,也就是说每个个体我们都要把他的染色体带入到模型中求一下解,得出来的解就是适应度。而CalFitness这个函数就是用来求解种群中每个个体的适应度的。
我们再看一下上一章中这一段程序
function fitness = CalFitness(chrom, N, N_chrom) fitness = zeros(N, 1); %开始计算适应度 for i = 1:N x = chrom(i, 1); y = chrom(i, 2); fitness(i) = sin(x)+cos(y)+0.1*x+0.1*y; end
首先我利用zeros函数给fitness预分配了空间,接下来用了一个for循环对种群中所有个体进行循环内部的操作。这个操作就是我们上一章出的那个求解最大值的问题。
所以到这里应该很明白了,我们把模型的程序写在CalFitness里面就好。
模型的代码
因此我们依旧令染色体节点数为2,第一个节点是x坐标,第二个节点是y坐标,修改两个变量的范围都是[0,10]。这是基础参数需要变化的。把最后输出的适应度全部都被一除一下,这是代码需要修改的。
所以可以很容易写出这个模型的代码为
function fitness = CalFitness(chrom, N, N_chrom) fitness = zeros(N, 1); point = [1.4 2.7 1.5 4.6 5.2 5.6 8.2 3.8 4.6 8.7; 3.6 0.1 6.9 3.6 1.2 2.7 3.5 2.1 2.9 3.3]; for i = 1:N x = chrom(i, 1); y = chrom(i, 2); xy = [x; y]*ones(1, 10); d = sum(sqrt((xy(1,:)-point(1,:)).^2+(xy(2,:)-point(2,:)).^2)); fitness(i) = 1/d; end
顺便再画出图,修改一下PlotModel函数
function y = PlotModel(chrom) point = [1.4 2.7 1.5 4.6 5.2 5.6 8.2 3.8 4.6 8.7; 3.6 0.1 6.9 3.6 1.2 2.7 3.5 2.1 2.9 3.3]; figure(2) scatter(point(1,:), point(2,:), 'ko') hold on scatter(chrom(1), chrom(2), 'bo', 'filled') for i = 1:10 plot([point(1, i) chrom(1)], [point(2, i) chrom(2)], 'y') end
模型的结果
因此可以得到结果最优的坐标点为(4.6,2.9),此时距离其他十个点的距离之和为24.1432。遗传算法适应度迭代图为
下图是做出来的坐标点的位置
简单的总结
以上就是遗传算法的简单应用与MATLAB实现。希望我的内容可以给诸位看的人一点帮助。曾经我在学习Python的时候也写了一个遗传算法,所以我下一次会把Python版的代码放出来。当初写时是想要熟悉Python的类以及列表的使用等,所以并没有使用numpy来仿MATLAB写,所以诸位有相同意向的在我下一篇博客里可以一起讨论一下。
以上。
相关文章推荐
- 遗传算法简单介绍与MATLAB实现(一)
- 神经网络之感知器算法简单介绍和MATLAB简单实现
- Adaline神经网络简单介绍和MATLAB简单实现
- 简单遗传算法实现(MATLAB)
- RBF神经网络简单介绍与MATLAB实现
- 遗传算法的简单讲解与matlab实现
- 使用matlab实现简单的遗传算法(一)
- 智能算法之Matlab实现(1)——遗传算法(1)
- PCA检测人脸的简单示例_matlab实现
- 几种服务器端IO模型的简单介绍及实现
- 基于C均值算法简单分类(matlab实现)
- CString实现原理简单介绍
- android图文介绍NDK安装及简单jni demon的实现
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
- 腾讯云数据库团队:MySQL5.7 JSON实现简单介绍
- 多变异位自适应遗传算法(MMAdapGA)的算法原理、算法步骤和matlab实现
- KVM虚拟化的四种简单网络模型介绍及实现(二)
- 一致性Hash算法介绍及简单实现
- iOS学习笔记14(1)—Core Data简单介绍和实现