2014-12-22 3 views
0

У меня проблема с 2 кувшинами. начальное состояние [0,0], емкость каждого кувшина равна [4,9], состояние цели [0,6] правовые движения: заполнять кувшин 1 или кувшин 2 до конца, пустой кувшин 1 или кувшин 2 и бедный один кувшин в другой.Рекурсия Python, что мне не хватает

import search #get the interface 
import sys 
sys.setrecursionlimit(5000) 
class two_jugs(search.Nodes): 

    #return the starting state vessel 1: 0, vessel 2: 0 
    def start(self): 
      return [0,0] 

    #returns true if node is equal to goal node 
    def goal(self,node): 
      return node ==(0,6) 
    #yields the successors of the configuration indicated by node 
    def succ(self,node):    
      # set capacities for vessel 1: 4, vessel 2 : 9 
      c = [4,9]; 
      #stop at second last 
      for i in range(len(node)-1): 
        #create a safety copy 
        new_node = node[:] 

        #fill vessel 1 
        if new_node[i]<=0: 
          new_node[i]=c[i] 
          print new_node 

        #fill vessel 2 
        if new_node[i+1]<=0: 
          new_node[i+1]=c[i+1] 
          print new_node 

        #dump vessel i+1 
        if (new_node[i+1]>0): 
          new_node[i+1]=0 
          print new_node 

        #poor vessel i to vessel i+1     
        if (new_node[i+1]<c[i+1] and new_node[i]>0): 
          #calculate the difference 
          d = min(new_node[i],c[i+1]-new_node[i+1]) 
          new_node[i]= new_node[i]-d 
          new_node[i+1]= new_node[i+1]+d 
          print new_node 

        #dump vessel i 
        if (new_node[i]>0): 
          new_node[i]=0 
          print new_node 


       #poor vessel i+1 to vessel 1 
        if (new_node[i]<c[i] and new_node[i+1]>0): 
          #calculate the difference 
          d = min(new_node[i+1],c[i]-new_node[i]) 
          #set new node 
          new_node[i+1]= new_node[i+1]-d 
          new_node[i]= new_node[i]+d 
          yield new_node 
          print new_node 

Вопрос в том, что я объявил все юридические шаги, почему моя программа возвращает только результат одного юридического хода? Например, из начального состояния [0,0], когда я запускаю программу, он возвращает [4,0], [0,4], [0,9] и другие возможные результаты до тех пор, пока рекурсия не прекратится, но не станет моей целью. Что мне не хватает?

breadth_first_search класс:

def breadth_first_search(problem, candidates): 
    if not candidates: return 
    # make sure there is something in the candidate list 
    # I am modifying ’candidates’ list here. 
    # Why don’t I need to copy? 
    c = candidates.pop(0) # pop from front 
    node = c[-1] # must exist 
    if problem.goal(node): return c 
    # base case 
    succ = [s for s in problem.succ(node)] 
    for s in problem.succ(node): 
     candidates.append(c + [s]) 
     # 1-step extension 
    return breadth_first_search(problem, candidates) 

поиск Класс:

class Nodes: 
    def succ(self,n): 
     raise Exception, "Successor undefined" 
    def start (self): 
     raise Exception, "Start undefined" 
    def goal (self,n): 
     raise Exception, "Goal undefined" 

класс, который запускает программу:

import decant 
from breadth_first_search import * 

dec = decant.Decant() 
print breadth_first_search(dec,[[dec.start()]]) 
+4

Где находится рекурсия? – Barmar

+0

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

+0

Сначала я запускаю программу, запустив последний бит кода, который я разместил. Затем программа импортирует класс breadth_first_search, а затем печатает результаты этого класса. Основная проблема заключается в классе two_jugs. Все остальное верно. – spyr

ответ

0

Ваша первая ошибка маркировки класса 2jugs. Имена переменных в python (включая имена классов и функций), а также многие другие языки программирования не могут начинаться с цифр. Поэтому переименуйте 2jugs в two_jugs.

precise rule for identifiers in python идентификатор должен начинаться с верхним регистром (A-Z), в нижнем регистре (a-z) или подчеркивание (_). Следующие символы идентификатора могут также содержать цифры (0-9). (Правило указано в Backus-Naur form).

+0

Приношу свои извинения и благодарю вас за это. Кстати, спасибо за редактирование моего вопроса. теперь это выглядит как профессиональная проблема. Любая помощь оценивается. С Рождеством – spyr

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