根据您搜索的离散数字范围的大小,您可能会发现使用黄金分割算法的解决方案更有效。例如,我尝试最小化以下内容:
bf = -21;
f =@(x) round(x-bf).^2;
在 [-100 100] 范围内,使用基于来自 Mathworks 文件交换的脚本的例程。这个特定的文件交换脚本似乎没有正确实现黄金分割,因为它每次迭代都会调用两个函数。修复此问题后,所需的调用次数减少到 12 次,这肯定优于在“愚蠢”调用min
. 收益很快就会变得巨大。例如,如果搜索区域是 [-100000 100000],golden 会在 25 个函数调用中找到最小值,而不是 200000 - 黄金分割中的调用次数对范围的依赖性是对数的,而不是线性的。
因此,如果范围足够大,其他方法肯定可以min
通过需要更少的函数调用来击败。最小化搜索例程有时会在早期步骤中包含这样的搜索。但是,您将遇到收敛(终止)标准的问题,您必须对其进行修改,以便例程知道何时停止。min
最好的选择可能是通过从黄金分割的几次迭代开始来缩小应用的搜索区域。
一个重要的警告是,保证黄金分割只适用于单峰区域,即显示单个最小值。在包含多个最小值的区域中,它可能会卡在一个最小值中并可能错过全局最小值。从这个意义上说,这min
是一个肯定的赌注。
另请注意,此处示例中的函数对 input 进行四舍五入x
,而您的函数采用整数输入。这意味着您必须在函数周围放置一个包装器,该包装器会舍入调用黄金例程传递的输入。
其他人似乎使用遗传算法来执行这样的搜索,尽管我没有对此进行研究。