利用SLSQP优化器解决局部极小问题

2024-04-25 15:18:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有收入的目标函数,其形式为e^(β1*log(P1)+β2*log(P2)+…β250*log(P250)),其中P1,P2。。。P250是某些项目的价格和beta1、beta2,。。。beta250.1是模型中的弹性系数。我希望实现收入最大化,目前使用SLSQP对价格、单位和客人数量进行限制。我面临的问题是优化器陷入局部极小值(当我将价格界限放宽5%或10%甚至更多时,它返回相同的o/p)。我试着使用手动编写的渐变和近似。在这两种情况下,它都被困在当地。我不能使用全局优化器,因为它们需要很多时间,我们计划实时部署优化器,以便商店经理可以使用它。你能推荐一些没有局部极小值问题的算法,并且应该在30到45秒内收敛吗

谢谢


Tags: 项目函数模型log目标价格局部形式
2条回答

我们没有完整的模型,因此仅限于处理部分信息,以下是一些备注:

  • max Exp(sum())目标可以替换为max sum()(因为exp()是单调的)
  • 对于全局优化问题,我经常使用Baron、Couenne和Antigone等解算器。这个问题可能小到足以证明全局最优性
  • 您还可以尝试多起点方法:使用多个不同的起点。这至少可以防止一些非常糟糕的解决方案。一些解算器具有此内置功能(例如Knitro),但使用简单循环实现此功能并不十分困难
  • SLSQP是一个局部解算器。理论上,您可以使用basinhopping+SLSQP,但我不确定这是否适用于约束

你别无选择。如果我理解正确,您正试图使用局部优化器SLSQP优化一个具有250个参数的目标函数。现在,我真的不知道你的250维目标函数是什么样子的,但是如果在任何方向上你有超过一个山谷,那么任何局部优化算法都会陷入局部极小值,除非你提供一个已经非常接近全局最优值的起点

这是一个相对大量的参数优化,同时寻求一个全局最优。我唯一的建议是以分析的方式输入渐变,用Cython或FORTRAN+f2py编写函数和渐变(尽管我不确定您可以从中获得多少收益),然后尝试使用全局优化器(例如,请参见http://infinity77.net/global_optimization/multidimensional.html)或具有不同起点的多起点SLSQP

根据算法(以及您使用的机器),30到45秒可能会为您提供100000次以上的功能评估。对于这样一个规模的问题来说,这不是什么大问题:如果目标函数是复杂的,不幸的是,可能性并不存在

相关问题 更多 >