zoukankan      html  css  js  c++  java
  • [MATLAB] 利用遗传算法函数求目标函数的最优解

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

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

    遗传算法(英语: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()等。

  • 相关阅读:
    css3新特性总结
    H5新特性总结
    小程序本地移除有一条数据
    字符串截取(某个指定字符前面和后面的值)(指定前几位后几位)
    uni-app 创建项目
    数组转数组对象及数组对象中的某个属性值拼成一个数组
    VUE 解决单页使用keep-alive页面返回不刷新的问题
    小程序弹窗真机不动
    js 数组去重方法
    VUE 列表页中实现分页(下拉到底部触发下一页 )
  • 原文地址:https://www.cnblogs.com/xiaff/p/5345475.html
Copyright © 2011-2022 走看看