Optimization 用KKT实现fmin_slsqp()求解非线性优化问题

Optimization 用KKT实现fmin_slsqp()求解非线性优化问题,optimization,scipy,nonlinear-optimization,inequality,Optimization,Scipy,Nonlinear Optimization,Inequality,我想解决一个非线性优化问题。我试图用KKT解决这个问题,但毕竟,我意识到编写代码来解决这个问题是很困难的 我想知道在我还清所有债务之前,最短还款期的最佳付款分配。以下是我的目标方程的函数-我的逻辑是获得每个债务的偿还期,并最小化总和: My_Loans = { 'Name' : ['A', 'B','C','D'], 'Principal' : [350, 2000, 600, 750], 'APR' : [6, 4, 4, 5]} My_Loans = pd.Dat

我想解决一个非线性优化问题。我试图用KKT解决这个问题,但毕竟,我意识到编写代码来解决这个问题是很困难的

我想知道在我还清所有债务之前,最短还款期的最佳付款分配。以下是我的目标方程的函数-我的逻辑是获得每个债务的偿还期,并最小化总和:

 My_Loans = {
    'Name' : ['A', 'B','C','D'],
    'Principal' : [350, 2000, 600, 750],
    'APR' : [6, 4, 4, 5]}

My_Loans = pd.DataFrame(My_Loans)
PV = My_Loans['Principal']
APR = My_Loans['APR']

def repayment_period(PV, APR, PMT):
    '''inputs are in lists format. PV is the principal amount, APR is Annual Percentage Rate, and PMT will be my variable which represents the monthly payment.'''

    num_loans = len(PV)
    times = []
   
    for j in range(num_loans):
        i = (APR[j]/12)/100
        accrued_interest = PV[j] * i
        N = round(-(log(1-((PV[j]*i)/PMT[j])))/log(1+i))
        times.append(N)
        total_period = sum(times)
        
    return total_period 
它有一个不等式约束,即PMT(变量)之和小于2000(每月分配之和必须小于2000)


但我不能让它工作。下一步我能试试什么?如有必要,我愿意采用更好的方法。

SLSQP可以直接解决带有约束的NLP。你为什么要用KKT公式?此外,SLSQP假定函数平滑,因此永远不要在函数中使用类似
round()
的东西。离散结构的非线性问题称为MINLPs,它们需要不同类型的解算器。我见过SLSQP用于投资组合管理,但实际上我没有研究过它。我将首先尝试学习SLSQP。谢谢:)我从来没见过。我只在与金融机构交谈时见过商业偿付人。
def ieq_constraint(x):
    return np.atleast_1d(np.sum(x)-2000)

from scipy import optimize as pf
op.fmin_slsqp(how_long, np.array([0]), ieqcons=[ieq_constraint])