我想問一個複雜的問題。在哪裏編碼啓發式?
我必須爲我的論文編寫一個啓發式代碼。我需要如下:
- 評估一些不可或缺的功能
- 最小化功能在間隔
- 做到這一點逾千和千倍。
所以我需要一個更快的編程語言來完成這些工作。你建議哪種語言?首先,我從Java開始,但積分成爲一個問題。我不確定速度。連接Java和MATLAB等其他軟件可能是個不錯的主意。既然我不確定,我想聽取你的意見。
謝謝!
我想問一個複雜的問題。在哪裏編碼啓發式?
我必須爲我的論文編寫一個啓發式代碼。我需要如下:
所以我需要一個更快的編程語言來完成這些工作。你建議哪種語言?首先,我從Java開始,但積分成爲一個問題。我不確定速度。連接Java和MATLAB等其他軟件可能是個不錯的主意。既然我不確定,我想聽取你的意見。
謝謝!
C,Java,...都是圖靈完整語言。他們可以以相同的精度計算相同的功能。 如果您想要達到性能目標,請使用C語言,它是一種編譯後的高性能語言。可以減少您的計算時間,避免方法調用和像Java這樣的解釋型語言中存在的高級特性。
無論如何請記住,您的實施可能會影響性能而不是您選擇的語言,因爲增加輸入維度是相關的計算複雜度(http://en.wikipedia.org/wiki/Computational_complexity_theory)。
謝謝。但據我所知,在C中,我只能計算積分的黎曼和。但是,積分的確切值很重要。 C可以評估積分的確切值嗎? 我知道實施,謝謝。 – 2011-04-07 10:33:11
@Kenshi:你可以用每一個完整的圖靈機來計算每個可計算的函數(所以每種語言都可以)。如果你指的是C標準庫沒有完成積分計算的事實,請查看gsl:http://www.gnu.org/software/gsl/manual/html_node/ – Heisenbug 2011-04-07 10:37:27
你可以在任何圖靈完整的語言,包括C,Java等等。它們只在所需的努力和執行的性能上有所不同。 – jmg 2011-04-07 10:39:32
開始切換語言之前,我想先試着做以下事情:
算法
語言之間切換Tipically順序僅通過降低一個常數因子所需的時間。假設您可以使用C將速度提高一倍,但如果您的算法爲O(n^2)
,則無論語言如何,您都需要四次來處理數據。
而JVM可以優化很多事情,獲得良好的結果。
在Java中
如果你有一個被稱爲很多次函數的一些更多鈔票優化對最終他們。全班同樣如此。編譯器會知道它可以內聯方法代碼,避免爲該調用創建方法調用堆棧幀。
這不是編程語言,它可能是你的算法。確定算法的最大表示法。如果您在循環中使用循環,您可以在Map中使用散列進行搜索,而您的算法可以更快地執行n
倍。
注:現代的JVM(JDK 1.5或1.6)編譯剛剛在時間本身(如不解釋的),以特定的OS 和特定的操作系統版本和特定的硬件架構。您可以更積極地嘗試-server
進行JIT(以更長的初始化時間爲代價)。
做到這一點上千次。
你確定它不是更多,像10^1000
而不是?試着準確計算你需要運行該循環的次數,這可能會讓你感到驚訝。啓發式使用的問題類型往往有一個非常大的搜索空間。
你使用了最好的算法嗎? – 2011-04-07 10:24:51
MATLAB通常比較慢,除非你有一個函數在C++中使用。您可以跳過MATLAB步驟,並使用C++作爲函數(通過JNI)。然而,對積分進行幾千次評估不應該花很長時間,所以我懷疑你可以進一步優化你的解決方案。例如你使用的核心有多大? – 2011-04-07 10:28:10
精度取決於實現。所以,如果正確的實現完成,語言之間不會改變。如果你想簡化你的生活,使用Java。如果你想用C或C++來實現性能。 – Heisenbug 2011-04-07 10:44:31