Я пытаюсь решить проблему с ЛП, которая заключается в том, чтобы найти оптимальное распределение денег для быстрого погашения нескольких долгов.
Прежде всего я определил функцию, чтобы определить, сколько времени потребуется для погашения долга.
'''payment must exceeds the accrued interest each month
accrued interest = PV * (1+i) '''
def how_long(PV, APR, PMT):
i = (APR/12)/100
accrued_interest = PV * i
try:
N = round(-(log(1-((PV*i)/PMT)))/log(1+i))
return N
except:
print(f"Your payment must be greater than accrued_interest which is {'%.2f' % accrued_interest}.")
Далее я создал пример данных и констант:
My_Loans = {
'Name' : ['BOA', 'Sapire','Southwest','SallieMae'],
'Principal' : [350.59, 1672.04, 597.32, 766.63],
'APR' : [6, 4, 4, 5]
}
My_Loans = pd.DataFrame(My_Loans)
# Constants
# Create a list of the food items
loan_items = list(My_Loans['Name'])
# Principals
PV = My_Loans['Principal']
# APR
APR = My_Loans['APR']
# Maximum PMT ----- This will be an input
Max_PMT = 2000
Затем я создал LpProblem:
problem = LpProblem("Loan Repayment", LpMinimize)
Кроме того, вот переменная решения и ограничения.
# Decision Variable --- PMT
num_loans = len(My_Loans)
loan_items
PMT = LpVariable.dicts("PMT", list(range(num_loans)), 0, Max_PMT, cat="Continuous")
# Goal Constraint
c1 = sum(PMT) == Max_PMT
# adding the constraints to the problem
problem += c1
Мой главный вопрос, как я могу использовать "how_long "функция для целевой функции?
Я хочу найти PMT (переменную решения), которые дают мне минимальную" сумму N "из функции" how_long ".
Вотпример целевой функции, которую я скопировал из блога:
# objective function
problem += -factory_days[0]*cf0*f0 - factory_days[1]*cf1*f1 - factory_days[2]*cf2*f2
Как вы можете видеть, номер переменной решения фиксирован для примера выше, но, поскольку я хочу, чтобы он был гибким, я чувствую, что у меня естьзациклить, но я не могу понять, как.
Спасибо за вашу помощь. Пожалуйста, дайте мне знать, если какой-либо пункт не ясен.