-
-
GA matlab算法程序
2011-10-06 09:41:27matlab GA算法程序 clc,clear load sj.txt sj = [sj;sj(1,:)]; x = sj(:,2); y=sj(:,3); sj = [x y]; %距离矩阵 d N = size(sj,1); d = zeros(N); for i=1:(N-1) for j=i+1:N d(i,j) = sqrt((x(i)-x(j))^2 + (y... -
Matlab Prufer number 解决MST问题 GA算法
2018-06-24 23:52:02Matlab GA算法 利用 Prufer number 解决 MST 问题 遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,... -
matlab遗传算法(GA)详解(一)算法入门
2019-07-02 13:37:11遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解(所找到的解是全局最优解)的方法。 参数编码、初始群体的设定...遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解(所找到的解是全局最优解)的方法。
参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。
1)种群初始化。我们需要首先通过随机生成的方式来创造一个种群,一般该种群的数量为100~500,这里我们采用二进制将一个染色体(解)编码为基因型。随后用进制转化,将二进制的基因型转化成十进制的表现型。
2)适应度计算(种群评估)。这里我们直接将目标函数值作为个体的适应度。
3)选择(复制)操作。根据种群中个体的适应度大小,通过轮盘赌等方式将适应度高的个体从当前种群中选择出来。其中轮盘赌即是与适应度成正比的概率来确定各个个体遗传到下一代群体中的数量。
具体步骤如下:
(1)首先计算出所有个体的适应度总和Σfi。
(2)其次计算出每个个体的相对适应度大小fi/Σfi,类似于softmax。
(3)再产生一个0到1之间的随机数,依据随机数出现在上述哪个概率区域内来确定各个个体被选中的次数。
4)交叉(交配)运算。该步骤是遗传算法中产生新的个体的主要操作过程,它用一定的交配概率阈值(pc,一般是0.4到0.99)来控制是否采取单点交叉,多点交叉等方式生成新的交叉个体。
具体步骤如下:
(1)先对群体随机配对。
(2)再随机设定交叉点的位置。
(3)再互换配对染色体间的部分基因。
5)变异运算。该步骤是产生新的个体的另一种操作。一般先随机产生变异点,再根据变异概率阈值(pm,一般是0.0001到0.1)将变异点的原有基因取反。
6)终止判断。如果满足条件(迭代次数,一般是200~500)则终止算法,否则返回step2。
我们首先从函数出发,既然是寻找全局最优解,我们可以想象一个多元函数的图像。遗传算法中每一条染色体,对应着遗传算法的一个解决方案,一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射。可以把遗传算法的过程看作是一个在多元函数里面求最优解的过程。可以这样想象,这个多维曲面里面有数不清的“山峰”,而这些山峰所对应的就是局部最优解。而其中也会有一个“山峰”的海拔最高的,那么这个就是全局最优解。而遗传算法的任务就是尽量爬到最高峰,而不是陷落在一些小山峰。(另外,值得注意的是遗传算法不一定要找“最高的山峰”,如果问题的适应度评价越小越好的话,那么全局最优解就是函数的最小值,对应的,遗传算法所要找的就是“最深的谷底”)
我们从一元函数出发,已知这样一个函数:
在matlab下绘制该函数图像 我们可以发现
x=-1:0.01:2; %从-1到2 每隔0.01取一个点绘制图像 y = x.*sin(10*pi*x) + 2; plot(x,y)
我们可以发现
我们尝试寻找这个函数在定义域内的最高点和最低点,可以尝试下列几种方法:
既然我们把函数曲线理解成一个一个山峰和山谷组成的山脉。那么我们可以设想所得到的每一个解就是一只袋鼠,我们希望它们不断的向着更高处跳去,直到跳到最高的山峰。所以求最大值的过程就转化成一个“袋鼠跳”的过程。
下面介绍介绍“袋鼠跳”的几种方式。
-
爬山算法:一只袋鼠朝着比现在高的地方跳去。它找到了不远处的最高的山峰。但是这座山不一定是最高峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。
-
模拟退火:袋鼠喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高峰跳去。这就是模拟退火算法。
-
遗传算法:有很多袋鼠,它们降落到喜玛拉雅山脉的任意地方。这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰。但每过几年,就在一些海拔高度较低的地方射杀一些袋鼠。于是,不断有袋鼠死于海拔较低的地方,而越是在海拔高的袋鼠越是能活得更久,也越有机会生儿育女。就这样经过许多年,这些袋鼠们竟然都不自觉地聚拢到了一个个的山峰上,可是在所有的袋鼠中,只有聚拢到珠穆朗玛峰的袋鼠被带回了美丽的澳洲。
而这里我们使用的就是遗传算法来解决这个问题,首先我们使用matlab中的ga()函数来直接寻找到答案。
关于ga函数就是将上面的算法思想进行封装成的一个函数
首先创建一个函数 一个脚本
在函数中我们定义目标函数
function y = simple_fitness(x) y = x*sin(10*pi*x)+2 end
在函数中我们使用ga算法求解
ObjectiveFunction = @simple_fitness; nvars = 1;%变量个数 LB = [-1]%定义域下限 UB = [2]%定义域上限 [x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB)%调用ga函数
这里要注意ga算法默认的全局最优解是全局的最小值 我们这里先求出最小值
本次遗传算法得出在1.9505有最小值0.0497
但是这个只是预测值 与真实值不同 每次遗传迭代的结果也是不同的 下次迭代结果有可能不是这个数值
Matlab工具箱函数 ga 是求最小值,所有优化工具箱函数都是求最小值,你如果要求最大值,把目标函数取负,然后求得最小值实际上就是原始目标函数的最大值了。这也是为什么matlab里所有优化工具箱函数都是求最小值了
修改目标函数为
function y = simple_fitness(x) y = -x*sin(10*pi*x)-2 end
得到最大值是在1.6506处取得的3.6503
-
-
基于matlab遗传算法工具箱及应用论文-MATLAB and GA.rar
2019-08-13 02:32:11基于matlab遗传算法工具箱及应用论文-MATLAB and GA.rar 我搜集的17篇论文,都是遗传算法工具箱的,大家平时搜集很麻烦,现在上传给大家分享 所含文件: Figure8.jpg -
可以运行的GA 算法 ,matlab 编写
2018-03-31 11:09:04可以运行的GA 算法 ,matlab 编写 ,资源优化,可以运行的GA 算法 ,matlab 编写 ,资源优化, -
matlab 遗传算法 ga函数实现并行
2021-01-20 12:09:08遗传算法并行 % ga函数 options = gaoptimset('Generations', 200,... %设置迭代次数 'PopulationSize', 50,... % 设置种群大小 'UseParallel', true,... % 是否并行 'Vectorized', 'on'); % 指定函数是否向量化 ... -
matlab 遗传算法GA,粒子群算法PSO,蚁群算法AS
2009-11-12 15:33:04matlab 遗传算法GA,粒子群算法PSO,蚁群算法AS 前段时间上智能计算方法实验课上,自己做的程序。帖到这里,希望有人能改进它们,交流经验这样更有价值。 遗传算法解决最小生成树问题,PURFER编码。 粒子群算法做无... -
202103遗传算法GA求解车间调度问题Matlab优化算法视频配套资料.pdf
2021-04-15 09:39:25202103遗传算法GA求解车间调度问题Matlab优化算法视频配套资料.pdf -
有关matlab遗传算法的ppt-有关matlab遗传算法的ppt.rar
2019-08-13 11:31:03有关matlab遗传算法的ppt-有关matlab遗传算法的ppt.rar 这是有关matlab遗传算法的ppt,是一个朋友给我的,希望对大家有所帮助。共同进步哦": GA1.jpg GA2.jpg -
遗传算法及其MATLAB实现 含源程序 GA算法及其MATLAB实现 含源程序
2009-12-17 19:14:51遗传算法及其MATLAB实现 含源程序 GA算法及其MATLAB实现 含源程序 -
matlab遗传算法优化神经网络
2018-06-03 11:04:56matlab GA优化BP 遗传算法优化神经网络 matlab GA优化BP 遗传算法优化神经网络 matlab GA优化BP 遗传算法优化神经网络 matlab GA优化BP 遗传算法优化神经网络 matlab GA优化BP 遗传算法优化神经网络 matlab GA优化BP... -
Matlab遗传算法优化BP网络-GAbp.zip
2019-08-13 19:55:15Matlab遗传算法优化BP网络-GAbp.zip 新人发帖,请多支持:handshake 所含文件: Figure39.jpg bppfault.m运行结果: Figure40.jpg -
自己编的matlab遗传算法小程序-GA.rar
2019-08-13 10:47:20自己编的matlab遗传算法小程序-GA.rar 适用于初学者练手,肯定让高手见笑了!! -
【GA算法】遗传算法原理及其Matlab代码
2017-11-02 17:02:23翻阅几篇遗传算法的文章,这篇通俗易懂,且逻辑清楚,最适合入门,不用担心遗漏关键点。 遗传算法,先选择,交叉和变异顺序可更换。 轮盘赌部分,参考了另外一篇文章的解释。 此外,还有一些有价值的文献: 选择...翻阅几篇遗传算法的文章,这篇通俗易懂,且逻辑清楚,最适合入门,不用担心遗漏关键点。
遗传算法,先选择,交叉和变异顺序可更换。
轮盘赌部分,参考了另外一篇文章的解释。
此外,还有一些有价值的文献:
选择算子的讨论:http://www.doc88.com/p-7834231663548.html
变异和交叉算子的讨论:http://blog.sina.com.cn/s/blog_5698433c0102v0d9.html
轮盘赌算法的三种python实现代码:https://github.com/mangwang/PythonForFun/blob/master/rouletteWheelSelection.py
处理遗传算法的约束问题:
1.把带约束的变成自由的:当约束是等式时,利用代换;约束是不等式,利用三角、指数函数化作等式;
2.遗传出子代时,利用约束条件进行先天淘汰
第一个方法把运算量放在子代产生之前,第二个方法把运算量放在产生子代后。
(2) 隐性约束的处理方法:
选择符合条件的染色体进行交叉;
淘汰不符合条件的变异子代;
代码下载地址在结尾。
================================================
《通俗解释遗传算法及其Matlab实现》
(1)初识遗传算法
遗传算法,模拟达尔文进化论的自然选择和遗传学机理的生物进化过程的计算模型,一种选择不断选择优良个体的算法。谈到遗传,想想自然界动物遗传是怎么来的,自然主要过程包括染色体的选择,交叉,变异(不明白这个的可以去看看生物学),这些操作后,保证了以后的个体基本上是最优的,那么以后再继续这样下去就可以一直最优了。
(2)解决的问题
先说说自己要解决的问题吧。遗传算法很有名,自然能解决的问题很多了,在原理上不变的情况下,只要改变模型的应用环境和形式,基本上都可以。但是遗传算法主要还是解决优化类问题,尤其是那种不能直接解出来的很复杂的问题,而实际情况通常也是这样的。
本部分主要为了了解遗传算法的应用,选择一个复杂的二维函数来进行遗传算法优化。函数显示为y=10*sin(5*x)+7*abs(x-5)+10,这个函数图像为:
怎么样,还是有点复杂的吧,当然你还可以任意假设和编写,只要符合就可以。那么现在问你要你一下求出最大值你能求出来吗?(这个貌似可以,很容易看出来---如何再复杂一点估计就不行了)这类问题如果用遗传算法或者其他优化方法就很简单了,为什么了,说白了,其实就是计算机太笨,同时计算速度又超快,举个例子吧,我把x等分为100万份,再一下子都带值进去算,求出对应的100万个y的值,再比较他们的大小找到最大值不久可以了么,很笨吧,人算是不可能的,但是计算机可以。而遗传算法也是很笨的一个个搜索,只不过加了一点什么了,就是人为的给它算的方向与策略,让它有目的的算,这也就是算法了。扯多了,正题吧。。。
(3)如何开始
不明白的遗传算法的会问怎么开始呢?恩,其实每个算法都有自己开始的方式,遗传算法也是。首先是选择个体了。我们知道一个种群中可能只有一个人吗?不可能吧,肯定很多人才对,这样相互结合的机会才多,产生的后代才会多种多样,才会有更好的优良基因,有利于种群的发展。那么算法也是如此,当然个体多少是个问题,一般来说20-100之间我感觉差不多了。那么个体究竟是什么了?在我们这个问题中,自然就是x值了,其他情况下,个体就是所求问题的变量,这里我们假设个体数选100个,也就是开始选了100个不同的x值,不明白的话就假设是100个猴子吧。好了现在有了100个猴子组成的一个种群,那么这个种群该怎么发展才能越来越好了?说到这,我们想想,如何去定义这个越来越好呢?这该有个评价指标吧,在我们这个题中,好像是对于的y值越大越好是吧,也就是说哪些x对应的y值越大,我们就认为这个x越好,对于不同的x值,在把他们的y值确定后,我们甚至可以给他们排个名来决定哪些好些。我们把这个叫做对于个体的适应度,这应该算是算法的后半部分才对。
(4)编码
首先明白什么是编码?为什么要编码?如何编码?
好,什么是编码?其实编码就是把自变量(x)换一个形式而已,在这个形式下,更容易操作其他过程(比如交叉、变异什么的)而已。举个例子吧,假如我们取x=1,2,3,我可以把x编码成x=a,b,c,我就说123对应的就是abc,为什么要这样做呢,比如问题里面你能够获取的都是abc组合之类的,那么这样编码以后,你就可以再返回去成123来操作了。一般的编码都有些什么了?二进制编码,自然数编码,矩阵编码。。很多,不详写了。而用的最多的可以说是二进制编码吧,感觉这和人体DNA、基因的排列很相似,想想DNA怎么排的?不就是在两条长链上一对一排的吗?那么什么是二进制编码?很简单,就是1、0、1、0对应的来回组合排列而已。比如:1100100010, 0011001001 等等,这些都是位数长度为10的二进制编码。再想想1在计算机的二进制形式是多少?如果以八位来表示的话,是不是就是:0000 0001 ;8是不是就是0000 1000;以此类推,那么我们这里也是这样,把对应的x值换算成这种编码形式,我们这里可以看到x的范围是0~5吧,如何照计算机这样的方式,是不是到0000 0101 这里就完事了?想想这样多短,前面五位都没有用上多浪费呀,那么要想都用上怎么办了?也很简单,我们把0000 0001 不认为是1不就可以了吗?因为1111 1111 为255,那么如果说每一份为1/255的话,那么0000 0001不就是1/255(不是1了,比1小很多了),这个时候1怎样表示了?不就是:1111 1111了。好了我们把范围扩大一些吧,每一份不是1/255, 而是1/255*5,那么这个时候最大值是多少?是不是5,恩,这样x编码的范围不就在0~5之间了吗。这里就又有问题了,想想这样的话x最小精度为多少?就是1/255*5,虽然很小,但是在0~1/255*5之间的x你能不能取到?无论如何都不能吧,那么就又来了一个问题,怎样去增大这个精度呢?如果要保持0~5不变的话,只能增加位数了,把8位编码变成10位,20位,100位,哇,够大了吧,变成了100个0、1组合,很恐怖吧,事实上究竟是多少要视情况来定,一般20左右感觉就可以了,虽然说越大越好,但是太大了耗内存呀,速度慢了,不值。本题中,我们设置它为一个变量,先暂时取为10来实验。好了,如果还不明白为什么要编码看下面的吧,知道了交叉与变异,你就知道了。
(5)关于交叉与变异
先说变异吧,什么是变异?简单,基因发生了突变就叫变异。有了编码的概念,那就在编码的基础上来说变异了。首先就讲最简单的变异,单个点的变异。现在以10位长度的编码来说,比如把x=3编码一下,随便假设为11000 10010吧,好了在变异操作时,假设第5位变异了(说一下变异就是对应一位或者多位0或1变成1或0,也只能在0,1之间变,没办法呀),那么这个时候变成什么了?是不是为11001 10010(把前面的认为低位,和计算机里面的不一样了,自己定义而已吧),好了现在看看现在11001 10010 再反编码回去成x是多少呢?那肯定不是3了,变了呀,是多少肯定可以反算回去了,这里懒得算了,就假设为3.213吧,发没发现,这样一来,x是不是变了?既然变了就好呀,带到原函数(适应度函数)里面去比较这两个x值对应的那个y值大一些,如何后面变异后的大些是不是就是说产生了好的变异呀,就可以在下一次个体选择的时候选择它了。那么想想很多x来一起变异会怎么样了?肯定会生成很多好的解吧,反复这样做又会怎么样了?只要每次都保留最优解的话,我来循环个100万次,也总能找到最优解吧,当然这么多次得花多久,也不合适。这还只是一个点位在进行变异,如果每次我让多个点位变异呢?哇,又不可思议了,变化更大了吧。当然,变异不止如此,更多的去看专业论文吧,知道了变异是干什么的,剩下的都好说了吧。好了,这还只是变异,想想自然界遗传中除了变异还有什么,交叉吧,那么交叉又是什么了?
学过生物的都知道,动物交配时,部分染色体干什么了,是不是交叉了?就是把相应部分的基因交换了,你的给了我,我的给了你,很有爱吧。再以编码为例吧,比如现在随便从100个x值中选取两个吧,假设正好选中了x=3和4,对应的编码假设是:11001 10101和00101 01011,那么怎么交叉呢?我们知道每次交叉的染色体通常是不是一块一块的?恩,这里在算法设计上也来一块一块的吧,比如说就把位置在2,3,4号的编码给整体交叉了吧,那么x=3对应位置是100吧,x=4对应位置是010吧,好,交换以后x=3对应位置就变成了010,而x=4就变成了100,加回去就变成了什么了?X=3是不是就为10101 10101,x=4是不是就为01001 01011了。而现在,把他们再反编码回去还是x=3,4吗?显然又不是了吧(当然也有概率是一样的吧,很小)。那是什么了?不想算,还是假设吧,假设为3.234,和4.358把,好了新的个体是不是又来了?恩,同理,带到适应度函数里面去吧,在取优秀个体,完事。同样,有些专门研究这种算法的开发出来各种各样的交叉方式,什么一个个体的前3个与后一个个体的后3个交叉,中间几位来交叉等等,总之就是生产新个体,而这样做的目的在哪了?无非是三个字,随机性,充分保证生产新个体具有随机性,你说你的x=3变异后为3.2,3.1什么的距离3那么近,在一些存在局部最优解问题上就永远跳不出局部最优解,相反,你的x=1一下子变异成了x=5,哇,好大的变化呀,一下从这头到了那头,这对于算法的广阔搜索能力来说是非常好的。
讲完了这部分,现在知道了为什么要编码了吧?如果你不编码,你说你想要你的x=3怎么去变异,怎么去交叉?当然也不是没有方法,比如你生成一个小的随机数加到x=3上,但是你想想这两种方法哪一个更具有随机性、普遍性?显然的。而更多的时候交叉与变异是在一起操作的,先交叉,再变异(或者反过来)是普遍遗传算法的操作步骤。
(6)关于选择的问题
说完了上面的部分,在说说选择吧,选择是什么?就是优胜劣汰。好的留下来,差的走人,在自然界中直接gg了是吧。所以才有了人类这种高级动物。不停的选择使得种群一直朝着较好的方向行走。
对应到本问题来说,遗传算法的选择是什么样子的呢?在前面说到,每次交叉或者变异是不是产生了新的个体?如果这些个体都保留下来的话,种群是要爆炸的,第一次循环可能有100个x,第二次就200个,再来那么10万次循环,哇哦,多少了,好多。显然不可能吧,而且在算法里面,我们还规定的是每次循环都必须保证都是100个个体,那么必须在200个个体中剔除100个吧,好了,问题来了,如何剔除呢?有人说很简单,排名吧,取前100号x不久可以了吗?排名这个东西真的准吗?我就不信,凭什么差一点的不能选上,搞不好在下一次变异中一下子冲到了第一呢?这个问题在选择上也有一些对应的规则,最通用的就是轮盘赌法,简单来说就是一种概率选择法(当然还有许多其他的方法,感兴趣自己搜相关的文献吧,我也没用过)。什么是轮盘赌法呢?就是把对应所有y值(适应度函数值)加起来,再用各自的y值去除以这个sum值,这样是不是谁的概率大谁的概率小就很清楚了?然后再随机生成一个0~1的概率值p,谁在p的范围里面是不是就选择谁,比如说x=3时在100个x中y的值最大,那么选择它的概率是不是就最大,比如说是0.1(0.1小吗?不小了好吧,想想其他的会是什么,都比0.1小,那么从概率上讲,选100次的话,是不是就有10次选到了x=3,其他的都不足10次是吧,那么在下一次100个种群个体中就有10个x=3了,再来一回可能就有20个x=3了,再就是30个,最最后就只剩下100个x=3,它自己在那里交叉变异是不是已经没什么意义了,如果到了这个时候就意味着这个算法可以结束了)。再详细点,如下图所示吧:现在要在下面三个大类中先去100个x个体,轮盘赌转100次以后,是不是个体数落在s3中的个体多一些,选择的原理就是这样,再不明白直接后面的程序吧,我曾经也研究了好久。。。
(7)还差点什么呢
至此,感觉也差不多了吧,选择完后再重复上述步骤交叉、变异等等。那么什么时候是个头了?很简单办法就是迭代次数,迭代10次看一下结果,20次,30次,100次,当次数达到一定程度以后,优秀的个体越来越多,大都集中在最优解附近,即使变异或者交叉了也是在这个最优解附近,没有影响的,在下一次选择后就有变回来了。那么至此就真的结束了。比如说先来结果吧,该问题按我这个思路做完后,迭代100次变成什么样子了?上图如下:
看看,所有的解(100个)都集中在了x=0.286附近是吧,也就是基本上达到最优解了。
转载自:http://www.cnblogs.com/hxsyl/p/5240905.html
轮盘赌选择
又称比例选择方法.其基本思想是:各个个体被选中的概率与其适应度大小成正比.
具体操作如下:
(1)计算出群体中每个个体的适应度f(i=1,2,…,M),M为群体大小;
(2)计算出每个个体被遗传到下一代群体中的概率;
(3)计算出每个个体的累积概率;
(q[i]称为染色体x[i] (i=1, 2, …, n)的积累概率)
(4)在[0,1]区间内产生一个均匀分布的伪随机数r;
(5)若r<q[1],则选择个体1,否则,选择个体k,使得:q[k-1]<r≤q[k] 成立;
(6)重复(4)、(5)共M次
转载自:http://my.oschina.net/u/1412321/blog/192454
Matlab代码下载地址1:https://github.com/franciscoserdio/Genetic-Algorithms-Toolbox
Matlab代码下载地址2:https://github.com/Shuai-Xie/genetic-algorithm
Matlab代码下载地址3:http://www.aichengxu.com/suanfa/1836211.htm
-
GA算法实现(matlab)
2019-06-19 15:49:07python代码随处可见,利用python进行相关的操作和实现时每一个python入门者必不可少的内容,这里利用python 的相关知识,简单的进行了实验,希望对大家有所帮助 -
GA遗传算法matlab程序
2018-12-11 14:03:13基于ATO的列车速度曲线优化,用matlab遗传算法实现。适合初学者。 -
遗传算法(四)MATLAB GA工具箱使用 附解TSP问题
2017-09-08 19:36:00MATLAB遗传算法工具箱- 笔记(一) 基本遗传算法
- 笔记(二) 遗传算法的优化改进
- 笔记(三) 遗传算法解组合优化
- 笔记(四) MATLAB遗传算法工具箱使用
基本使用
1. 直接参见函数
ga
函数原型:
[x fval] = ga(@fitnessfun, nvars, options)
x是使fitnessfun函数取最小值使的自变量值。nvars为自变量的数目即x向量中包含的元素个数,option可暂时不填。
[x, f] = ga(@cos, 1);
即得到一段简单的遗传算法代码,其作用为求解某函数的最小值。
如何调参:
x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,IntCon,options)
- A, b,Aep, beq, LB, UB为线性约束项,即满足如下约束:
Ax≤bAeq≤x≤beqLB≤x≤UB- nonlcon为非线性约束nonlenear constraints。其中运用了矢量化约束(Vectorized Constraints)的方法。nonlcon是一个返回两个参数的函数句柄,可以是当前路径下的一个函数文件@functionfile。其具有如下原型:
[c ceq] = nonlcon(x)
其约束为c≤0, ceq=0。举个例子(来自MATLAB help,直接截图):
具有三个变量的规划中,有非线性约束:则其向量化约束函数nonlcon可以写为:
IntCon:自变量向量正整数的下标,从1到nvars.
options: 比较复杂,感兴趣的读者可以去查一下帮助文档。在这里举例用几个比较常用的option:
选项 功能 值 CrossoverFraction 交叉的概率 0-1的小数 EliteCount 用于精英原则,
每次遗传中一定会活下来的个体的个数正整数 FitnessLimit 适应度的范围 标量/ {-Inf} Generations 迭代遗传的次数 正整数 InitialPopulation 初始种群 可以用上一次遗传生成的种群
作为下一次GA的初始种群option中的功能要通过
gaoptimset('param1',value1,'param2',value2,...)
的形式调用。再调用一个简单的GA代码作结:
[x, f] = ga(@cos, 1, [], [], [], [], 0, 2 * pi, [], gaoptimset('CrossoverFraction', 0.3))
示例,解组合优化
1. 解TSP
由于MATLAB提供了很好的遗传算法接口,故对于用户来说只需要将问题抽象化,再进行编码、解码、计算适应度即可。
问题例子可以参考上一篇文章: 遗传算法(三)解TSP问题
这里直接给出适应度计算函数,包含编码和解码:
function Fitness = GA_TSPfun(chrom) %% Create City NumCity = 9; Fitness = 0; Dist =[0 2.8946 6.5107 5.5845 5.2429 5.8733 4.4377 2.7627 6.5644; 2.8946 0 4.3313 5.1381 5.7211 3.1830 2.3729 5.2763 5.0574; 6.5107 4.3313 0 3.6548 5.2943 1.8590 2.0889 9.2412 8.3103; 5.5845 5.1381 3.6548 0 1.7362 4.8792 3.3486 8.190210.1465; 5.2429 5.7211 5.2943 1.7362 0 6.2723 4.5224 7.531710.7633; 5.8733 3.1830 1.8590 4.8792 6.2723 0 1.8705 8.4338 6.4969; 4.4377 2.3729 2.0889 3.3486 4.5224 1.8705 0 7.1555 6.9906; 2.7627 5.2763 9.2412 8.1902 7.5317 8.4338 7.1555 0 7.1508; 6.5644 5.0574 8.310310.146510.7633 6.4969 6.9906 7.15080]; %% Decode: order = []; city = 1 : NumCity; for j = 1 : NumCity order = [order, city(1+rem( chrom(j)-1, length(city)))]; city(1 + rem(chrom(j)-1, length(city))) = []; end for i = 1 : NumCity city1 = order(i); city2 = order(1 + rem(i, NumCity)); Fitness = Fitness + Dist((city1-1)*NumCity + city2); end end
经验证发现,同样的TSP问题,MATLAB的GAtools得出的解大多为31.7, 33左右,逼近最优解。但是前一篇中作者自己编写的遗传算法程序,得出的平均结果为40左右。可见自己写的代码爬山能力还不够强,挖个坑,以后再研究一下。
-
初识遗传算法之MatlabGA工具箱
2017-08-05 22:48:56Matlab有GA优化工具箱。例1在这里,就用2017年重庆高考数学最后一道题来开刀了。当然,只是算一个大概,大概……理论证明嘛,无非就是各种不等式去试……1. 默认求 min f(x,y)。2. 非线性约束条件按规范写。不等式 g...Matlab有GA优化工具箱。
例1
在这里,就用2017年重庆高考数学最后一道题来开刀了。
当然,只是算一个大概,大概……
理论证明嘛,无非就是各种不等式去试……
1. 默认求 min f(x,y)。
2. 非线性约束条件按规范写。
不等式 g(x,y) >= 0;
等式 h(x,y) = 0;
e.g. x^2 + y^2 = 2 要写为 x^2 + y^2 - 2
2元数量值函数。
NonCon
function [c, ceq] = NonCon( x ) c = []; % 非线性不等式约束条件为空 ceq = x(1)^3 + x(2)^3 - 2; % 非线性等式约束条件 end
FitFun1function y = FitFun1(x) % x可以是一个向量,FitFun()是一个一(多)元数量值函数 y = (x(1)+x(2))*(x(1)^5+x(2)^5); % 第1问 % y = -(x(1)+x(2)); % 第2问 end
结果如下----------------------------
Optimization running.
Objective function value: 4.018996707929087
Optimization terminated: average change in the fitness value less than options.FunctionTolerance and constraint violation is less than options.ConstraintTolerance.不过我在想,有的时候就算是算出来一个结果,比如pi, exp, 又怎样,难道造飞机、大炮的时候,这个数值我写个pi?还不是近似…只是说,这种存在性证明,收敛性证明为数值计算提供了基础,弄个“数”出来,将就用吧。
在找到理论方法前,难道就不造飞机、大炮了吗?有总比没有强吧,有什么问题再说。不要被现有的工具和固定的模式束缚了。牛顿那个时候还没有微积分呢,还不是自己造的。欧洲的理论创新很强,美国是实践创新很厉害。中国呢?美团、滴滴、共享单车,烧钱倒是很厉害。
-
nlm算法matlab代码_遗传算法GA的MATLAB代码
2020-12-18 23:02:34MATLAB实现算法代码:GA(遗传算法)——整数编码function[BestGene,aa]=GA(MaxGeneration,GeneSize,GeneNum,pcross,pmute,minGene,maxGene)Parent=Init(GeneSize,GeneNum,minGene,maxGene);[BestGene,Parent]=... -
Matlab十大算法
2018-09-03 20:54:50十大算法\模拟退火,禁忌搜索,遗传算法,神经网络-MATLAB程序合集\简单函数优化的遗传算法程序\ga.m 十大算法\模拟退火,禁忌搜索,遗传算法,神经网络-MATLAB程序合集\简单函数优化的遗传算法程序\init.mat 十大... -
初识Matlab遗传算法工具箱 ga
2016-11-25 11:33:27顺便安利一个算法实现的代码: https://github.com/yanshengjia/artificial-intelligence/tree/master/genetic-algorithm-for-functional-maximum-problem 作者原著: ... -
matlab优化算法PPT
2015-03-08 17:43:09介绍matlab优化算法,包括GA遗传算法,神经网络算法,可以作为学习智能优化算法的参考资料。 -
MATLAB GA工具箱
2016-05-11 15:48:41MATLAB遗传算法工具 -
matlab_advanced_GA:教学课程Matlab算法Genetika [Kelas Terbuka]-源码
2021-02-04 00:07:17matlab_advanced_GA:教学课程Matlab算法Genetika [Kelas Terbuka] -
matlab 遗传算法工具箱_Matlab遗传算法工具箱使用简介
2021-01-13 01:01:311.简介遗传算法是现代优化算法之一,为方便使用Matlab提供了遗传算法工具箱,可以方便我们解决一般的优化问题。遗传算法工具箱的打开途径为:首先在App中找到Optimization工具箱然后在Solver中找到ga打开就行了,... -
算法 matlab_MATLAB遗传算法及其实现
2021-01-02 21:23:38点击上方蓝字关注“公众号”MATLAB遗传算法及其实现遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、... -
GA算法的Matlab编程
2012-07-25 14:08:40本人想用Matlab编程,实现用GA算法求解有向图的最短路径问题,并且在生成初始种群时能够生成具有实际路径的染色体,请大家帮帮忙吧,很急!! -
matlab遗传算法求解VRP问题
2018-05-07 21:49:08matlab vrp ga 遗传算法