首页 > 解决方案 > 具有非线性约束的 scipy 最小化

问题描述

我正在尝试优化此模型:

最小化 obj: sum(variables * a)

st: 1) sum(log(variables)*c) >= b

  1. 总和(变量)= 1

  2. 变量 >= 0

其中“a”和“b”是常数,“c”是概率类型向量。我从 scipy 包中尝试了三种不同的方法,但都没有奏效。这是我使用“trust-constr”方法的代码

def objective(x):
    return np.sum(np.dot(x,v))

lincos = LinearConstraint( [1]*(len(f)), 1,1)
lincos1 = LinearConstraint( [1]*(len(f)), 0, np.inf)
nonlincos = NonlinearConstraint(constraint,0.01, np.inf)

result1 = minimize(objective, f, method='trust-constr', constraints=[lincos,lincos1 ,nonlincos ] )

这给出了一个值错误,我认为它与我的日志约束有关,但我不知道如何解决这个问题。

..................................................... .........................................

ValueError                                Traceback (most recent call last)
<ipython-input-97-18fbd5e75692> in <module>
----> 1 result1 = minimize(objective, f, method='trust-constr', constraints=[lincos,lincos1 ,nonlincos ] )

~\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    620         return _minimize_trustregion_constr(fun, x0, args, jac, hess, hessp,
    621                                             bounds, constraints,
--> 622                                             callback=callback, **options)
    623     elif meth == 'dogleg':
    624         return _minimize_dogleg(fun, x0, args, jac, hess,

~\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\minimize_trustregion_constr.py in _minimize_trustregion_constr(fun, x0, args, grad, hess, hessp, bounds, constraints, xtol, gtol, barrier_tol, sparse_jacobian, callback, maxiter, verbose, finite_diff_rel_step, initial_constr_penalty, initial_tr_radius, initial_barrier_parameter, initial_barrier_tolerance, factorization_method, disp)
    517             initial_barrier_tolerance,
    518             initial_constr_penalty, initial_tr_radius,
--> 519             factorization_method)
    520 
    521     # Status 3 occurs when the callback function requests termination,

~\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\tr_interior_point.py in tr_interior_point(fun, grad, lagr_hess, n_vars, n_ineq, n_eq, constr, jac, x0, fun0, grad0, constr_ineq0, jac_ineq0, constr_eq0, jac_eq0, stop_criteria, enforce_feasibility, xtol, state, initial_barrier_parameter, initial_tolerance, initial_penalty, initial_trust_radius, factorization_method)
    327             constr0_subprob, jac0_subprob, subprob.stop_criteria,
    328             state, initial_penalty, trust_radius,
--> 329             factorization_method, trust_lb, trust_ub, subprob.scaling)
    330         if subprob.terminate:
    331             break

~\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\equality_constrained_sqp.py in equality_constrained_sqp(fun_and_constr, grad_and_jac, lagr_hess, x0, fun0, grad0, constr0, jac0, stop_criteria, state, initial_penalty, initial_trust_radius, factorization_method, trust_lb, trust_ub, scaling)
    119         dt, cg_info = projected_cg(H, c_t, Z, Y, b_t,
    120                                    trust_radius_t,
--> 121                                    lb_t, ub_t)
    122 
    123         # Compute update (normal + tangential steps).

~\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\qp_subproblem.py in projected_cg(H, c, Z, Y, b, trust_radius, lb, ub, tol, max_iter, max_infeasible_iter, return_all)
    497     # Initial Values
    498     x = Y.dot(-b)
--> 499     r = Z.dot(H.dot(x) + c)
    500     g = Z.dot(r)
    501     p = -g

~\Anaconda3\lib\site-packages\scipy\sparse\linalg\interface.py in dot(self, x)
    413 
    414             if x.ndim == 1 or x.ndim == 2 and x.shape[1] == 1:
--> 415                 return self.matvec(x)
    416             elif x.ndim == 2:
    417                 return self.matmat(x)

~\Anaconda3\lib\site-packages\scipy\sparse\linalg\interface.py in matvec(self, x)
    227             raise ValueError('dimension mismatch')
    228 
--> 229         y = self._matvec(x)
    230 
    231         if isinstance(x, np.matrix):

~\Anaconda3\lib\site-packages\scipy\sparse\linalg\interface.py in _matvec(self, x)
    525 
    526     def _matvec(self, x):
--> 527         return self.__matvec_impl(x)
    528 
    529     def _rmatvec(self, x):

~\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\projections.py in null_space(x)
    191         # v = P inv(R) Q.T x
    192         aux1 = Q.T.dot(x)
--> 193         aux2 = scipy.linalg.solve_triangular(R, aux1, lower=False)
    194         v = np.zeros(m)
    195         v[P] = aux2

~\Anaconda3\lib\site-packages\scipy\linalg\basic.py in solve_triangular(a, b, trans, lower, unit_diagonal, overwrite_b, debug, check_finite)
    334 
    335     a1 = _asarray_validated(a, check_finite=check_finite)
--> 336     b1 = _asarray_validated(b, check_finite=check_finite)
    337     if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]:
    338         raise ValueError('expected square matrix')

~\Anaconda3\lib\site-packages\scipy\_lib\_util.py in _asarray_validated(a, check_finite, sparse_ok, objects_ok, mask_ok, as_inexact)
    244             raise ValueError('masked arrays are not supported')
    245     toarray = np.asarray_chkfinite if check_finite else np.asarray
--> 246     a = toarray(a)
    247     if not objects_ok:
    248         if a.dtype is np.dtype('O'):

~\Anaconda3\lib\site-packages\numpy\lib\function_base.py in asarray_chkfinite(a, dtype, order)
    497     if a.dtype.char in typecodes['AllFloat'] and not np.isfinite(a).all():
    498         raise ValueError(
--> 499             "array must not contain infs or NaNs")
    500     return a
    501 

ValueError: array must not contain infs or NaNs

标签: pythonpython-3.xnumpyscipynonlinear-optimization

解决方案


推荐阅读