19

这是我上一个问题的延续。我想解析一个方程并根据我得到的结果工作。我想要做的基本上是随机打乱它,所以我得到一个新的方程,它也必须是一个有效的函数。这将用于遗传算法。

这是我开始的地方:

class Py2do(ast.NodeTransformer):
def __init__(self):
  self.tree=[]
def generic_visit(self, node):
    print type(node).__name__
    self.tree.append(type(node).__name__)
    ast.NodeVisitor.generic_visit(self, node)
    depth=3
    s = node.__dict__.items()
    s = "    ".join("%s %r" % x for x in sorted(node.__dict__.items()))
    print( "%s%s\t%s" % (depth, str(type(node)), s) )
    for x in ast.iter_child_nodes(node):
      print (x, depth)

def visit_Name(self, node):
    # print 'Name :', node.id
    pass

def visit_Num(self, node):
    print 'Num :', node.__dict__['n']

def visit_Str(self, node):
    print "Str :", node.s

def visit_Print(self, node):
    print "Print :"
    ast.NodeVisitor.generic_visit(self, node)

def visit_Assign(self, node):
    print "Assign :"
    ast.NodeVisitor.generic_visit(self, node)

def visit_Expr(self, node):
    print "Expr :"
    ast.NodeVisitor.generic_visit(self, node)





if __name__ == '__main__':
    node = ast.parse("res= e**(((-0.5*one)*((delta_w*one/delta*one)**2)))")
    import ast_pretty
    print ast.dump(node)
    pprintAst(node)
    v = Py2do()
    v.visit(node)
    print v.tree

我想出去的是这样的:

res= e**(delta*((one/delta_w*one)**2)))

或其他某种有效的随机方程。这将在 Fortran 程序中使用,所以如果得到的方程也可以转移到 Fortran 中,那就太好了。请评论您的代码并提供测试样本/单元测试。

4

2 回答 2

1

那么输入输出都是Fortran代码?并且您想使用任意 Fortran 表达式/语句?(包括数组切片,...?) Fortran 是一种非常复杂的语言;阅读它几乎需要一个完整的解析器。

也许您想使用已经可以直接操作 Fortran 的程序转换工具。这样的工具将读取 Fortran 代码,构建一个 AST,让您使用一组随机选择的转换“随机化”它,然后重新生成有效的 Fortran 代码。

我们的DMS Software Reengineering Toolkit及其Fortran 前端可直接用于此目的。

编辑 2011 年 8 月 26 日:OP 确认他想要“进化”(转换)真正的 Fortran 代码。值得注意的是,构建一个真正的 Fortran 解析器(就像为任何其他真正的语言构建解析器一样)非常困难。我们花了几个月的时间,我们的工具非常擅长定义解析器(我们已经使用 DMS 完成了大约 40 种语言和各种方言)。对他来说,构建自己的真正的 Fortran 解析器可能不是一个好主意,至少如果他想继续他的生活或他的实际任务的话。

OP 可能会将 Fortran 代码限制在一个非常受限的子集,并为此构建一个解析器。

于 2011-08-21T11:32:26.690 回答
-1

你想做什么?寻找方程的正确排列可能很容易但很耗时(n!可能性),但生成新的并使用遗传算法优化那些是不可能的,因为这不是一个优化问题......例如 x^ 0.00 和 x^0.01 是根本不同的。此外,您无法针对正确的运营商进行优化,这将无法正常工作。对不起。

虽然,情况并没有那么糟糕。寻找正确的功能是一项极其常见的任务。我现在假设您不知道该函数,但您从测量中知道几个点(无论如何,您都需要它来计算遗传算法中的适应度,不是吗?)。您现在可以使用拉格朗日来获得通过那些给定点的多项式。维基百科文章中间有两个很好的例子,lagrange 很容易实现(我猜不到 10 行代码)。另请注意,您可以通过添加更多参考点来提高多项式的准确性。

于 2011-06-24T12:54:23.247 回答