如何在Scipy的范围内保持优化搜索?

时间:2016-10-25 14:05:39

标签: python scipy mathematical-optimization

我用三个变量(w,V,m)解决(约束的)非线性最小化问题。给定w,(V,m)的最小化问题是(约束的)线性的。线性最小化问题是针对[w_0,w_1]中的w定义的。

我设置问题的方法是,给定w,我正在解决约束线性程序,然后我将w最小化为w,bounds = ((w_0, w_1),)范围为w作为边界。当w的最小化搜索到它的边界之外时,即在没有定义线性程序的区域,我遇到了问题。

有没有办法限制搜索不超出提供的范围? 如果没有替代品?通过更严格的界限?如果传递一个超出边界值的值,使目标函数返回一个大值吗?

我很抱歉无法提供最小的工作示例。

这是一些伪代码:

from scipy.optimize import linprog,minimize

def objective(w):
A_ub,b_ub = constraints(w)
results = linprog(c,A_ub = A_ub,b_ub=b_ub)
return results.fun

bounds = ((w_0,w_1),)
x0 = (w_0+w_1)/2
minimize(objective,x0,bounds)

2 个答案:

答案 0 :(得分:0)

可以将解决约束优化问题的方法分为两类:

  • (1)可行方法:每个迭代都将满足约束
  • (2)不可行方法:迭代不需要满足约束直到收敛

因此,使用可行的方法对您的情况很自然。可悲的是,scipy的文档对于可用算法的这一特性有点不清楚。

我很确定,L-BFGS-B是这里的方式(因为你只需要绑定约束!)

答案 1 :(得分:0)

可能有用的是重新参数化/重新定义变量w,以便它永远不会离开边界。如果x介于-infinity和infinity之间,那么

w = a +(b-a)/(1 + exp(-x))

将在(a,b)区间内。

为了清楚起见,您应该将x设置为minimize函数中的优化参数,并将w包含在此公式中。无论你得到什么x,你都可以保证w将在界限范围内。

这什么时候不好?当然,如果你认为你可能在a或b处有一个角点解决方案。除此之外,我认为它通常有效,但请报告回来看它是否适合你。