Positive directional derivative for linesearch

使用optimize.minimize求解约束条件下的最优化问题,但是有时会报错“Positive directional derivative for linesearch”,代码如下:

import numpy as np
from scipy import optimize

def combine(data):
    wmin = np.min(data, axis=0)
    wmax = np.max(data, axis=0)
    val_idx = np.argsort(-data[0])  # 索引按降序排列
    n = data.shape[1]

    number = []
    for i in range(n):
        number.append(i)

    cons1 = [{'type': 'eq', 'fun': lambda x: np.sum(x) - 1}]

    def cons2(a):
        return {'type': 'ineq', 'fun': lambda x: x[val_idx[a]] - x[val_idx[a + 1]]}

    def cons3(a):
        return {'type': 'ineq', 'fun': lambda x: x[val_idx[a]] - wmin[a]}

    def cons4(a):
        return {'type': 'ineq', 'fun': lambda x: wmax[a] - x[val_idx[a]]}

    b = list(map(cons2, number[0:n - 1]))
    c = list(map(cons3, number))
    d = list(map(cons4, number))

    cons = cons1 + b + c + d
    fun = lambda x: np.sum((x - w[1]) ** 2)
    x0 = data[0]
    res = optimize.minimize(fun, x0, method='SLSQP', constraints=cons)

    print('最优解:', res.x)
    print('迭代终止是否成功:', res.success)
    print('迭代终止原因:', res.message)

if __name__ == '__main__':
    w1 = np.array([[0.31, 0.26, 0.19, 0.16, 0.08],
                  [0.25, 0.12, 0.31, 0.17, 0.15]])
    w2 = np.array([[0.3, 0.1, 0.05, 0.1, 0.1, 0.1, 0.1, 0.05, 0.05, 0.05],
                  [0.14, 0.23, 0.04, 0.08, 0.20, 0.06, 0.05, 0.07, 0.06, 0.09]])
    combine(w1)
    combine(w2)
    

结果为:

最优解: [0.25  0.215 0.215 0.17  0.15 ]
迭代终止是否成功: True
迭代终止原因: Optimization terminated successfully.

最优解: [0.195      0.195      0.06333333 0.1        0.1        0.1
 0.06333333 0.06333333 0.06       0.06      ]
迭代终止是否成功: False
迭代终止原因: Positive directional derivative for linesearch

当数据为w1时,就能迭代成功;数据为w2时,迭代失败

望大神指点!

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y

这些优化算法通常通过选择下降方向,然后对该方向执行线搜索来工作。我认为此消息表示优化器进入了一个位置,无法找到目标函数值减小(足够快)的方向,但也无法验证当前位置是否为最小值。