最近接触到了遗传算法以及利用遗传算法求最优解,所以就把这些相关的内容整理记录一下。

一、遗传算法简介(摘自维基百科)

遗传算法(英语:genetic algorithm (GA))是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。

算法

  • 选择初始生命种群
  • 循环
    • 评价种群中的个体适应度
    • 以比例原则(分数高的挑中概率也较高)选择产生下一个种群。
    • 改变该种群(交叉和变异)
  • 直到停止循环的条件满足

适用问题

遗传算法擅长解决的问题是全局最优化问题。
跟传统的爬山算法相比,遗传算法能够跳出局部最优而找到全局最优点。而且遗传算法允许使用非常复杂的适应度函数(或者叫做目标函数),并对变量的变化范围可以加以限制。

二、MATLAB中的GA函数

  1. X = ga(FITNESSFCN, NVARS)
    这是GA函数最简单的调用方法,其中FITNESSFCN是目标函数,其参数应为一向量,NVARS则是参数向量的维度。
    X是目标函数值为最小时的参数向量。
  2. X = ga(FITNESSFCN, NVARS, A, b, Aeq, beq, lb, ub, NONLCON, options)
    这些参数用于约束X:
    • AX <= B, AeqX = Beq (线性约束)
    • LB <= X <= UB
    • NONLCON:定义C(X) <= 0, Ceq(X) = 0(非线性约束)
    • options:设置GA的相关参数
  3. [X,FVAL,EXITFLAG,OUTPUT] = ga(FITNESSFCN, ...)
    • FVAL是在目标函数的参数为X时的值
    • EXITFLAG是结束遗传算法计算的标志
      -0 Maximum number of generations exceeded.
      -1 Optimization terminated by the output or plot function.
      -2 No feasible point found.
      -4 Stall time limit exceeded.
      -5 Time limit exceeded.
    • OUTPUT结构体包含了遗传代数、输出种群等信息
  4. options
    options = gaoptimset();
    options.Generations=5000; %迭代次数
    options.PopulationSize=30; %种群数目

    还又其他很多选项可以设置。

三、一个实例

假设要求目标函数
f = (339-0.01*x1-0.003*x2)*x1 + (399-0.004*x1-0.01*x2)*x2 - (400000+195*x1+225*x2);
的最大值。

首先编写目标函数myfit.m

function f = myfit( x )
f = (339-0.01*x(1)-0.003*x(2))*x(1)...
+ (399-0.004*x(1)-0.01*x(2))*x(2)...
- (400000+195*x(1)+225*x(2));
f = -f; %因为GA是寻找最小值,所以为了求这个函数的最大值,取f的相反数
end 

调用GA函数:

X =ga(@myfit, 2)

结果显示: Optimization terminated: maximum number of generations exceeded.
说明迭代达到最大次数仍未求得最优解。因此下面通过options增大迭代次数:

 
options = gaoptimset();
options.Generations = 2000; %最大迭代数设为2000 %再次调用GA函数
[X,FVAL,EXITFLAG,OUTPUT] =ga(@myfit, 2 ,[], [],[],[],[],[],[],options);

结果显示: Optimization terminated: average change in the fitness value less than options.TolFun.

此时

X =
  1.0e+03 *
  4.7350 7.0429
 
FVAL = -5.5364e+05
 

这个结果与对目标函数 x1、x2 分别求偏导得到的结果(x1=4735, x2=7043, y=553641)是一致的,表明结果正确。

四、其他求最优解的方法

MATLAB还有许多其他求最优解的常用函数,如 fmincon()、fminsearch()、fminimax()等。

[MATLAB] 利用遗传算法函数求目标函数的最优解的更多相关文章

  1. Python之利用reduce函数求序列的最值及排序

    在一般将Python的reduce函数的例子中,通常都是拿列表求和来作为例子.那么,是否还有其他例子呢?   本次分享将讲述如何利用Python中的reduce函数对序列求最值以及排序.   我们用r ...

  2. matlab中fminbnd函数求最小或者组大值

    clc; clear all; close all; fx = @(x) -(0.4./sqrt(1 + x.^2) - sqrt(1+x.^2) .* (1- 0.4./(1 + x.^2))+x) ...

  3. MATLAB利用solve函数解多元一次方程组

    matlab求解多元方程组示例: syms k1 k2 k3; [k1 k2 k3] = solve(-3-k3==6, 2-k1-k2+2*k3==11, 2*k1+k2-k3+1==6)或者用[k ...

  4. MATLAB 利用filter函数实现滑动平均滤波

      function [ y ] = moving_average( x, win_size ) y1=filter(ones(1,win_size/2+1)/win_size,1,x); y2=fi ...

  5. Matlab用mpeaks函数求峰值点坐标

    clear;clc;close all % 初始化 m = [-6,-2,0,2,4,6]; sigma = [1,1,0.5,0.25,0.6,2]; h = [1,2,3,2,2.13,3.14] ...

  6. MATLAB 的unique函数——数组矩阵的唯一值

    MATLAB 的unique函数——求数组矩阵的唯一值 相关MathWork文档见此:unique数组中的唯一值 1.C = unique(A) 返回与 A 中相同的数据,但是不包含重复项.C 已按照 ...

  7. 【转】利用matlab生成随机数函数

    原文地址:利用matlab生成随机数函数 rand(n):生成0到1之间的n阶随机数方阵  rand(m,n):生成0到1之间的m×n的随机数矩阵 (现成的函数) betarnd:贝塔分布的随机数生成 ...

  8. 39 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)

    题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) public class _039PrintFu ...

  9. 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)

    *题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) public class 第三十九题按条件计算 ...

随机推荐

  1. IIS出现Server Application Unavailable的解决办法

    在XP中IIS5.1服务器,运行asp.net出现Server Application Unavailable,经过多次查证,才发现是因为先安装了.net Framework 2.0然后安装IIS,导 ...

  2. androik_sdk 更新慢问题解决办法。

    在windows中更改hosts(找到文件夹C:\Windows\System32\drivers\etc找到里面的hosts文件 )在这里添加74.125.237.1 dl-ssl.google.c ...

  3. shell ps1 提示设置

    PS1="\[\033[01;37m\]\u\[\033[00m\]@\[\033[01;31m\]localhost \t\[\033[00m\]:\[\033[01;35m\]\w\[\ ...

  4. Android Intent传递数据

    刚开始看郭大神的<>,实现以下里面的一些例子.Intent传递数据. 我们利用显示的方式进行Intent的启动. 1.启动intent并输入数据. Intent intent=new In ...

  5. PHP5的类与对象

    类是一个由变量和方法组成的独立程序块或功能模块. 人类: 口,脚,身高,体重,姓名,肤色等 (变量) 说话,行走等(方法) 丁三石,马化树,张夕阳(具体对象) 类的定义和对象的创建

  6. cordova开发中遇到的一些坑

    # 外域的JS被禁止,修改meta标签 <meta http-equiv="Content-Security-Policy" content="default-sr ...

  7. 【Chromium中文文档】OS X 沙箱设计

    OS X 沙箱设计 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/OSX ...

  8. 算法分析-动态规划(cut_rod)

    什么是动态规划,我们要如何描述它? 动态规划算法通常基于一个递推公式及一个或多个初始状态. 当前子问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法.暴力法等 ...

  9. PSAM SAM

    第一个问题: 为什么要用SAM? 究竟谁最开始使用SAM这个词,已经无从考证,能够确认的是:这个世界上先有了PSAM,然后才有了SAM.由于网络状况的原因,或者是应用环境的要求,使用IC卡作为支付介质 ...

  10. rdlc部署zt

    原文:rdlc部署zt 偶然间遇到“ 未能加载文件或程序集microsoft.reportviewer.winforms ……”的一个错误,以前web是遇到过,没想到winform部署也会遇到.找了半 ...