python abstract-syntax-tree genetic-programming

python - Ejemplo para ast.NodeTransformer que muta una ecuación



abstract-syntax-tree genetic-programming (2)

¿Que estás tratando de hacer? Buscar la permutación correcta de una ecuación puede ser fácil pero requiere mucho tiempo (n! Posibilidades), pero generar nuevos y optimizar aquellos que usan un algoritmo genético es imposible, porque no es un problema de optimización ... Por ejemplo x ^ 0.00 y x ^ 0.01 son fundamentales diferentes. Además, no puede optimizar para el operador correcto, eso simplemente no funcionará. Lo siento.

Aunque, la situación no es tan mala. Buscar la función correcta es una tarea extremadamente común. Ahora asumo que no conoce la función, pero conoce un par de puntos de las mediciones (de todos modos, habría necesitado eso para calcular la adecuación de su algoritmo genético, ¿no es así?). Ahora puedes usar Lagrange para obtener un polinomio que pasa esos puntos dados. Hay dos buenos ejemplos en el medio del artículo de wikipedia, y lagrange es bastante fácil de implementar (<10 líneas de código, supongo). También tenga en cuenta que tiene la capacidad de mejorar la precisión del polinomio simplemente agregando más puntos de referencia.

Esta es una continuación de mi última pregunta. Quiero analizar una ecuación y trabajar en el ast que recibo. Lo que quiero hacer es básicamente mezclarlo aleatoriamente para obtener una nueva ecuación, que también tiene que ser una función válida. Esto debe ser utilizado en un algoritmo genético.

Aquí es donde empiezo:

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

Lo que quiero sacar es algo como esto:

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

u otra ecuación aleatoria válida de algún tipo. Esto se utilizará en un programa Fortran, por lo que sería bueno si la ecuación resultante también se puede transferir a Fortran. Por favor comente su código y proporcione una muestra de prueba / prueba de unidad.


Entonces, ¿la entrada y la salida son código Fortran? ¿Y quieres usar expresiones / declaraciones de Fortran arbitrarias? (¿Incluyendo segmentos de matriz, ...?) Fortran es un lenguaje bastante complejo; leerlo requiere prácticamente un analizador completo.

Quizás desee utilizar una herramienta de transformación de programa que ya pueda manipular directamente a Fortran. Una herramienta de este tipo leería el código de Fortran, generaría un AST, le permitiría "aleatorizarlo" utilizando un conjunto de transformaciones elegidas al azar y luego regeneraría un código de Fortran válido.

Nuestro kit de herramientas de reingeniería de software DMS con su extremo frontal Fortran podría usarse directamente para esto.

EDITAR 26 de agosto de 2011: OP confirma que quiere "evolucionar" (transformar) el código Fortran real. Vale la pena señalar que construir un analizador Fortran real (como crear analizadores para cualquier otro lenguaje real) es bastante difícil; nos tomó meses y nuestras herramientas son realmente buenas para definir analizadores (hemos hecho unos 40 idiomas y una variedad de dialectos usando DMS). Probablemente no sea una buena idea para él construir su propio analizador Fortran real, al menos no si quiere seguir adelante con su vida o su tarea real.

Podría ser posible que OP restrinja el código de Fortran a un subconjunto muy restringido y cree un analizador para eso.