2015-10-15 5 views
2

это файл python, пытающийся сделать алгоритм A *, но не могу заставить его работать, мне нужна помощь, его классный код, его запуск в последнем python версия для оконОшибка: объект() не принимает параметров, не может решить его

from queue import PriorityQueue 
    class State(object): 
     def _init_(self,value,parent,start = 0,goal = 0): 
      self.children = [] 
      self.value = value 
      self.parent = parent 
      self.dist = 0 
      if parent: 
       self.path = parent.path[:] 
       self.path.append(value) 
       self.start = parent.start 
       self.goal = parent.goal 
      else: 
       self.path = [value] 
       self.start = start 
       self.goal = goal 


     def GetDist(self): 
      pass 

     def CreateChildren(self): 
      pass 


    class State_String(State): 
     def _init_(self,value,parent,start = 0,goal = 0): 
      super(State_String,self).__init__(value,parent,start,goal) 
      self.dist = self.GetDist() 
     def GetDist(self): 
      if self.value == self.goal: 
       return 0 
      dist = 0 
      for i in range(len(self.goal)): 
       letter = self.goal[i] 
       dist += abs(i - self.value.index(letter)) 
      return dist 

     def CreateChildren(self): 
      if not self.children: 
       for i in xrange(len(self.goal)-1): 
        val = self.value 
        val = val[:i] + val[i+1] + val[i] + val[i+2:] 
        child = State_String(val,self) 
        self.children.append(child) 


    class AStar_Solver: 
     def _init_(self,start,goal): 
      self.path = [] 
      self.visitedQueue = [] 
      self.priorityQueue = PriorityQueue() 
      self.start = start 
      self.goal = goal 

     def Solve(self): 
      startState = State_String(self.start,0,self.start,self.goal) 
      count = 0 
      self.priorityQueue.put((0,count,startState)) 
      while(not self.path and self.priorityQueue.qsize()): 
       closestChild = self.priorityQueue.get()[2] 
       closestChild.CreateChildren() 
       self.visitedQueue.append(closestChild.value) 
       for child in closestChild.children: 
        if child.value not in self.visitedQueue: 
         count +=1 
         if not child.dist: 
          self.path = child.path 
          break 
         self.priorityQueue.put((child.dist,count,child)) 

      if not self.path: 
       print "Goal of " + self.goal + " is not possible!" 
      return self.path 

    if _name_ == '__main__': 
     start1 = "hma" 
     goal1 = "ham" 
     a = AStar_Solver(start1,goal1) 
     a.Solve() 
     for i in xrange(len(a.path)): 
      print " %d)" %i + a.path[i] 

getting these errors: 

    Traceback (most recent call last): 
     File "C:/Users/Herby/Desktop/untitled/Astar.py", line 82, in <module> 
     a.Solve() 
     File "C:/Users/Herby/Desktop/untitled/Astar.py", line 59, in Solve 
     startState = State_String(self.start,0,self.start,self.goal) 
    TypeError: object() takes no parameters 

мне нужно знать, как это может быть исправлено

+1

Вам нужно два символа подчеркивания до и после метода init, например: '__init__'. – metatoaster

ответ

1

всех ваших init в классах написаны с одним подчеркиванием вместо двойного подчеркивания:

Изменить все INIT записывается в виде: _init_ - __init__

Кроме того, эта линия неправильна, а также:

if _name_ == '__main__': 

Она должна быть двойным подчеркиванием для имени, а

if __name__ == '__main__': 

Если вы заинтересованы, здесь больше информации о том, почему это необходимо:

https://www.python.org/dev/peps/pep-0008/

В particula r посмотреть описание для: "double_leading_and_trailing_underscore"

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