遗传规划的C#动态树

遗传规划的C#动态树,c#,expression-trees,genetic-programming,C#,Expression Trees,Genetic Programming,我有一些公共用户定义的类及其成员之间的关系,还有一些方法具有特定的和通用的签名 我希望能够使用基本控制语句(如if/then/else、foreach、do/while、变量赋值等)在这些类(加上CLR类)上存储和操作自定义控制流 自定义控件流应该在运行时创建,然后存储以供以后使用和操作。 其思想是用强类型语法对控制流进行数据表示,可能采用抽象语法树的形式,以便能够应用遗传操作。 生成的自定义代码必须作为另一个程序的一部分执行 1) 操作遗传操作然后执行代码(包括我的类)的首选代码表示形式是什么

我有一些公共用户定义的类及其成员之间的关系,还有一些方法具有特定的和通用的签名

我希望能够使用基本控制语句(如if/then/else、foreach、do/while、变量赋值等)在这些类(加上CLR类)上存储和操作自定义控制流

自定义控件流应该在运行时创建,然后存储以供以后使用和操作。 其思想是用强类型语法对控制流进行数据表示,可能采用抽象语法树的形式,以便能够应用遗传操作。 生成的自定义代码必须作为另一个程序的一部分执行

1) 操作遗传操作然后执行代码(包括我的类)的首选代码表示形式是什么

2) 对于上述问题,我应该使用哪些c#技术? 我知道有一些相关技术,如反射、新的c#3.0特性(lambda、表达式树)、CodeDom、DLR库等,但哪种方法或组合最有效

3) 有这样的范例或实现吗

编辑: 平台提供了定义的c#自定义类型的数据,包括常量和时间变量

每时每刻规则都应用于数据(基本条件或更复杂的函数),并决定采取一些措施

我希望能够:

在树或图形上表示规则并执行流程

用户通过UI工具包创建自定义规则集


在树或图形上进行重新排列并应用GP操作

以C#等语言表示的繁殖程序非常棘手-它们根本不是设计为可延展的-你会发现你所做的绝大多数更改只是导致程序失败

我建议采用两种备选办法之一:

  • 伪机器语言,在两种NOP上使用模式匹配以允许分支或循环
  • 一种LISP链接语言,对命名函数使用递归以允许迭代
  • (1) 可以使用线性指令序列和某种形式的虚拟寄存器或堆栈机来表示。(2) 可使用树表示,并使用某种形式的“reduce”算法进行评估


    无论您使用何种方法,都需要在沙箱中执行程序-无限循环是常见的,因此您需要能够在设定的周期数后停止它们。

    反射是一种检查已生成的类型、方法、字段等的技术,因此目前它可能不会对您有多大帮助

    表达式树非常有趣,但它们不允许您创建复杂的程序流,因为lambda表达式不能有主体,这将使创建任何中等复杂的内容变得相当困难

    DLR在某种程度上正在形成中。您将获得一些细节,但只有下一个.NET版本才支持DLR。通过动态创建程序并执行它们,这可能是一个有趣的选择

    您现在可以做的可能是以动态方法或动态生成的程序集发出IL。所有可能的构造都应该对您可用,但后续的操作可能相当困难

    即使如此,有一个项目,做了相当多的IL魔术,它甚至可能是一些对你有用的东西:。根据列表,您有一个动态对象的实现,可以执行类似dynamicObject.CreateDuck()的操作

    另一个可能有点沉重但也很有趣的方法是WF(WorkflowFoundation)框架。这样的工作流应该可以由程序构造,并且由于其延续式的工作方式,它们可能会很有趣:您可以随时持久化正在运行的工作流,并在您离开它的位置将其拾取

    所有传统的程序结构都应该可以在WF中使用。

    覆盖了这一领域。

    只需输出c(任何其他支持此功能的.net语言,f也很好),并使用CodeDomProvider动态编译即可。强制提供的代码为一个源文件,以包含实现IDynamicEntryPoint的类型(使用静态方法或空构造函数,该构造函数是入口点,将在构造后调用)

    这应该是您开始使用的第一个调用端口,因为它可以快速试用,同时长期拥有最高性能的最佳机会(禁止动态IL输出,但即使这样,您也可能无法击败编译器)

    这显然有两个可能的缺陷,它们可能会破坏交易:

    • 生成的代码是一个安全噩梦,只允许来自完全受信任用户的代码输入
    • 动态编译的代码在代码/接口更改(代码必须包含的dll集可能更改/可能不匹配)或IDynamicEntryPoint的签名可能更改方面是脆弱的

    除非您对编写自己的语言/解析器/编译器感兴趣,否则请使用已经存在的语言/解析器/编译器。

    我关心的是使用什么技术来表示和操作我的类成员和控制流语句。我需要一种基于数据类型约束潜在代码替换的方法。我同意如果创建了c#,CodeDom可以完成这项工作。Lisp将是一个很好的解决方案,但c#中已经构建的代码是一个约束。工作流可能是一个很好的解决方案。显然对某些代表来说不够好:)哦,天哪,我没想到这一点。快到了!:)