#coding:UTF-8 # コストを考慮しない探索1 # 幅優先探査億(width_first_search) import sys import brute_force_search as bfs import width_first_search as wfs # 探索の手順 # 1.状態空間とオープンリスト、クローズドリストを初期化する st = bfs.StateSpace() openlist = wfs.OpenList() closedlist = bfs.ClosedList() step = 0 # オープンリストとクローズとリストの表示(各自作成) print("step"+" "+str(step)) print("Open list:"+openlist.view()) print("Closed list:"+closedlist.view()) # 2.探索が失敗するか、ゴールノードを発見するまで探索を続ける while (True): # 3.オープンリストが空である場合は探索失敗で終了する # プログラムの実行はsys.exit()で行う if openlist.is_empty(): sys.exit("探索失敗") # 4.オープンリストの先頭のノードを取得する else: fnode = openlist.get_first() # 5.先頭のノードがゴールノードであれば探索成功で終了する if fnode.is_goal(): step += 1 print() print("step"+" "+str(step)) print("Current node:"+str(fnode.elements())) print("---探索成功---") sp=fnode.searched_path(closedlist) strsp=fnode.view_searched_path(sp) print("探索順序:"+strsp) sys.exit() # 6.先頭のノードがゴールノードでない場合、次のノードを展開し # オープンリストの末尾に追加する else: nnode = fnode.expand(st) openlist.add_node_list(nnode,closedlist) # 7.先頭のノードは探索済みとしてクローズドリストに追加する closedlist.add(fnode) # 5.からのif_else終了 # 3.からのif_else終了 step += 1 print() print("step"+" "+str(step)) print("Current node:"+str(fnode.elements())) print("Open list:"+openlist.view()) print("Closed list:"+closedlist.view()) # whileループ終了
#coding:UTF-8 # コストを考慮しない探索(Brute_force_search) # 幅優先探索(Width_first_search)と深さ優先探索(Depth_first_search)での # ノード、クローズドリスト、状態空間を本ファイルで定義する # ルートノードのIDは0 ROOT_NODE = 0 # ルートノードの親ノード(存在しない)のIDは便宜上-1とする ROOT_PARENT = -1 # 便宜上、ノードIDが1000以上のノードはゴールノードとみなす GOAL_THRESHOLD = 1000 # ノード(Node)の定義 class Node: # ノード番号idと親ノード番号parentのノードを作成する def __init__(self, id, parent): self.__id = id self.__parent = parent # __init__終了 # ノードのidを返すインスタンスメソッド def id(self): return(self.__id) # id 終了 # ノードの親ノードのidを返すインスタンスメソッド def parent(self): return(self.__parent) # parent 終了 # ノードの内容を返すインスタンスメソッド def elements(self): return((self.id(),self.parent())) # elements 終了 # ノードの内容を文字列で返すインスタンスメソッド(各自作成) def view(self): nd = str(self.elements()) return(nd) # view 終了 # ノードがゴールノードかを判定するインスタンスメソッド(各自作成) def is_goal(self): if self.id() >= GOAL_THRESHOLD: return True # ゴールノードであるときはTrueを返す else: return False # ゴールノードでないときはFalseを返す # is_goal 終了 # 状態空間stを用いて、ノードから到達できる次のノードのリストを得る # インスタンスメソッド(各自作成) def expand(self, st): # 次のノードのidのリストを初期化 next = [] next_ids = st.next(self.id()) # 次のノードを作成しnextに追加(各自作成) for nid in next_ids: # ノードidがnid、親ノードidがself.id()のノードを作成 addNode = Node(nid,self.id()) next.append(addNode) return(next) # expand 終了 # クローズドリストclを用いて、ルートノードから現在のノードに至る # 探索されたパスを得るインスタンスメソッド def searched_path(self, cl): searched = self sp = [searched] # selfは探索されたパスの最後のノード # クローズドリストclを逆順にする cl.elements().reverse() # clに後から追加されたノードから調べる for node in cl.elements(): # searchedノードの親ノードがnodeノードであれば if node.id() == searched.parent(): # nodeは探索されたパスに出現する sp.append(node) # nodeが次のsearchedになる searched = node # 調査が終了したら、spを逆順にしてルートから始まるようにする sp.reverse() cl.elements().reverse() return(sp) # searched_path 終了 # 探索されたパスの内容を文字列で返すインスタンスメソッド def view_searched_path(self, sp): strsp = "" idx = 0 for node in sp: if idx < len(sp)-1: strsp = strsp + node.view() + " -> " idx = idx + 1 else: strsp = strsp + node.view() return(strsp) # view_searched_path 終了 # ノードの定義 終了 # クローズドリストの定義 class ClosedList: # クローズドリストを空のリストで初期化 def __init__(self): self.__closed_list = [] # __init__ 終了 # クローズドリストの内容を返すインスタンスメソッド def elements(self): return(self.__closed_list) # elements 終了 # クローズドリストに探索済みノードnodeを追加 def add(self, node): self.__closed_list.append(node) # add 終了 # クローズドリストの内容を文字列で返すインスタンスメソッド(各自作成) def view(self): cl = "" idx = 0 for temp in self.__closed_list: if idx < len(self.__closed_list)-1: cl = cl + str(temp.elements()) + "," idx += 1 else: cl = cl + str(temp.elements()) idx += 1 cl = "[" + cl + "]" # クローズドリストの内容を表す文字列clを返す return(cl) # view 終了 # クローズドリストの定義 終了 # 状態空間の定義 class StateSpace: # 状態空間は有向グラフで表現する # 状態空間は(始節点.id,終節点.id)で表す辺のリストで定義 # 便宜上、id=0:ルートノード、id>=GOAL_THRESHOLD:ゴールノードとする def __init__(self): self.__state_space = [(ROOT_NODE,1),(ROOT_NODE,2),(1,2),(1,6), (2,3),(2,6),(2,7),(3,4),(3,7),(3,8), (4,8),(5,1),(6,5),(6,7),(7,8), (7,GOAL_THRESHOLD),(8,GOAL_THRESHOLD)] # __init__ 終了 # ノードidの次のノードidのリストを返す def next(self, id): next = [] # idから到達できるノードidを取得する(各自作成) def next(self, id): next = [] for i in self.__state_space: if i [0] == id: next.append(i[1]) return(next) # next 終了 # 状態空間の定義終了
前提・実現したいこと
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
前提・実現したいこと
横型探索を行うプログラムを書いていたのですが、以下のエラーメッセージが出てしまいました。
発生している問題・エラーメッセージ
step 0 Open list:[(0, -1)] Closed list:[] Traceback (most recent call last): File "C:\wfs.py", line 44, in <module> nnode = fnode.expand(st) File "C:\brute_force_search.py", line 66, in expand for nid in next_ids: TypeError: 'function' object is not iterable
該当のソースコード
def expand(self, st): # 次のノードのidのリストを初期化 next = [] next_ids = st.next(self.id()) # 次のノードを作成しnextに追加(各自作成) for nid in next_ids: # ノードidがnid、親ノードidがself.id()のノードを作成 addNode = Node(nid,self.id()) next.append(addNode) return(next) # expand 終了
else: nnode = fnode.expand(st) openlist.add_node_list(nnode,closedlist) # 7.先頭のノードは探索済みとしてクローズドリストに追加する closedlist.add(fnode)
試したこと
繰り返しのエラー出ている部分の文字を変えてみたりしたのですが、やっぱりエラーが出てしまい原因がわかりませんでした。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/19 04:17
2022/01/19 07:09 編集