使用具有约束和界限的SciPy最小化函数

问题描述 投票:-1回答:1

我有一系列收取利率的帐户,每天我必须决定从哪个帐户借钱。我对每个帐户都有借款限额。显然,最简单的答案是先用尽最便宜的价格,依此类推。]

由于我们必须每天计算几次,因此帐户数量会有所不同,我们计划前滚现金流,我试图编写一些Python代码以使其自动化。

最小化的目标函数是加权平均利率,确定要从每个帐户借入的钱(x),从0到整数(取决于每个协议),以覆盖未清偿额。

下面的代码似乎运行良好,但是我在一张纸上做了数学运算,但未达到全局最小值。有什么我想念的吗?

import numpy as np
from scipy.optimize import minimize

outstanding = -106332403


limit = [15000000, 29250000, 15000000, 22000000, 52567324, 5000000, 5000000, 40000000, 7398262]
interest = [0.73, 0.63, 0.78, 0.75, 0.6084, 0.97, 0.84, 0.625, 0.40]

limit = np.asarray(limit)
interest = np.asarray(interest)

def objective(x):
    product = x * interest
    sumproduct = sum(product)
    return sumproduct / -outstanding

def constraint1(x):
    return sum(x) + outstanding

# initial guesses
n = len(interest)
x0 = [1,1,1,1,1,1,1,1,1]

bnds = []

for value in limit:
    b= (0,value)
    bnds.append(b)


con1 = {'type': 'eq', 'fun': constraint1}
cons = (con1)

solution = minimize(objective,x0,method='SLSQP',bounds=bnds,constraints=cons)

x = solution.x

我有一系列收取利率的帐户,我每天必须决定从哪个帐户借钱。我对每个帐户都有借款限额。显然,最简单的答案是用尽...

python optimization scipy minimize
1个回答
0
投票

我对您的脚本进行了一些更改。最重要的是设置一个更大的最大迭代,并在有限差分步长和收敛容限上发挥作用。我还重写了您的目标,以改变数量级。通过这种方式,我得到的解决方案接近您在评论中提供的值。

© www.soinside.com 2019 - 2024. All rights reserved.