首页 > 解决方案 > 如何在 Python 中使用惩罚函数时编写“优化”问题

问题描述

看看这个简单的优化问题,它只是有点复杂(惩罚函数): 在此处输入图像描述

我检查了 Python 中的scipy纸浆库文档。我知道我可以使用“def”来实现我的目标,但即使在一个简单的问题中它也不起作用——我很困惑,不知道应该使用哪个求解器或方法来解决它。即使我尝试了最简单的惩罚函数形式,如下所示,这个问题应该尝试 4 个给定的数字而不是y变量来最小化惩罚函数作为目标(答案很清楚y=-2obj函数将是 -4):

from scipy.optimize import minimize
import numpy as np

def f(y):
    if y>=0:
        return y
    else:
        return 2*y

y = np.array([1,-1,2,-2])

res = minimize(f(y),args = [y])     

但我面临这个错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

请帮助我知道我应该如何编码这个惩罚函数,以及我应该使用哪个其他库或方法。

标签: pythonoptimizationscipy

解决方案


您的函数是一个标量函数,最小化将向量函数作为输入。

在您的情况下,您更喜欢使用将标量函数作为输入的minimize_scalar :

from scipy.optimize import minimize_scalar

def f(y):
    if y >= 0:
        return y
    else:
        return 2 * y 
    
minimize_scalar(f, bounds=(-2, 1), method='bounded')

#     fun: -3.9999930649182844
# message: 'Solution found.'
#    nfev: 28
#  status: 0
# success: True
#       x: -1.9999965324591422

推荐阅读