目前,我们正在使用遗传编程中的python程序的ast表示,我们无法使用python ast模块执行一点子树交叉。
这是代码 node_to_be_replaced是一个元组,第0个元素包含从父元素中随机选择的节点,第1个元素包含该列表中该节点的索引。
collector_two是来自第二个父级的引用列表。
def modify_node_using_parent(self, node_to_be_replaced, parent_two):
size = len(self.collector_two.statements)
if(self.get_the_node_type(node_to_be_replaced[0]) == "Assign") or
(self.get_the_node_type(node_to_be_replaced[0]) == "AnnAssign") or (self.get_the_node_type(node_to_be_replaced[0]) == "AugAssign"):
j = random.randint(0, size - 1)
node_to_be_replaced_with = self.collector_two.statements[j]
self.collector_one.all_changable_nodes[node_to_be_replaced[1]] = node_to_be_replaced_with
self.collector_two.statements[j] = node_to_be_replaced[0]
Collector类是一个遍历树的类,它创建了相同类型节点的引用列表,如语句和表达式等。 现在我从一个父节点中选择一个节点,并从另一个父节点中选择相同类型的节点,最后,我从列表中交换这些节点。 但是当我将这些AST转换回源代码时,那个不成熟的类会引发AttributetypeError。
任何帮助将不胜感激