3

我开始将 scipy.optimize.minimize 用于一个工作项目,在该项目中,我尝试在给定每个商店的历史销售数据的情况下优化产品在商店之间的分配。

我从 Excel 表中获取约 300 家商店的数据并将其存储在 Store 类中。使用数据构建直方图并将正态分布拟合到直方图,并将拟合正态分布的均值和标准差保存在各自的 Store 对象中。(到目前为止,这部分没有问题)。

当我试图根据我在商店中分发产品的方式来最大化产品销售的总“概率”时,问题就出现了。

我的程序中还有更多内容,但这是相关部分(缺少的是从 excel 文件中获取数据,以及对每个商店进行正态分布的拟合):

import math, numpy
from scipy.optimize import minimize

unitsAvailable = 400

def distribution_objective(allocations):
    target = 0
    for i in range(len(stores)):
        target += normal(allocations[i], stores[i].mu, stores[i].std)

    return - target


def constraint1(allocations):

    return unitsAvailable - sum(allocations)

def constraint2(allocations):

    return min(allocations)

cons = [{'type':'eq', 'fun':constraint1}, {'type':'ineq', 'fun':constraint2}]
guess_allocs = []

for i in range(len(stores)):
    guess_allocs.append(unitsAvailable / len(stores))

distribution_solution = minimize(distribution_objective, guess_allocs, method='SLSQP', constraints=cons, options={'disp':True})

运行我的程序,我收到以下消息:

Iteration limit exceeded    (Exit mode 9)
            Current function value: -124.1033692190603
            Iterations: 101
            Function evaluations: 46808
            Gradient evaluations: 101

为什么会这样?

4

1 回答 1

2

优化器无法在默认的迭代次数内达到收敛。收敛容差和迭代次数都可以通过设置toloptions参数在方法调用中设置,有关详细信息,请参阅此处的文档

于 2019-07-24T09:31:37.347 回答