我正在使用Python中SciPy库中的'least_squares'函数进行优化。我想限制一个系数总是一个边界内的整数值。但是,least_squares函数似乎没有内置选项来包含仅约束的边界。有没有办法在least_sqaures函数中引入约束?
我有这个代码:
def objective_function(params, target):
# ... implementation of the objective function ...
def constraint(params):
coeff = params[0]
if not isinstance(coeff, int):
return False
return True
# Input parameters
coeff_initial_guess = 2
# ... other parameters ...
# Bounds for optimization
bounds = ([1], [4]) # Bounds for coeff
# Set up the optimization problem
result = least_squares(objective_function, [coeff_initial_guess], bounds=bounds)
有没有一种方法可以将约束函数合并到最小二乘优化过程中,以强制系数保持为整数?或者,SciPy中是否有其他优化函数可以处理此类约束?
任何帮助或建议将不胜感激。谢谢你!
2条答案
按热度按时间qqrboqgw1#
请使用
optimize.differential_evolution
,该函数有一个integrality
关键字,允许您指定哪些参数需要为整数。您必须将least_squares
目标重新公式化为标量函数(例如:fun = np.sum(objective_function(pars)**2)
)xv8emn3q2#
对于已证明的最佳解决方案,我认为您需要MIQP(混合整数二次规划)求解器。不幸的是,Scipy没有这样的解决方案。MIQP求解器是Cplex和Gurobi等库的一部分。
另一个答案建议使用
optimize.differential_evolution
。这主意不错。这是一个随机启发式,一般来说,它不会找到全局最优解。你的问题可能足够小,你有很高的概率找到一个最佳的解决方案(但你永远不会确定)。MIQP求解器是确定性的,并且一旦找到最优解就停止,而这些启发式算法只是在一些迭代或时间限制上停止。这些方法不够聪明,不知道它们是否解决了问题。我们可以用一些概率论的观点来说明:找到更好的解决方案的概率足够小。这基本上就是optimize.differential_evolution
可以用作停止标准的东西。一般来说,我更喜欢确定性求解器。我通常只在确定性求解器用完时才使用随机启发式。