2011-04-07 62 views
6

這是一個通用的問題,儘管我很確定它的一些部分已經得到解答,但我需要的是意見而不是廣泛的討論。我打算做進化計算和遺傳編程的碩士論文,我希望Linux/C++專家的意見是否可以從遺傳程序創建源代碼文件,調用gcc編譯它們,如果它們失敗編譯以捕獲失敗的原因,如果它們編譯執行編譯的程序(作爲新的進程),然後能夠向該程序發送輸入並捕獲輸出和任何引發的異常(或崩潰)。我知道這個話題太廣泛了,但我想知道是否有人認爲這是可撤銷的,很難嘗試,或者即使可以有更好的方式來做到這一點。C++遺傳編程:調用鏈接器/編譯器,執行編譯後的程序和管道輸入/輸出

+0

根本不傻,但非常耗時。在智力上具有挑戰性的部分是想出一個很好的C++ DNA進化。你原始湯的主題/目標是什麼? – 2011-04-07 18:23:29

+0

是否有限制做到這一點是C++?我認爲如果你打算讓軟件發生變化,可能會有更好的選擇... – 2011-04-07 18:26:34

+0

這不會起作用。發生突變並最終有助於改善是極不可能的。編譯器不會忍受單個字母的變化,它們被設計爲做相反的事情。 – 2011-04-07 18:43:16

回答

1

是的,有可能這樣做,而且其實很簡單。你將源代碼輸出到一個臨時文件(mkstmp),fork/exec一個編譯過程(輸出到一個臨時文件),你的fork/exec生成的程序,在此之前你dup2pipe插入一個輸入和一個輸出。這是基本的Unix編程,在C中做這件事並不複雜。

代碼生成本身可能會更難以正確,但這很大程度上取決於項目。

此外,我們擁有幾個月以來的現代化工具:我相信Clang可能是最值得關注的東西。如果您計劃執行的代碼很簡單(或者不簡單,但是結構化),那麼您也可以直接輸出LLVM代碼。這並不難,並且使您能夠及時生成高效的編譯代碼。

+0

非常感謝您的鏈接!我沒有想過使用其他編譯器。 它自己的代碼生成將是一個GP進化的過程,所以如果它沒有編譯,它就會死亡。如果編譯和崩潰,段,引發異常等,它會死亡。即使它編譯和運行順利,它仍然必須按照每種情況下所需做的來生存。我想我可以改用Clang。代碼生成將完全取決於所需任務的世代和複雜性。 – 2011-04-07 21:24:37

1

你想在這個遺傳程序中優化什麼?除了尋找運行的程序外,您還需要尋找什麼標準?我不太明白...

要清楚,我問這個問題的原因是因爲我只理解使用遺傳算法試圖解決某種優化問題。在這種情況下,你會有某種啓發式方法,你可以評估過程中的所有孩子,然後根據啓發式和選擇標準培育新的後代。我不明白產生這個源的預期結果是什麼,或者你會如何創建啓發式來評估它。

+0

它不是一個試圖優化某些東西的遺傳算法,它是一種機器學習 - 人造生命,試驗看看機器是否有可能演化複雜的計算機代碼,從中可以學習和演化更復雜的代碼。程序功能,類別等將在每種情況下都應符合特殊標準進行評估,並且這樣做有望能夠創建「規則集」。例如,在我的第一步中,我會嘗試發展一個函數,返回兩個輸入中哪一個更大。稍後,引擎應該能夠使用該功能。 – 2011-04-07 21:18:36

+0

好吧,如果你想使用遺傳算法,在某個時間點,你將不得不根據你想優化的東西形成你的問題。你還需要形式化啓發式評估你正在生成的源代碼。我不明白爲什麼你在做什麼與遺傳算法有關。不過很酷的是,它似乎試圖通過隨機更改源代碼行來「發展」計算機,但似乎並沒有任何背後的方法。 – jberg 2011-04-07 21:22:50

+0

有一種方法!此外,它不是一種優化算法,它是一種演化算法,用於創建可行,有意義且可用的代碼。通過以下方式進行評估:a)編譯錯誤檢查b)異常檢查c)無法完成任何可能的目標(輸入和輸出檢查)。就像我說過的,我之前做過這件事,我的擔心不是評估本身,而是與編譯器和被調用的過程進行溝通,以便進行實際評估。此外,它不是一個GA,它是一個GP,沒有字符串編碼,固定的字符串,等等。參見:http://www.genetic-programming.org – 2011-04-08 01:41:06