该问题来自 Python 中使用遗传算法优化随机表达式的讨论。用户编写了一个程序来生成随机表达式,并使用遗传算法来选择最优的表达式。在程序中,生成随机表达式和存储在树结构中的部分占用了大部分时间,需要进行优化。用户希望通过优化 Node.init 方法和 random.choice() 方法来提高程序的运行效率。
2、解决方案
以下是针对这个问题的一些优化建议:
1. Node.init 方法优化:
- 减少不必要的属性赋值,例如
isRoot、parent、branch、seq等属性。 - 改用
namedtuple来定义Node类,namedtuple是一个不可变的类,不需要手动定义__init__方法,并且可以提高性能。
2. random.choice() 方法优化:
- 避免频繁调用
random.choice()方法,可以将随机值预先计算好并存储起来,然后直接使用。 - 可以使用
itertools.cycle()方法来循环访问一个列表,从而避免每次调用random.choice()方法来选择一个随机值。
3. 代码优化示例:
以下是优化后的代码示例:
from collections import namedtuple
from itertools import cycle
# 定义 Node 类
Node = namedtuple("Node", ["cargo", "left", "right"])
# 定义 KeySeq 类
class KeySeq:
def __init__(self, data=0):
self.data = data
def __iter__(self):
return self
def next(self):
self.data += 1
return self.data
# 全局常量
Depth = 5
Ratio = 0.6 # 概率终止当前分支
Atoms = ["1.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "x", "x", "x", "x"]
# 运算符字典,结构是:运算符:参数数量
Operators = {"+": 2, "-": 2, "*": 2, "/": 2, "**": 2}
# 迭代器用于生成键序列
KS = KeySeq()
# 构建节点
def build_nodes(depth=Depth, entry=1, pparent=None, bbranch=None):
r = random.random()
# 强制终止节点
if depth <= 0 or (r > Ratio and not entry):
this_atom = random.choice(Atoms)
this_node = Node(this_atom, None, None)
this_node.seq = KS.next()
return this_node
else:
# 添加具有分支的节点
this_operator = random.choice(list(Operators.keys()))
this_node = Node(this_operator, None, None)
this_node.seq = KS.next()
# 分支的次数由运算符的参数数量决定
for i in range(Operators[this_operator]):
depth -= 1
if i == 0:
this_node.left = build_nodes(entry=0, depth=depth, pparent=this_node, bbranch="left")
else:
this_node.right = build_nodes(entry=0, depth=depth, pparent=this_node, bbranch="right")
return this_node
# 构建树
class Tree:
def __init__(self):
self.thedict = {}
self.data = build_nodes()
# 打印树
def print_tree_indented(data, level=0):
if data is None:
return
print_tree_indented(data.right, level + 1)
print(" " * level + " " + str(data.cargo)) # + ' '+ str(data.seq)+ ' '+ str(data.branch)
print_tree_indented(data.left, level + 1)
# 主函数
def main():
t = Tree()
print_tree_indented(t.data)
if __name__ == "__main__":
main()
通过以上优化,可以提高程序的运行效率,减少不必要的计算和调用,从而使得程序运行更快。