C # Dynamic Trees para Programación Genética

c# expression-trees genetic-programming

Pregunta

Tengo algunas clases definidas por el usuario público con relaciones entre sus miembros y también varios métodos con firmas específicas y genéricas.

Me gustaría poder almacenar y manipular el flujo de control personalizado sobre estas clases (más las clases CLR) usando instrucciones de control básicas como if / then / else, foreach, do / while, asignaciones de variables, etc.

El flujo de control personalizado debe crearse en tiempo de ejecución y luego almacenarse para su uso y manipulación posteriores. La idea es tener una representación de datos del flujo de control, posiblemente en forma de un árbol de sintaxis abstracta, con una sintaxis fuertemente tipada para poder aplicar operaciones genéticas. El código personalizado resultante debe ejecutarse como parte de otro programa.

1) ¿Cuál es la representación de código preferida para manipular operaciones genéticas y luego ejecutar el código incluyendo mis clases,

2) ¿Qué tecnologías c # debo usar para el problema anterior? Sé que existen tecnologías relacionadas como la reflexión, las nuevas funciones de c # 3.0 (lambda, árboles de expresión), CodeDom, biblioteca de DLR, etc., pero qué enfoque o combinación es el más eficiente.

3) ¿Existen tales paradigmas o implementaciones disponibles?

EDITAR: La plataforma se suministra con datos de c # tipos personalizados, tanto constantes como variables de tiempo.

Cada momento se aplican reglas a los datos (condiciones básicas o funciones más complicadas) y se decide realizar algunas acciones.

Me gustaría poder:

Represente las reglas en un árbol o gráfico y ejecute el flujo.

Cree conjuntos de reglas personalizadas por el usuario a través de un kit de herramientas de interfaz de usuario

Haga un reordenamiento en el árbol o gráfico y aplique las operaciones de GP

Respuesta aceptada

Reflexión es la tecnología para inspeccionar tipos, métodos, campos, etc. ya generados, por lo que probablemente no te ayude mucho por ahora.

Los árboles de expresiones son bastante interesantes, pero AFAIK no te permitirán crear un flujo de programa complejo, ya que una expresión lambda no puede tener un cuerpo, lo que haría bastante difícil crear algo moderadamente complejo.

DLR es algo en la fabricación. Obtendrá los bits y las piezas, pero solo la próxima versión .NET tendrá soporte integrado para el DLR. Esa podría ser una alternativa interesante, creando programas sobre la marcha y ejecutándolos.

Lo que podría hacer ahora es posiblemente emitir IL, ya sea en un Método Dinámico o en un ensamblaje generado dinámicamente. Todas las construcciones posibles deberían estar disponibles para usted, pero una manipulación posterior es probablemente bastante difícil.

Aun así, hay un proyecto que hace un poco de magia IL e incluso puede ser algo que podría ser útil para usted: LinFu . De acuerdo con la lista, tienes una implementación de Objeto Dinámico y puedes hacer cosas como dynamicObject.CreateDuck <InterfaceType> ()

Otra ruta que puede ser un poco pesada pero también interesante es el marco de trabajo de WF (Workflow Foundation). Dichos flujos de trabajo deben ser construibles por programa y pueden ser interesantes debido a su estilo de trabajo continuo: puede mantener un flujo de trabajo en ejecución en cualquier momento y retomarlo donde lo dejó.

Todas las estructuras de programas tradicionales deben estar disponibles para usted dentro de WF.


Respuesta popular

Simplemente imprima c # (de cualquier otro lenguaje .net que admita esto, f # también funciona bien) y use el CodeDomProvider para compilarlo sobre la marcha. Forzar el código suministrado para que sea un archivo de origen, para incluir un tipo que implemente IDynamicEntryPoint (con un método estático o un constructor vacío que es el punto de entrada y se invocará después de la construcción)

Para empezar, este debe ser su primer puerto de llamada porque es rápido de probar al mismo tiempo que a largo plazo tiene la mejor oportunidad de obtener el mejor rendimiento (salvo la salida dinámica de IL, pero incluso entonces es posible que no supere al compilador)

Obviamente, esto tiene dos posibles fallas que pueden ser un factor decisivo:

  • El código resultante es una pesadilla de seguridad, solo se debe permitir la entrada de código de usuarios de plena confianza.
  • El código compilado dinámicamente es frágil con respecto a los cambios de código / interfaz (el conjunto de dll que el código debe incluir podría cambiar / podría no coincidir) o la firma de IDynamicEntryPoint podría cambiar.

A menos que esté interesado en escribir su propio idioma / analizador / compilador por diversión, use uno que ya esté allí.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué