【问题标题】:scipy.optimize.minimize with constraints does not work as expected带有约束的 scipy.optimize.minimize 不能按预期工作
【发布时间】:2020-08-04 02:54:01
【问题描述】:

我想为附图https://i.stack.imgur.com/W6fhf.jpg中描述的问题找到最佳解决方案

我的代码是

from scipy.optimize import minimize

def create_constraints(t, tau, ub):
constraints = [{
    'type': 'ineq',
    'fun': lambda x: x[0] * (-1),
}]

con1 = {
    'type': 'ineq',
    'fun': lambda x: x[0] - x[1] + tau[0],
}

constraints.append(con1)

con2 = {
    'type': 'ineq',
    'fun': lambda x: x[1] - ub + tau[1],
}

constraints.append(con2)

return constraints


def f(x):
    return (x[0] + x[1]) * (-1)


t0 = np.array([1, 10])
tau0 = [5, 5]
cons = create_constraints(t0, tau0, 30)
res = minimize(f, t0, constraints=cons, method='trust-constr')

使用上述约束参数,我预计最佳解决方案将接近 [20, 25]。然而优化的结果是x: array([ 6.66666669, 18.33333334])。我究竟做错了什么?为什么最小化器不能按预期工作?

任何帮助表示赞赏。

【问题讨论】:

    标签: scipy-optimize-minimize


    【解决方案1】:

    我发现如果我以这种方式创建约束

    def create_constraints_2(t, tau, ub):
        constr_f = lambda x: np.array([
            x[0] * (-1),
            x[0] - x[1] + tau[0],
            x[1] - ub + tau[1],
        ])
        
        return NonlinearConstraint(constr_f, -np.inf, 0)
    

    然后调用函数

    cons_2 = create_constraints_2(t0, tau0, 30)
    minimize(f, t0, constraints=cons_2, method='trust-constr')
    

    然后它工作正常。输出为x: array([19.99974476, 24.99993157])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多