最优化方法

刘建军

目录

  • 1 第一单元 数学规划基础
    • 1.1 序言
    • 1.2 数学规划基础
  • 2 第二单元 线性规划
    • 2.1 线性规划简史
    • 2.2 线性规划模型
    • 2.3 线性规划图解法及软件求解
    • 2.4 线性规划基本定理
    • 2.5 线性规划的标准形
    • 2.6 标准形线性规划的解
    • 2.7 单纯形法原理
    • 2.8 单纯形法算法步骤及程序实现
    • 2.9 表格单纯形法
    • 2.10 人工变量求解线性规划问题
  • 3 第三单元 对偶规划及灵敏度分析
    • 3.1 对偶规划
    • 3.2 对偶单纯形法
    • 3.3 灵敏度分析
    • 3.4 线性规划-内点法
    • 3.5 整数线性规划
  • 4 第四单元 无约束非线性优化
    • 4.1 非线性优化概论
    • 4.2 一维搜索算法
    • 4.3 梯度类算法
      • 4.3.1 最速下降法
      • 4.3.2 牛顿法与修正牛顿法
      • 4.3.3 拟牛顿法(DFP+BFGS)
      • 4.3.4 共轭梯度法(FR)
      • 4.3.5 最小二乘法
      • 4.3.6 梯度类算法比较实验
      • 4.3.7 梯度算法历史注记
    • 4.4 直接类算法
      • 4.4.1 模式搜索法(Hooke Jeeves)
      • 4.4.2 单纯形加速法
      • 4.4.3 无约束优化算法比较实验
  • 5 第五单元 约束非线性优化
    • 5.1 KKT点及程序实现
    • 5.2 罚函数法(SUMT)
    • 5.3 可行方向法
    • 5.4 二次规划(QP)
    • 5.5 约束优化软件求解
  • 6 第六单元 多目标规划
    • 6.1 多目标规划原理
    • 6.2 多目标的四个求解技巧
    • 6.3 目标规划方法
    • 6.4 多目标规划应用实例
  • 7 第七单元 动态规划
    • 7.1 动态规划基本概念和原理
    • 7.2 动态规划应用
  • 8 第八单元  现代优化算法
    • 8.1 现代优化算法概论
    • 8.2 禁忌搜索算法(Taboo Search, TS)
      • 8.2.1 禁忌搜索算法原理
      • 8.2.2 禁忌搜索算法步骤与参数设置
      • 8.2.3 禁忌搜索算法的应用
    • 8.3 模拟退火算法(Simulated Annealing, SA)
      • 8.3.1 模拟退火算法物理背景
      • 8.3.2 模拟退火算法步骤与数学模型
      • 8.3.3 模拟退火算法应用案例
    • 8.4 遗传算法(Genetic Algrithm, GA)
      • 8.4.1 遗传算法生物学背景
      • 8.4.2 遗传算法流程用简单实例
      • 8.4.3 改进遗传算法改进与应用
    • 8.5 粒子群算法(Partical Swarm Optimization, PSO)
      • 8.5.1 粒子群算法原理及实现
      • 8.5.2 粒子群算法应用实例
直接类算法

Matlab中fminsearch函数用来求解多维无约束的线性优化问题

     用derivative-free的方法找到多变量无约束函数的最小值.   

语法

   x = fminsearch(fun,x0)

   x = fminsearch(fun,x0,options)

   [x,fval] = fminsearch(...)

   [x,fval,exitflag] = fminsearch(...)

   [x,fval,exitflag,output] = fminsearch(...)

 解释

    fminsearch能够从一个初始值开始,找到一个标量函数的最小值。通常被称为无约束非线性优化.

    x = fminsearch(fun,x0) 从x0开始,找到函数fun中的局部最小值x,x0可以是标量,向量,矩阵。fun是一个函数句柄.

    x = fminsearch(fun,x0,options) 以优化参数指定的结构最小化函数,可以用optimset函数定义这些参数。(见matlab help)

    [x,fval] = fminsearch(...)返回在结果x出的目标函数的函数值

    [x,fval,exitflag] = fminsearch(...) 返回exitflag值来表示fminsearch退出的条件:

        1--函数找到结果x

        0--函数最大功能评价次数达到,或者是迭代次数达到

        -1--算法由外部函数结束


    [x,fval,exitflag,output] = fminsearch(...) 返回一个结构输出output,包含最优化函数的信息:

        output.algorithm 使用的优化算法

        output.funcCount 函式计算次数

        output.iterations 迭代次数

        output.message 退出信息


说明

  fun是需要最小化的函数,他的输入为input,输出为标量f,目标函数在x上作出估计,函数可以为M文件的一个句柄函数(当是M文件时,用单引号括起文件名):

x = fminsearch(@myfun, x0)

这里

function f = myfun(x)


f = ... 其自变量为x

或者直接写出

x = fminsearch(@(x)sin(x^2), x0);


例子

    例1:一个典型的测试就是求多维the Rosenbrock banana function函数的最小值,其最小值在(1,1),其值为0. 一般开始迭代在(-1.2,1). 

    这里定义一个句柄函数

        banana = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2;


    将这个函数传递给fminsearch为

        [x,fval] = fminsearch(banana,[-1.2, 1])

结果

x =

    1.0000    1.0000

fval =

    8.1777e-010


说明函数在x处有近似于0的最小值,且估计结果有四位小数

例2:如果fun是有参数的,那么可以定义个匿名函数去获得独立的参数,例如,若果需要估计的函数为

function f = myfun(x,a)

    f = x(1)^2 + a*x(2)^2


因为myfun中有一个位置参数a,所以不能直接传给fminsearch中。所以需要最优化具体的a,例如a = 1.5.

首先定义 

a = 1.5;

然后

x = fminsearch(@(x) myfun(x,a),[0,1]) 


算法

fminsearch使用单纯形法,这是一种不会使用数值或者梯度分析的直接的方法.

假如x的长度为n,那么会有n+1个顶点,两维空间中,单纯型是三角形,三维空间,他是一个锥形。搜索的每一步中,都会产生离当前单纯型比较近的点,在新的点上的函数值回合单纯型各个顶点上的值比较,一般都会有一个定点被替代,产生一个新的单纯型,重复步骤,直到单纯型的大小小于阈值。

限制: fminsearch可以处理不连续的问题,如果得不到全局最优,则其会得到局部最优.

它只能最小化时数,复数并不在其能力范围之内,且f(x)的返回值也必须是实数,如果x为复数,则其必须分解为实部和虚部两部分。

我们可以稍微对进行一些变换,就可实现利用fminsearch进行参数估计。

例如,原始信号发生器模型为:;  假设有两个参数我们未知,即我们要进行参数估计的模型为

z=a(1)*exp(a(2)*x)+a(3)*exp(a(4)*x);

下面我们只需采用以下代码就可以实现上述参数的估计。

x=[0:0.2:4]';

Z=3*exp(-0.4*x)+12*exp(-3.2*x);

c=[1 1 1 1];

options=optimset('fminsearch');

options.TolX=0.001;

options.Display='off';

[a,sfval,sexit,soutput]=fminsearch(@fun,c,options,x,Z)

函数定义为:

function E=fun(a,x,Z)

z=a(1)*exp(a(2)*x)+a(3)*exp(a(4)*x);

E=sum((Z-z).^2);

结果为:

a =

    3.0004   -0.4001   11.9994   -3.2000

sfval =

1.5099e-007

sexit =

     1

soutput =

    iterations: 190

     funcCount: 322

     algorithm: 'Nelder-Mead simplex direct search'