私は、プログラムanimal.pyによって得られた知識を保存および取得する方法を追加しようとしています。これは、二分決定木を介して機能する「20 の質問」学習アルゴリズムです。(リンクをクリックすると元のプログラムが表示されます)
元のプログラムに、各ノードに状態「up」を追加して、決定ツリー内のノードの親を指すようにしました。これにより、ツリーを上下に移動しやすくなりました。また、正規表現を使用して英数字以外のすべてのユーザー入力をスペースに変更したため、ユーザーは次の 2 つの新しい関数を混同できません。
def know(know):
#Load preset knowledge
p=node("")
knowledge=p
for char in know:
if char not in "+-":p.question+=char
if char=="+":
p.right=node("")
p.right.up=p
p.left=node("")
p.left.up=p
p=p.right
if char=="-": p=p.up.left
return knowledge
def output(node,accum=""):
#Output all knowledge
accum=accum+node.question
if node.right!= None : accum=output(node.right,accum+"+")
if node.left!= None : accum=output(node.left,accum+"-")
return accum
関数 "output" は、渡されたノードの下にある完全なツリーを単一の文字列として返すように設計されており、"+" と "-" の文字は、文字列がどのノードに続いているかを示します。関数 "know" は、"output" によって以前に作成された文字列を取得し、二分決定木を作成して、トップ ノードへのポインターを返すことになっています。これは、私が理解できないほどうまく機能していない部分です。(現在、初期知識文字列をプログラムソースに直接入力しています。ファイルのロードと保存は後で追加され、簡単な作業のようです)
例: output(know('mineral+crystal+quartz-obsidian-nothing')) 戻り値: 'mineral+crystal+quartz-obsidiannothing-'
元の文字列を返す必要があります: 'mineral+crystal+quartz-obsidian-nothing'
これは (理論的には) うまくいくと確信していますが、壁にぶち当たり、なぜうまくいかないのか本当に迷っています。
私の考えは間違っていますか、それとも単に実装しようとしているのでしょうか? 元のプログラムから作成された決定木を保存するより良い方法はありますか?
私は熱心な読者ですが、stackoverflow への投稿は初めてで、このサイトの才能に畏敬の念を抱いているので、あなたのアイデアをとても楽しみにしています。