質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

562閲覧

横型探索でのエラーについての質問

Na_ma6565

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/01/18 08:00

#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)

試したこと

繰り返しのエラー出ている部分の文字を変えてみたりしたのですが、やっぱりエラーが出てしまい原因がわかりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Python

1 # ノードidの次のノードidのリストを返す 2 def next(self, id): 3 next = [] 4 # idから到達できるノードidを取得する(各自作成) 5 def next(self, id): 6 next = [] 7 for i in self.__state_space: 8 if i [0] == id: 9 next.append(i[1]) 10 return(next)

においてreturn(next)は、リストではなくnextという名前のついた関数を返します
そのため提示エラーが発生しています。

投稿2022/01/18 08:40

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Na_ma6565

2022/01/19 04:17

nextではない違う関数を返して試みてみたのですが、変わらずエラーが出てしまいました。 この場合どう修正すればよいでしょうか。
can110

2022/01/19 07:09 編集

どのような修正をして、どのようなエラーが出るようになったのか具体的なことが不明なので何とも言えませんが、 提示ソースのコメントに書かれているように「ノードidのリストを返す」ように修正すればよいのではないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問