Python で単純な遺伝的プログラミング ユーティリティをコーディングしようとしています。しかし今、私は自分のツリーのクロスオーバー/メイト機能で立ち往生しています。ツリーはネストされたリストによって構築され、次のようになります。
# 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