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

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

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

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

受付中

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

Na_ma6565
Na_ma6565

総合スコア2

Python

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

1回答

0評価

0クリップ

151閲覧

投稿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)

試したこと

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python

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