2016-09-16 2 views
0

Итак, я пытаюсь реализовать алгоритм поиска bisection в Python, который возвращает «оптимальную» сберегательную ставку.Python Bisect Search- abs(), вызывающий сбой

Я пробовал создавать несколько различных функций, и я не понимаю, почему программа попадает в бесконечный цикл. Я знаю, что abs (current_savings - down_payment) является причиной рекурсивного бесконечного цикла, но я не знаю почему.

Первые вещи во-первых, это не объясняет, почему моя программа не работает, но здесь идет:

В конце каждого месяца я зарабатываю проценты на текущих сбережений, который применяется первым, и затем я получаю свою месячную зарплату, которая составляет всего 1/12 моей годовой зарплаты.

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

Моя первая функция просто проверяет, достаточно ли высокая зарплата для того, чтобы сохранить первоначальный взнос в размере 250K. Если их зарплата недостаточно высока, она печатает, что она недостаточна и возвращает False.

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

Вот код:

#Givens 
annual_salary = 150000 
initial_salary = annual_salary 
interest_rate = float(0.04/12.0) 
down_payment = float(250000.0) 
semi_annual_raise = 0.07 

#Bisect-search 
low = float(0.0) 
high = float(10000.0) 
portion_saved = float((low+high)/2) 
current_savings = 0 
months = 0 
steps = 0 

def isPossible(annual_salary): 
    count = 0 
    current_savings = 0 
    while count < 36: 
     current_savings += (current_savings*interest_rate) + (annual_salary/12) 
     count += 1 
     if count % 6 == 0: 
      annual_salary += (annual_salary*semi_annual_raise) 
    if current_savings < down_payment: 
     print("It is not possible to pay the down payment in three years.") 
     return False 
    else: 
     return True 


def bisearch(initial_salary,interest_rate,down_payment,semi_annual_raise,low,high,portion_saved,steps): 
    current_savings = 0 
    months = 0 
    while abs(current_savings - down_payment) > 100.0: 
     months = 0 
     current_savings = 0 
     while months < 36: 
      current_savings = current_savings + (initial_salary*interest_rate) 
      current_savings = current_savings + (initial_salary/12*portion_saved/10000.0) 
      months += 1 
      if months % 6 == 0: 
       initial_salary += (initial_salary*semi_annual_raise) 
     steps += 1 
     if current_savings > down_payment: 
      high = portion_saved 
     else: 
      low = portion_saved 
     portion_saved = ((low+high)/2.0) 
    print("Best saving rate: ", (portion_saved/10000.0)) 
    print("Steps in bisection search: ", steps) 




if isPossible(annual_salary) == True: 
    bisearch(initial_salary,interest_rate,down_payment,semi_annual_raise,low,high,portion_saved,steps) 

И Тестовые:

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

Test Case 1

Enter the starting salary: 150000 

Best savings rate: 0.4411 

Steps in bisection search: 12 

Контрольный пример 2

Enter the starting salary: 300000 

Best savings rate: 0.2206 

Steps in bisection search: 9 

Если кто-то может мне помочь, я бы очень признателен, был на этом в течение нескольких часов, пытаясь придумать исправить.

ответ

0

Я был в замешательстве в той же проблеме и, наконец, нашел решение. Попробуйте перезагрузить initial_salary обратно в year_salary внутри первого цикла while в вашей функции bisection, иначе это будет постоянно увеличиваться каждый раз, когда вы набираете шесть месяцев во внутреннем цикле. Это работает?

Смежные вопросы