WOLFRAM 语言教程

约束最优化函数的比较

NMinimizeNMaximizeMinimizeMaximize 使用全局优化算法,因而当我们要求一个全局最优解的时候,这些方法是合适的.     

MinimizeMaximize 可以对包括任意多项式问题的一类最优化问题找到精确的全局最优解. 然而,我们所使用的算法具有非常高的渐近复杂度,因此只适合具有少数变量的问题.

Maximize 总是可以找到全局最大值,即使是在数值不稳定的情况下也能够找到. 这里的约束条件中的左侧等于 .     
In[1]:=
Click for copyable input
Out[1]=
这里的输入与上次输入不同的地方仅在于第二十一位小数,但得到的答案却是很不相同的,尤其是最大值点的位置. 对于一个使用16位精度的算法来说,这两个问题看起来是相同的,因此它可能不能正确地解决这两个问题.
In[2]:=
Click for copyable input
Out[2]=
NMaximize 在默认的情况下使用具有机器精度的数字,因而它不能解决这两个问题中的任何一个.
In[3]:=
Click for copyable input
Out[3]=
In[4]:=
Click for copyable input
Out[4]=

FindMinimum 只试图找到局部极小值,因此适合用于当我们需要求解局部最优解的时候,或者当我们事先知道该问题只有一个最优解,或者只有几个能通过使用不同的初始值找到的最优解.

即使对于局部优化,使用 NMinimize 解决小规模问题仍然是值得的. NMinimize 使用这四个直接搜索算法之一 (NelderMead、差异演化、模拟退火和随机搜索), 然后采用KKT 解、 内点法和惩罚函数方法的组合对产生的解进行微调. 所以如果效率不是一个问题的话,NMinimize 应该比 FindMinimum 更稳健,而且得到的解还是全局最优解.

这里显示了 NMinimize 在一个具有4个变量的问题上的默认行为.

In[5]:=
Click for copyable input
Out[9]=

这表明,两个后处理器,KKT 与 FindMinimum,没有给我们提供默认的结果. 请注意,由于历史原因,FindMinimum 这个名字,作为 的选项名时,代表一个用惩罚函数方法把约束最优化问题转换为无约束最优化问题、 并且用(无约束) FindMinimum 解决问题的过程.

In[10]:=
Click for copyable input
Out[10]=
In[11]:=
Click for copyable input
Out[11]=

但是,如果效率问题非常重要,FindMinimum 可以在以下情况使用:如果你只需要一个局部最小值,或者你可以提供一个良好的初始值,或者你知道该问题只有一个极小值(例如,凸函数的情况),或者你要解决的问题很大/代价很高. 下面用FindMinimumNMinimize 来解决具有7个变量的同样的问题. 这些约束条件相对来说计算代价较高. 显然在这种情况下FindMinimum 速度远远超过 NMinimize.

In[12]:=
Click for copyable input
In[14]:=
Click for copyable input
Out[14]=
In[15]:=
Click for copyable input
Out[15]=