Как использовать определенную функцию в качестве целевой функции в PULP - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь решить проблему с ЛП, которая заключается в том, чтобы найти оптимальное распределение денег для быстрого погашения нескольких долгов.

Прежде всего я определил функцию, чтобы определить, сколько времени потребуется для погашения долга.

'''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

Как вы можете видеть, номер переменной решения фиксирован для примера выше, но, поскольку я хочу, чтобы он был гибким, я чувствую, что у меня естьзациклить, но я не могу понять, как.

Спасибо за вашу помощь. Пожалуйста, дайте мне знать, если какой-либо пункт не ясен.

...