-1

都市間の最短経路を見つけるための Astar プログラムのコードを Python で記述します。上記のエラーが発生し、完全に途方に暮れています。いくつかの .py ファイルの間を引っ張ると、関連するセクションは次のとおりです。

asdriver.py から -完全な asdriver を追加

import adata   # Map data
import astar   # A* class
import sys

# Default start, goal cities
defaultcities = ('Yakima, WA', 'Tampa, FL')

def printnode(n):
    print n.toString()

adata.input()

startcity = raw_input("Start city [{0}]: ".format(defaultcities[0])).strip()
if startcity == '':  startcity = defaultcities[0]
if startcity not in adata.cities:
     print "City not recognized"
     sys.exit(0)

goalcity = raw_input("Goal city [{0}]: ".format(defaultcities[1])).strip()
if goalcity == '':  goalcity = defaultcities[1] 
if goalcity not in adata.cities:
    print "City not recognized"
    sys.exit(0)

dbg = raw_input("Debug Options: [none]").strip()

findpath = astar.AS(startcity, goalcity, printnode)
ans = findpath.astar_run(printnode, dbg)
    if not ans:
        print "No answer"
    else:
        print "Final Path:"
        print ans.toString()

astar.py より

 import adata

 class AS:
     def __init__(self, startcity, goalcity, tracefunc):
        self.startcity = startcity
        self.goalcity = goalcity
        self.tracefunc = tracefunc
        self.openlist = [Node([startcity])]
        self.closedlist = []

     def heuristic(self, printnode, start, end):
        raise NotImplementedError

     def astar_run(self, startcity, endcity, dbg = ""):
        while self.openlist:
            citystep = min(self.openlist, key = lambda o:o.g + o.h)
            if citystep == self.goalcity:
                 path = []
                 while citystep.parent:
                path.append(citystep)
                citystep = citystep.parent
            path.append(citystep)
            return path[::-1]
        self.openlist.remove(citystep)
        self.closedlist.append(citystep)
        for printnode in self.openlist:   #was self.tracefunc
            if printnode in self.closedset:
                continue
            elif printnode in self.openset:
                newG = citystep.g + citystep.cost(printnode)
                if printnode.g > newG:
                    printnode.g = newG
                    printnode.parent = citystep
                else:
                    printnode.g = citystep.g + citystep.cost(printnode)
                    printnode.h = self.heuristic(printnode, start, end)
                    printnode.parent = citystep
                    self.openset.add(printnode)
        return self    



class Node:
def __init__(self, path=[], f=0, g=0, h=0):
    self.path = path[:]
    self.f = f
    self.g = g
    self.h = h
    self.parent = None

def toString(self):
    s = 'f=%d g=%d h=%d ' % (self.f, self.g, self.h)
    for city in self.path:
        s = s + ' ' + city
    return s

def cost(self):
    raise NotImplementedError

'

完全な初心者なので、どんな助けでも大歓迎です。

前もって感謝します!!!

4

1 に答える 1

0

メソッドdef astar_run()が返さselfれるか (メソッドの最後の行を参照)、または をスライスしてリストを返しますpath[::-1]。どちらにもtoString()メソッドがないため、この例外が発生しています。クラスの表現を出力したい場合は、このメソッドを宣言するのが普通__repr__()ですprint ans。文字列に変換できるようにする場合は、通常、メソッドが呼び出され__str__()ます。

から何を返すと思いますastar_run()か? 通常、同じ関数から 2 つの異なる型を返すことはお勧めできません。

于 2013-09-16T02:08:01.730 に答える