簡體   English   中英

用於遺傳編程的C#動態樹

[英]C# Dynamic Trees for Genetic Programming

我有一些公共用戶定義的類,它們的成員之間有關系,還有一些具有特定和通用簽名的方法。

我希望能夠使用if / then / else,foreach,do / while,variable assignment等基本控制語句來存儲和操作這些類(以及CLR類)的自定義控制流。

應在運行時創建自定義控制流,然后存儲以供以后使用和操作。 該想法是具有控制流的數據表示,可能采用抽象語法樹的形式,具有強類型語法 ,以便能夠應用遺傳操作。 生成的自定義代碼必須作為另一個程序的一部分執行。

1)操作遺傳操作然后執行包括我的類的代碼的首選代碼表示是什么,

2)我應該使用哪些c#技術來解決上述問題? 我知道有相關的技術,如反射,新的c#3.0功能(lambda,表達式樹),CodeDom,DLR庫等,但哪種方法或組合是最有效的。

3)是否有這樣的范例或實現?

編輯:該平台提供定義的c#自定義類型的數據,包括常量和時間變量。

每一刻規則都應用於數據(基本條件或更復雜的功能),並決定采取一些行動。

我希望能夠:

在樹或圖上表示規則並執行流程。

用戶通過UI工具包創建自定義規則集

在樹或圖表上重新排列並應用GP操作

反射是檢查已經生成的類型,方法,字段等的技術,因此它現在可能對你沒什么幫助。

表達式樹很有趣,但是AFAIK它們不允許你創建復雜的程序流,因為lambda表達式不能有一個主體,這會使創建任何中等復雜的東西變得相當困難。

DLR有點正在制作中。 你會得到一些零碎的東西,但只有下一個.NET版本才能獲得DLR的支持。 這可能是一個有趣的選擇,通過動態創建程序並執行它們。

您現在可以做的是在動態方法或動態生成的程序集中發出IL。 應該可以使用所有可能的構造,但后續操作可能相當困難。

即便如此,有一個項目可以做很多IL魔法,它甚至可能對你有用: LinFu 根據列表,您有動態對象的實現,可以執行類似dynamicObject.CreateDuck <InterfaceType>()的操作

WF(工作流基礎)框架可能有點重,但也很有趣。 這樣的工作流程應該由程序構建,並且由於它們的延續風格,它們可能很有趣:您可以隨時保持正在運行的工作流程並在您離開它的地方撿起它。

在WF內,您可以使用所有傳統的程序結構。

以C#等語言表示的育種程序非常棘手 - 它們根本不具備可塑性 - 您會發現您所做的絕大多數更改只會導致程序失敗。

我會推薦兩種替代方法之一:

  1. 偽機器語言,在兩種NOP上使用模式匹配以允許分支或循環;
  2. 一種LISP鏈接語言,使用命名函數的遞歸來允許迭代。

(1)可以使用線性指令序列和某種形式的虛擬寄存器或堆棧機器來表示。 (2)可以使用樹表示,並使用某種形式的“reduce”算法進行評估。

無論使用何種方法,您都需要在沙箱中執行程序 - 無限循環將是常見的,因此您需要能夠在一定數量的循環后停止它們。

動態表達[example] API涵蓋了這個領域的基礎......

只需輸出c#(支持此功能的任何其他.net語言,f#也可以很好地工作)並使用CodeDomProvider即時編譯它。 強制提供的代碼是一個源文件,包含一個實現IDynamicEntryPoint的類型(使用靜態方法或空構造函數,這是一個入口點,將在構造后調用)

這應該是您開始使用的第一個停靠點,因為它可以在長期具有最高性能的最佳機會的同時快速嘗試(除非動態IL輸出,但即便如此,您可能無法擊敗編譯器)

這顯然有兩個可能的缺陷,可能是交易破壞者:

  • 生成的代碼是安全噩夢,只允許完全信任的用戶輸入代碼。
  • 動態編譯的代碼在代碼/接口更改方面是脆弱的(代碼必須包含的dll集可能會更改/可能不匹配)或IDynamicEntryPoint的簽名可能會更改。

除非您有興趣編寫自己的語言/解析器/編譯器,否則請使用已有的語言/解析器/編譯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM