如何正确设置scipy.optimize公司带约束和多重最优的最小化?

2024-06-07 09:00:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python非常陌生,在使用scipy.optimize公司. 我举了一个简单的例子来说明我想做什么。我的目标是确定最低采购量的项目,也最小化库存。在

我购买的所有东西都被分成两个产品——25%进入产品A,75%进入产品B。一个产品A的单位尺寸为100,而产品B的单位尺寸为300。我还有一个最低购买量100,最高购买量2000。在

下面的代码是我的目标函数的设置。在

import math
from scipy.optimize import minimize

unitsize =  [100, 300]
proportion = [0.25, 0.75]
minpurchase = 100
maxpurchase = 2000

def stock (purchase):
    test = []
    for i in xrange(len(unitsize)):    
        product_purchase = purchase * proportion[i]
        units = math.floor(product_purchase / unitsize[i])
        y = product_purchase - (units * unitsize[i])
        test.append(y)
        z = sum(test)
    return z

我已经测试了stock函数,它似乎可以正常工作。例如,当我调用stock(500)、stock(400)和stock(300)时,它分别正确地返回100、0和300。在

然后,我试着按照下面的方法来实现最小化,并根据最小和最大购买量进行限制。在

然而,当我以一个最初的猜测为零开始,它返回的结果是100,我认为这是一个错误的结果,因为它将导致100个股票和没有完整的单位。我希望结果是400(库存为零)。同样的问题也会发生,例如,从最初的猜测100开始。在

^{pr2}$

当我开始猜测500时,返回的结果是正确的400。然而,当我从1900开始时,它也会返回1600作为结果,因为那时股票也是零。在

几个问题:

  1. 有没有办法让它在初始猜测为0的情况下工作?在
  2. 在本例中,解决方案空间(400800120016002000)中有多个optima。有没有可能设置优化,这样它将找到最优值的整个向量,然后返回最低的项(即400)?在

在试图解决问题2时,我考虑过将一个testvalues数组传递给下面的初始猜测,但它返回“IndexError:too many index for array”。在

你知道我做错什么了吗?在

testvalues = [1000,2000]

for j in range(len(testvalues)):
    print minimize(lambda x: stock(x[0]), testvalues[j],
                       method='COBYLA',
                       constraints = cons,
                       options={'maxiter':10000})

[...]
IndexError: too many indices for array

任何帮助和建议非常感谢,我一直在努力让这个工作一整天。在


Tags: test目标for产品尺寸stock库存单位

热门问题