如何创建用于最小化目标的函数

时间:2018-12-14 00:30:27

标签: python python-3.x scipy

没错,对于很多问题我们深表歉意,但是我是Python的新手,我一直在努力。

我相信我终于创建了一个具有一定功能的代码。但是,我似乎无法正确定义目标函数。其余的似乎计算正确(基于目标给我的值)。这是我目前的目标功能:

def objective (x):
    global sumIp, sumIm
    if (It[i-1] - d[i] + Qt[i-LT]) >= 0:
        sumIp = sumIp + x[2]
        sumIm = sumIm + 0
    else:
        sumIp = sumIp + 0
        sumIm = sumIm - x[2]
    return h*sumIp+b*sumIm

x [2]是我的It [i]。 sumIp和sumIm都应> = 0。

如果有人想看一下,这里是完整的代码:https://pastebin.com/AxC7fTVv-我相信这是我所想要的唯一缺少的部分,但是我不知道该怎么做为了我的生命,已经有好几天了!任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

摘要

好的。我将总结您的问题(对您来说有点,但主要是为了帮助我:p)。

您有一个要计算的值序列,所有这些都围绕找出Qt[i]。这些是:

  • d[i]-在“真实世界”场景中从外部提供的一些值列表,但出于您的目的,这些值使用随机值进行仿真;最重要的是,这不是必须计算的。 (另一注:我假设我们不能“展望未来”并使用d[i+1]或类似的东西。)
  • It[i]-由It[i] = It[i-1] - d[i] + Qt[i-LT]给出(Qt省略了i < LT部分);这是根据前一周期值和d值计算得出的,因此可以很容易地计算出
  • Ip[i]Im[i]-都是直接从It[i]计算得出的,因此,易于计算
  • NIt[i]-由NIt[j] = NIt[j-1] - d[j] + Qt[j-1]给出,可以很容易地计算,类似于It[i]
  • Qt[i]-...?

简而言之:唯一需要弄清楚的是Qt[i]。因此,如果您决定使用scipy.minimize之类的优化程序,则所需的 only 变量为x[0]。但是,如果您只有一个变量,则可能甚至不需要使用优化器。您更有可能提出一些可以直接为您提供最佳结果的函数/表达式。

解决方案

...还不太确定:\对不起

答案 1 :(得分:0)

评论1

注意-我正在根据问题说明中的链接第一粘贴框进行更改。

尝试一下:删除global语句,使objective函数看起来像

def objective (x):
    # [`global` removed here]
    if (It[i-1] - d[i] + Qt[i-LT]) >= 0:
        sumIp = sumIp + x[2]
        sumIm = sumIm + 0
    else:
        sumIp = sumIp + 0
        sumIm = sumIm - x[2]
    return h*sumIp+b*sumIm

这样,sumIp时的sumImx[2]值是在每个objective调用中在本地创建的,而不是全局编辑。 (您可能想重命名局部变量,以免造成混淆。)

然后,在minimize完成之后,将更改推送到最终的最佳x[2]值,如下所示:

def test(T):
    global i
    while i < T:
        # [...]
        sol = minimize(objective, x0, constraints=cons)

        if (It[i-1] - d[i] + Qt[i-LT]) >= 0:
            sumIp = sumIp + sol.x[2]
            sumIm = sumIm + 0
        else:
            sumIp = sumIp + 0
            sumIm = sumIm - sol.x[2]
        # [...]
        i += 1
    return Qt, NIt, It

评论2

好的。 x[0] == Qt[i]不是 Qt[i-1],对吧?如果是这样,那么您将无法轻易地交换Qt[i-1]x[0]。另外,当您删除x[0]时,优化器会停止工作的事实也很有意义;尝试最小化表达式时,唯一允许更改的是x值,然后将其删除,则最小化器的允许执行的内容将更少。

关于一般的“ strange [ness]”,可能与约束使用if语句有关,这实际上使它们成为分段函数。虽然有一些对非线性约束有效的最小化方法,但我不确定是否有对不可微分约束有效的方法。

要解决此问题,请查看我在this paste中所做的更改。我用两个严格非负的变量x[2]x[2]替换了x[3],其中旧值现在为x[2] - x[3]。这样就无需在目标中使用if语句。为了使变量为非负值,我为x_bounds问题添加了边界条件。 (请注意,这消除了对constraint1函数的需要,因此我将其删除。代码中的其他简化操作还有更多空间,但是因为没有必要我将其他所有内容都保留下来。)

所以剩下的唯一我还不太了解的部分是constraint2:您能再解释一下它应该做什么吗?