如何在Scipy中保持优化搜索在一定范围内?

2024-09-26 22:09:46 发布

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

我在解决一个三变量(w,V,m)的非线性最小化问题。给定w,极小化问题对于(V,m)是(约束)线性的。在[wu0,wu1]中定义了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)

Tags: 方法区域定义线性results边界boundsobjective
2条回答

可能有用的方法是重新参数化/重新定义变量w,这样它就不会离开边界。如果x介于-无穷大和无穷大之间,那么

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

将在(a,b)时间间隔内。在

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

什么时候这是个坏主意?当然,如果你认为你可能有一个角落的解决方案,在a或b。除此之外,我认为它通常是有效的,但请报告回来看看它是否对你有效。在

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

  • (1) 可行方法:每次迭代都满足约束条件
  • (2) 不可行方法:迭代在收敛之前不需要满足约束条件

所以使用一种可行的方法是很自然的。可悲的是,scipy的文档对于可用算法的这一特性有点不清楚。在

我很确定,L-BFGS-B就是这样(因为您只需要绑定约束!)在

相关问题 更多 >

    热门问题