2011-12-15 4 views
0

Я пытаюсь закончить цикл while, если условие не выполняется.Завершение цикла while, если условие не встречается

Цель этого кода, чтобы получить максимальную отдачу от нескольких предметов, не превышая максимальные часы работы студента готов поставить в.

Я создал словарь под названием «субъекты», переводящий (значение, работа) со значением, насколько ценным является этот объект, и работать, как много работы необходимо для того, чтобы вставить этот предмет. Я добавляю значения предметов без перерыва в максимальных часах, которые студент готов вставить. Субъекты, которые имеют наибольший смысл, затем помещаются в другой словарь.

Вот код:

def greedyAdvisor(subjects, maxWork, comparator): 
""" 
Returns a dictionary mapping subject name to (value, work) which includes 
subjects selected by the algorithm, such that the total work of subjects in 
the dictionary is not greater than maxWork. The subjects are chosen using 
a greedy algorithm. The subjects dictionary should not be mutated. 

subjects: dictionary mapping subject name to (value, work) 
maxWork: int >= 0 
comparator: function taking two tuples and returning a bool 
returns: dictionary mapping subject name to (value, work) 
""" 

bestVal = {} 
tempVal = 0 
high = 0 
count = 0 
tempDict = {} 
tempWork = 0 
currentBest = None 
done = False 

while done == False: 

    for k in range(len(subjects)+1): 
     for i in subjects: 
      for j in subjects: 
       if i not in bestVal: 
        sub1 = subjects[i][0] 
        sub2 = subjects[j][0] 
        work1 = subjects[i][1] 
        work2 = subjects[j][1] 
        if tempWork >= maxWork: 
          print('tempWork is', tempWork)       
          print('bestVal is', bestVal) 
          print('high is', high) 
          print('tempVal is', tempVal) 
          print() 
          return 
        print('sub1 is', sub1) 
        print('sub2 is', sub2) 
        print('work1 is', work1) 
        print('work2 is', work2) 
        maxVal = comparator(sub1, sub2) 
        print('count is', count) 
        count += 1 
        if maxVal == True: 
         print('sub1+tempVal is', sub1+tempVal) 
         print('tempVal is', tempVal) 
         print() 
         if work1 + tempWork > tempWork and tempWork + work1 <= maxWork: 
           high += tempVal+sub1 
           tempWork += work1 
           tempVal = sub1 +tempVal 
           print('sub1', sub1) 
           print('work1 is', work1) 
           print('tempWork is', tempWork) 
           print('tempVal is', tempVal) 
           print('tempWork is', tempWork) 
           bestVal[i] = subjects[i] 
           print('bestVal is', bestVal) 
           print() 
         else: 
          break 

Цикла завершается, если maxWork соблюдено, которые у меня есть в коде уже. Проблема в том, что если maxWork не будет удовлетворен после прохождения всех предметов, он будет продолжать цикл навсегда. Мне нужно закончить цикл после того, как все элементы в словаре зациклились и условие не выполнено. Я предполагаю, что мне нужно выражение «if» здесь, но я просто не знаю, как его написать. «Если все испытуемые были протестированы и maxWork> tempWork: done = True»

Любая помощь очень ценится.

Благодаря

ответ

0

Вы можете просто установить done = True после всех петель.

done = False 

while not done: 
    # your bunch of loops code here 
    done = True 

Дальше. Вам действительно нужен цикл while? Я не могу полностью понять ваш код, поскольку его слишком много читать, но я вижу только for петель внутри while, и похоже, что другие вещи никогда не меняются.

+0

Вау, это именно то, что я искал. Благодарю. – CastorTroy

+0

Я знаю, что это беспорядок, я просто застрял на этом, и я должен был просто знать, как это сделать, даже если мне это не нужно. Я собираюсь вернуться и убрать его. Я ценю помощь. – CastorTroy

+0

извините, но это плохой патч. Цикл while абсолютно не нужен – joaquin

3

Добавление done = True после последнего for цикла должно быть достаточным, но у вашего кода есть другие проблемы.

Цикл while совершенно не нужен. Если вы его удалите, код должен работать по желанию.

У вас также есть три петли, основанные на количестве предметов, поэтому ваши итоговые итерации (с while) будут представлять собой количество предметов, кубированных. Это означает, что если у вас есть 100 предметов, самый внутренний раздел должен выполнить 1 миллион раз, если совпадение не найдено. Я действительно не вижу цели цикла «k». Кажется, вы ничего не делаете с этим значением, поэтому он просто не повторяет внутренние петли.

+0

ОК, понял. Я взял цикл while, и он также работал так же, как мне это нужно. Но я чувствую, что должен был пробовать это, и это не сработало. Я, наверное, что-то забыл. Но я действительно застрял на этом, в то время как петель. Я просто рад, что у меня есть ответ на это, это действительно подслушивало меня. Я собираюсь снова пройти его и убрать. Спасибо за помощь, я ценю это. – CastorTroy

+0

Хорошо, я вынул время и цикл «k», и он зацикливался только 248 раз по сравнению с 2300 раз. Гораздо эффективнее. Спасибо за помощь – CastorTroy

+0

@CastorTroy IMHO, этот ответ будет выбран как лучший – joaquin

1

Вы написали слишком много кода!

Возможно, вам захочется разделить работу вашего кода: сначала соберите объекты в порядке добра (возможно, используя функцию sorted, которая принимает параметр cmp), затем перейдите в отсортированный список, добавив их к переменной результата, останавливающейся, когда вы идти выше maxWork. У вас не будет проблемы с завершением, которую вы сейчас используете, потому что вы, естественно, остановитесь, как только закончите просматривать отсортированный список.

Часто нарушая то, что вы делаете, в логически раздельные биты (здесь, сначала сортируя, а затем агрегируя результат второй), вы получаете более простой и понятный код.

+0

Очень верно. Это было именно так, как я начал его, и по мере того, как я продвигался вперед, я не мог вернуться ... даже если это беспорядок. Спасибо за помощь. – CastorTroy

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