Mathematica How To II —— 数值全局最优化方法
Mathematica How To II —— 数值全局最优化方法

Mathematica How To II —— 数值全局最优化方法

Mathematica How To II —— 数值全局最优化方法

今天小编给大家介绍在Mathematica中如何进行数值全局最优化,我们都知道,在Mathematica中如何进行数值全局最优化需要使用NMinimize函数,那么Mathematica中如何进行数值全局最优化是什么呢?在Mathematica中如何进行数值全局最优化是什么意思呢?小编也很想知道,下面就让小编来为大家介绍一下在Mathematica中如何进行数值全局最优化的详细内容。

玩烂梗

NMinimize函数基本介绍

基本语法

NMinimize[f,x]
关于x, 最小化f.

特点

  1. 有很强的通用性, 被优化的函数可以是有约束的,无约束的,可以是任意可以返回数值的函数对象。
  2. 虽说是全局最优化方法,但是可能会进入局部最优解,毕竟没有任何算法保证全局最有界可达。
  3. 智能的方法对应和转换,若目标函数和约束条件是线性的,会使用线性规划方法求解;如果有整数变量或者目标函数的头部不是数值函数的话,使用差分进化算法。对于其他所有类型的问题,使用Nelder-Mead(改进单纯形法) ,若效果不佳则转回差分进化。

    文档叙述

    约束非线性最优化的数值算法大致可以分为 基于梯度的方法 和 直接搜索方法. 基于梯度的方法使用一阶导数 (梯度) 或二阶导数(黑塞(Hessians)矩阵). 例如,序列二次规划方法(SQP)、增广拉格朗日方法和(非线性)内点法. 直接搜索方法不使用导数信息. 例如,Nelder-Mead、遗传算法和差分进化,以及模拟退火. 直接搜索方法往往收敛速度较慢,但可以对函数和约束条件中噪声存在的限制更为宽松.

    子方法的介绍

    Nelder-Mead

    算法介绍

    Nelder-Mead方法是一个直接搜索方法. 对于一个具有 n 个变量的函数,该算法保持一个 n+1 个点的点集,这些点形成 n 维空间的多面体的顶点. 这种方法通常被称为 "单纯" 方法。

由于LaTeX引擎有问题,之后再补上算法的详细介绍。

特点

  1. 速度不错,对于复杂问题,由于只需要比待求参数多一个点的点集,计算量不会很大。例如在解决一个15维含参时滞非线性微分方程时,10000次迭代也只需要几个小时。
  2. 容易陷入局部最优解,这时候就需要调整子方法的选项,例如反射比率、收缩比率等。但总体来说,若问题有多个局部优解,该方法的性能相对不佳。

微分进化

算法介绍

通过初始点集在迭代过程中产生的新点集合逼近优解,其中新点从原点集中选取三个杂交形成。

特点

  1. 速度慢,真的很慢。对于上面的优化问题,250次迭代需要10小时左右。
  2. 能够更好的搜索全局优解,性能很好,并且通过SearchPoints可以设定初始点集的大小,可以自主控制运算的时间。
  3. 对于不同问题或同一问题的两次试验,该算法耗费的时间可以有很大的不同。
  4. 内存占用会随时间增加而变大,对于上面的问题,每个内核需要至少6G的内存。

模拟退火

没用过,效果可能一般
更新: 算法也很慢

由于模拟退火在无法找到优解时需要的设置和选项较多,目前我并没有使用过该函数,我用过之后再更新。

随机搜索

算法介绍

随机搜索算法的工作方式是先产生一族随机初始点,然后从每个初始点用一个局部优化方法收敛到一个局部极小值。最佳局部极小值被选为问题的解。

特点

  1. 速度很快,且对于简单问题,迭代次数可以很少。
  2. 对于连续问题和导数信息有用的问题效果很好。

子方法的选项

InitialPoints

结构必须为{{x11,x21,x31…},{x21,x22,x32…},…}
对于NM方法,初始点集需要是待优化参数+1个。
对于其他方法,该参数必须与SearchPoints结合使用。

SearchPoints

代表了搜索点集点的数量,对于NM法没有这个选项,而在模拟退火方法中该值默认为$$\mathrm{min}(2d,50)$$, 随机搜索中为$$\mathrm{min}(10d,100)$$.

PostProcess

一个帮助文档中没有详细叙述的选项,是在迭代完后使用局部搜索方法继续寻找优值的选项,如果MaxIteration比较小,这个选项开启之后结果会相对较优。

我正在解决的问题

对于一个含参时滞微分方程,需要控制时滞值和方程中的参量,使用ParametricNDSolve给出模型,再写出优化的目标函数,使用NMinimize进行求解。但其中有多个问题。

方程的刚性导致的计算中断和计算时间过长

对于很多参量区间该方程都是刚性或有奇解的,但如果使用刚性转换方法计算,一次Evaluation需要1分钟左右,我无法承受这样的运算复杂度,所以最终放弃对方程进行刚性转换。

NMinimize是运行在单核上的

任何NMinimize算法都是运行在单核上的所以我不得不对其进行并行化,但这样做的效率相对低。

Mathematica的内部Bug

在并行化运算的时候,我遇到了子内核停止的问题,经检查这应该是Bug导致的,所以提交了一份Feedack给WRI, 希望能尽快解决吧。

MMA Bug还真不少…

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据