目录
算法需要输入的参数
算法输出的优化结果
优化算法应用举例
优化算法举例代码
优化算法输出结果
其他优化问题举例
最优化求解问题标准格式如下:
标准形式如下:
目标函数:minimize f(x) ……
约束条件subject to:
g_i(x) >= 0, i = 1,...,m
h_j(x) = 0, j = 1,...,p
Python中scipy库有很多包,其中一个就是scipy.optimize.minimize求解有无约束的最小化问题。
原文请参考:scipy.optimize.minimizehttps://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize
Python中scipy.optimize.minimize具体参数如下:
scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None,
hessp=None, bounds=None, constraints=(), tol=None,
callback=None, options=None)[source]
求解方法 | 解释 |
---|---|
Nelder-Mead | 求解非线性、导函数未知的最值问题 |
Powell | 鲍威尔共轭方向法 |
CG | 共轭梯度法 |
BFGS | 变尺度法、拟牛顿方向法 |
Newton-CG | 牛顿-共轭方向法 |
L-BFGS-B | 改进的BFGS法 |
TNC | 截断牛顿法 |
COBYLA |
线性逼近法 |
SLSQP | 序列最小二乘法 |
dogleg | 信赖域算法(狗腿法) |
trust-ncg | 信赖域的牛顿共轭梯度法 |
type : str
Constraint type: '='号约束:'eq' ,'>='号约束:'ineq'.
COBYLA算法仅支持ineq
fun : callable
定义条件的函数
jac : callable, optional
约束条件的梯度函数(only for SLSQP).
args : sequence, optional
传递给目标函数或雅可比矩阵的额外的参数
maxiter : int
算法的最大迭代次数
disp : bool
disp=True时打印收敛信息
具体信息如下:(看下后面的代码例子会懂)
x the solution array, success a Boolean flag indicating if the optimizer
exited successfully and message which describes the cause of the termination.
最小化问题,含有等式目标约束:
import numpy as np
from scipy.optimize import minimize
# 定义目标函数
def func(x, sign=1.0):
# scipy.minimize默认求最小,求max时只需要sign*(-1),跟下面的args对应
return sign * (x[0] ** 2 + x[1] ** 2 + x[2] ** 2)
# return sign * (np.power(x[0], 2) + np.power(x[1], 2) + np.power(x[2], 2))
# 定义目标函数的梯度
def func_deriv(x, sign=1):
jac_x0 = sign * (2 * x[0])
jac_x1 = sign * (2 * x[1])
jac_x2 = sign * (2 * x[2])
return np.array([jac_x0, jac_x1, jac_x2])
# 定义约束条件
# constraints are defined as a sequence of dictionaries, with keys type, fun and jac.
cons = (
{'type': 'eq',
'fun': lambda x: np.array([x[0] + 2 * x[1] - x[2] - 4]),
'jac': lambda x: np.array([1, 2, -1])},
{'type': 'eq',
'fun': lambda x: np.array([x[0] - x[1] - x[2] + 2]),
'jac': lambda x: np.array([1, -1, -1])}
)
# 定义初始解x0
x0 = np.array([-1.0, 1.0, 1.0])
# 使用SLSQP算法求解
res = minimize(func, x0 , args=(1,), jac=func_deriv, method='SLSQP', options={'disp': True},constraints=cons)
# args是传递给目标函数和偏导的参数,此例中为1,求min问题。args=-1时是求解max问题
print(res.x)
Optimization terminated successfully. (Exit mode 0)
Current function value: 4.000000000000002
Iterations: 2
Function evaluations: 2
Gradient evaluations: 2
[-2.22044605e-16 2.00000000e+00 -6.66133815e-16]
即函数输出最优值为:4.00,最优解为[0,2,0]。
Optimization (scipy.optimize)https://docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/optimize.html#constrained-minimization-of-multivariate-scalar-functions-minimize