私はPythonで単純な遺伝的プログラミングユーティリティをコーディングしようとしています。しかし、今私は、私の木のクロスオーバー/メイト機能に悩まされています。木はネストされたリストにより構築され、このような何かを見ている:私はランダムに分割し、各ツリー内のポイントを選択したいと、私はそれぞれの木から一つの部分は、新しいツリーにまとめることにしたい2つの入れ子リストを分割し、2つの新しい入れ子リストを作成する方法
# f = internal node (a function), c = leaf node (a constant)
tree1 = [f, [f, [f, c, c], [f, c, c]], [f, [f, c, c], [f, c, c]]]
tree2 = [f, [f, [f, c, c], c], [f, [f, c, c], c]]
を。超過してはならない最大の深さもあります。そのため、ツリー内のどこかで選択が実際には起こり得ないため、ツリーが大きすぎる可能性があります。以下はその動作の一例です:
# f:n, where n is the number of arguments the function take
# + split here
tree1 = [f:2, [f:3, a, a, a], a]
# + split here
tree2 = [f:2, [f:2, a, a], [f:1, a]
tree_child1 = [f:2, [f:1, a], a]
tree_child2 = [f:2, [f:2, a, a], [f:3, a, a, a]]
私はこれを解決する方法について(現時点では)わかりません。あらゆるヒントや解決策が歓迎されています!
(それは誰かがより良い構造を理解するのに役立つかもしれないと私の解析機能を追加しました。)
# My recursive code to parse the tree.
def parse(self, node=None):
if not node:
node = self.root
if isinstance(node, list):
function = node[0]
res = []
for child in node[1:function.arity+1]:
res.append(self.parse(child))
value = function.parse(*res) # function
else:
value = node.parse() # constant
return value
ネストされたリストを使用する代わりに、ノードオブジェクトを使用してツリーの単純なデータ構造を作成すると、読みやすくなり、各ノードにデータとメソッドを保持するブックを追加できるようになります。 –