遗传算法学习总结
来源:互联网 发布:单片机输出0 10v电路 编辑:程序博客网 时间:2024/06/10 22:20
遗传算法是一种优化算法,实质是通过群体搜索,根据适者生存的原则进行逐代进化,最终得到最优解。
实现方法:
1.根据具体问题找到可行解的取值范围,类似于x∈(a,b),确定一种编码方式,通过数值串或字符串的方式表示每个可行解
2.确定适应度函数fitness(非负函数),用于判断每个解的好坏
3.确定进化的相关参数,种群规模、交叉概率、变异概率、进化终止条件(最大代数等)。
模型求解及算法
step1.设定参数:
种群大小:M=50
最大代数:G=1000
交叉率:Pc=1(交叉概率为1,保证种群充分进化)
变异率:Pm=0.1(变异发生可能性尽可能小)
step2.确定可行解的编码方式
step3.确定初始种群(可采用改良圈法求得一个较好的初始种群)
step4.确定目标函数(适应度函数)
step5.交叉操作
step6.变异操作
step7.选择(选择目标函数值最小的M个个体进化到下一代,保证父代的优良特性被遗传下来)
遗传算法求解一维无约束优化问题
matlab程序(网上找的,感觉很好用)
function [xv,fv] = myGA(fitness, a, b, M, G, Pc, Pm, eps) % 用遗传算法求解一维无约束优化问题 % 待优化的目标函数 fitness % 自变量下界 a % 自变量上界 b % 种群个体数 M % 最大进化代数 G % 杂交概率 Pc % 变异概率 Pm % 自变量离散精度 eps % 目标变量取最大值时自变量的值: xm % 目标函数的最大值 fv % % Example: % function F = fitness(x) % F = x^3-60*x^2+900*x+100; % ------------------------------- % [xv,fv] = myGA(@fitness,0, 30, 50, 100, 0.9, 0.04, 0.01); % -------------------------------------------------- % xv = 10 % fv = 4100 % % 本程序在《精通MATLAB最优化计算》页315程序的基础上修改 L = ceil(log2((b-a) / eps + 1)); %编码长度 x = zeros(M, L); %种群 nx = zeros(size(x)); %滚动数组 fx = zeros(M, 1); %适应度 for i = 1:M x(i,:) = Initial(L); end fv = -inf; for k = 1 : G for i = 1 : M fx(i) = fitness(Dec(a, b, x(i, :), L)); if (fx(i) > fv) xv = Dec(a, b, x(i, :), L); fv = fx(i); end end sumfx = sum(fx); Px = fx / sumfx; PPx = zeros(M, 1); PPx(1) = Px(1); %概率叠加 for i = 2 : M PPx(i) = PPx(i - 1) + Px(i); end selFather = 0; for i = 1 : M sita = rand(); for j = 1 : M if (sita <= PPx(j)) selFather = j; %使用轮盘赌法进行选择父亲 break; end end selMother = floor(rand() * M) + 1; %母亲随机选择 posCut = floor(rand() * (L - 1)) + 1; %交叉点 r1 = rand(); if (r1 <= Pc) nx(i, 1 : posCut) = x(selFather, 1:posCut); nx(i, (posCut + 1) : L) = x(selMother, (posCut + 1) : L); r2 = rand(); if (r2 <= Pm) posMut = floor(rand() * L) + 1; nx(i, posMut) = ~nx(i, posMut); end else nx(i, :) = x(selFather, :); end end x = nx; end %-------------------------------------------------------- % 初始化种群 function result = Initial(length) result = zeros(size(length())); for i = 1 : length r = rand(); result(i) = round(r); end %---------------------------------------------------------- % 编码转换 function y = Dec(a, b, x, L) base = 2 .^ ((L - 1) : -1: 0); y = dot(base, x); y = a + y * (b - a) / (2 ^ L - 1);
当然如果matlab里有遗传工具箱gatool可以交互式操作就更方便些
0 0
- 遗传算法学习总结
- 遗传算法总结
- 遗传算法学习笔记
- 遗传算法学习
- 遗传算法学习材料
- MATLAB遗传算法函数总结
- Mitchell机器学习-遗传算法
- Genetic Algorithm遗传算法学习
- Genetic Algorithm遗传算法学习
- Matlab遗传算法学习-reclin
- 遗传算法深入学习上
- 遗传算法深入学习中
- 遗传算法深入学习下
- 机器学习_遗传算法
- 算法学习:遗传算法初体验
- 遗传算法入门例子和总结
- 遗传算法入门例子和总结
- 遗传算法入门例子和总结
- 后缀数组模板(详细理解)
- 并查集应用:入门级
- Shader结构学习手记
- AMQP协议介绍
- Leetcode 18 4Sum
- 遗传算法学习总结
- WPF架构特点
- java多线程总结
- 20160829想法
- 26. Remove Duplicates from Sorted Array
- NYOJ587blockhouses
- java基础
- UIPageControl的使用
- iOS开发集成第三方微信支付和分享问题