python - 如何正确设置带有约束和多个最优值的 scipy.optimize 最小化?

标签 python optimization scipy constraints minimization

我对 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(500)、stock(400) 和 stock(300) 时,它分别正确返回 100、0 和 300。

然后我尝试按照以下方式实现最小化,并基于最小和最大购买金额进行限制。

但是,当我以零的初始猜测开始时,它返回的结果为 100,我认为这是一个错误的结果,因为它将导致 100 个库存并且没有完整的单位。我期待例如结果为 400(库存为零)。当我例如时会发生同样的问题从初始猜测 100 开始。

cons = ({'type': 'ineq', 'fun': lambda x:  x[0] - minpurchase},
        {'type': 'ineq', 'fun': lambda x:  x[0] + maxpurchase}
        )


print minimize(lambda x: stock(x[0]), [0],
                   method='COBYLA',
                   constraints = cons,
                   options={'maxiter':10000})
  status: 1
    nfev: 106
   maxcv: -0.0
 success: True
     fun: 100.0
       x: array([ 100.])
 message: 'Optimization terminated successfully.'

当我从 500 开始猜测时,返回的结果是正确的 400。但是,当我例如从 1900 开始,它也会返回 1600 作为结果,因为此时库存也为零。

几个问题:

  1. 有没有办法让它在初始猜测为 0 的情况下工作?
  2. 在此示例中,解空间中有多个最优值(400、800、1200、1600、2000)。是否可以设置优化,使其找到整个最优向量,然后返回最低的项(即 400)?

在尝试解决问题 2 时,我考虑过将测试值数组传递到初始猜测中,如下所示,但它返回“IndexError:数组索引太多”。

知道我在这里做错了什么吗?

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

非常感谢任何帮助和指示,我一整天都在努力让它发挥作用。

最佳答案

出现此错误是因为 COBYLA 方法不处理边界。只有 BFGS、L-BFGS-B 和 SLSQP 方法可以。看: documentation link

关于python - 如何正确设置带有约束和多个最优值的 scipy.optimize 最小化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36665225/

相关文章:

python - Armadillo /MKL/其他? C++ 中的插值相当于 Scipy 插值

ios - WatchKit 如何处理图像?

sql-server - 优化性能不佳的查询需要采取哪些步骤?

python - 如何从一个 URL 下载多张图片

其他语言中的 Python 描述符协议(protocol)模拟?

c++ - libc++中短字符串优化的机制是什么?

python - 将行和列的总和附加到矩阵

python - scipy.signal.spectrogram 频率分辨率

python - Django 无法分割 View

python - 使用 conda env 的 apache-airflow systemd 文件