Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为scipy最小化创建目标函数_Python_Python 3.x_Scipy - Fatal编程技术网

Python 如何为scipy最小化创建目标函数

Python 如何为scipy最小化创建目标函数,python,python-3.x,scipy,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 els

好的,很抱歉问了这么多问题,但我对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

下面是完整的代码,如果有人想看一看:-我相信这是我唯一错过的部分,以实现我想要的,但我不知道如何做到这一点,为我的生活,一直围绕着这几天!感谢您的帮助。

评论1 注意-我正在对第一个pastebin副本进行更改,如问题描述中的链接所示

尝试以下操作:删除global语句,使目标函数如下所示

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
这样,此时x[2]的sumIp和sumIm值将在每个目标调用中本地创建,而不是全局编辑。您可能希望重命名局部变量,以避免混淆

然后,最小化完成后,将更改推送到最终的最佳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值,如果您删除它们,那么最小化者所能做的就更少了

关于一般的奇怪之处,这可能与约束使用if语句这一事实有关,这基本上使它们成为分段函数。虽然有处理非线性约束的最小化方法,但我不确定是否有处理不可微约束的方法

要解决这个问题,请参阅我在中所做的更改。我用两个严格非负变量x[2]和x[3]替换了x[2],其中旧值现在是x[2]-x[3]。这样就不需要在目标中使用if语句。为了使变量非负,我用x_边界为问题添加了边界条件。注意,这样就不需要constraint1函数,所以我删除了它。代码中还有更多的空间进行其他简化,但由于没有必要,我将其他所有内容都放在一边

所以我唯一不太明白的是约束2:你能再解释一下它应该做什么吗?

Summary 好吧,那么。我将为你总结一下你的问题,但主要是为了帮助我:p

您有一系列要计算的值,这些值都围绕着计算Qt[i]展开。这些是:

d[i]-在真实场景中外部提供的一些值列表,但出于您的目的,使用随机值模拟这些值;最重要的是,这不是必须计算的事情。另一个注意事项:我假设我们不能预见未来并使用d[I+1]或类似的东西。 It[i]-由It[i]=It[i-1]-d[i]+Qt[i-LT]给出,其中Qt部分因i 解决方案
…还不太确定:\r抱歉

我需要更多的信息。根据我的理解,最小化函数计算使x的某些表达式最小化的完美x数组。你想最小化什么表达式?我试图最小化h*sumIp+b*sumIm刚刚注意到我的代码中有一个错误,正在编写h*sumIm*b*sumIm,编辑了帖子和完整的代码,其中sumIp和sumIm基于我的It[I],在本例中是指我的x[2]。当它[i]>0时,该值被添加到sumIp,当它[i]<0时,其对称值-It[i]被添加到sumIm,两者都必须为正,因为这个h*sumIp+b*sumIm表达式是一个代价。如果我正确理解最小化函数的工作原理,目标将运行多次,对吗?所以这是一个大问题,因为它会多次将x[2]加到我的总和中,即使我只希望每个I发生一次。我不知道如何阻止这种情况发生。是的,我想说的是,你不应该编辑目标函数中的值,因为它将在minmize函数中运行任意次数。如果您希望该逻辑在每次迭代中运行一次,请移动
它超出了目标,并放在最小化调用之前。否则,最小化位在我看来没问题。如果你这么做了,它仍然不起作用,请更新你在粘贴箱上的代码,我会再做一次look@Sergio如果这不是你想要的,请告诉我谢谢。我认为这基本上等同于我在我的最新代码中所做的,我粘贴在我的最后一条评论中,并用相似的结果对这两个代码进行了测试。它比我以前的工作得更好,但仍然得到一些奇怪的值,即我的Qt x[0]有时会变得狂暴,这会导致其他一切也变得狂暴。同样在pastebin代码的第58行中,我希望使用Qt[I-1]而不是x[0],但是当我这样做时,x[0]停止优化,我的Q[t]总是0,这导致根本没有优化,你知道为什么吗?这个目标有效吗h*x[2]-b*x[3]?因为它是一个成本,其中h是我的库存持有成本,b是我的延期订单成本,我不应该得到负值,如果x[3]已经>=0,它不应该是一个总和吗?至于constraint2,它的意思是将我的净库存定义为NIt[i]=NIt[i-1]-d[i-1]+Qt[i-1],因此我想在这里用Qt[i-1]替换x[0]。如果对这个问题有更详细的解释会有所帮助,我在这里写了一篇文章:当我试图在Python论坛上获得帮助时——显然,如果你不想看,你不必阅读,如果我要求的太多,我向你道歉,但是如果你这样做了,你能看到我试图做的是否有意义吗?里面的代码已经过时了,请忽略。哦,我忘了提到constraint2,试着让它在NIt低于s时,我需要订购,但可能有更好的方法来使用它,嗯。。。是的,关于目标你可能是对的,这是我的错误,我将编辑我的答案以反映这一点。还有,你链接的问题描述非常有用,谢谢!其中提到了一个变量s,它是一个目标股票。那么,您是否会订购足够数量的产品以达到您的目标库存?像Qt[i]=s[i]-It[i]?我对dropbox文件做了评论。你说的有道理,也许这是一个简单的解决方案。目标库存相对于净库存,因此必须达到s的是NIt。例如,如果我的库存是1,每天的需求量是1,那么我应该有一个净库存-当前库存+订购库存2,这样第二天我就有1个单位来满足需求。不管怎样,这就是我的想法。这通常是人们试图订购商店商品的方式,阿飞;他们不知道需求会是什么样子,所以他们的订单只足以满足任何合理的需求激增,但如果没有人购买,他们也不会太讨厌自己。好吧,我会在有机会的时候尝试一下,如果有任何问题,我会回复你。非常感谢你的帮助,我真的很感激。现在看来有道理了,非常感谢你,你是个救命恩人!:看起来我无缘无故地把它复杂化了。这是我现在的代码,如果你好奇:-下一步将是使需求遵循正态分布,而不是随机分布,并添加一些绘图,以便我可以有一个它的图形视图。如果我在这方面有困难,希望不是:p,并最终在这里创建了一个问题,我是否可以在评论中标记你?再次感谢你耐心地帮助我。