0

我想問一個複雜的問題。在哪裏編碼啓發式?

我必須爲我的論文編寫一個啓發式代碼。我需要如下:

  • 評估一些不可或缺的功能
  • 最小化功能在間隔
  • 做到這一點逾千和千倍。

所以我需要一個更快的編程語言來完成這些工作。你建議哪種語言?首先,我從Java開始,但積分成爲一個問題。我不確定速度。連接Java和MATLAB等其他軟件可能是個不錯的主意。既然我不確定,我想聽取你的意見。

謝謝!

+3

你使用了最好的算法嗎? – 2011-04-07 10:24:51

+0

MATLAB通常比較慢,除非你有一個函數在C++中使用。您可以跳過MATLAB步驟,並使用C++作爲函數(通過JNI)。然而,對積分進行幾千次評估不應該花很長時間,所以我懷疑你可以進一步優化你的解決方案。例如你使用的核心有多大? – 2011-04-07 10:28:10

+0

精度取決於實現。所以,如果正確的實現完成,語言之間不會改變。如果你想簡化你的生活,使用Java。如果你想用C或C++來實現性能。 – Heisenbug 2011-04-07 10:44:31

回答

1

C,Java,...都是圖靈完整語言。他們可以以相同的精度計算相同的功能。 如果您想要達到性能目標,請使用C語言,它是一種編譯後的高性能語言。可以減少您的計算時間,避免方法調用和像Java這樣的解釋型語言中存在的高級特性。

無論如何請記住,您的實施可能會影響性能而不是您選擇的語言,因爲增加輸​​入維度是相關的計算複雜度(http://en.wikipedia.org/wiki/Computational_complexity_theory)。

+0

謝謝。但據我所知,在C中,我只能計算積分的黎曼和。但是,積分的確切值很重要。 C可以評估積分的確切值嗎? 我知道實施,謝謝。 – 2011-04-07 10:33:11

+0

@Kenshi:你可以用每一個完整的圖靈機來計算每個可計算的函數(所以每種語言都可以)。如果你指的是C標準庫沒有完成積分計算的事實,請查看gsl:http://www.gnu.org/software/gsl/manual/html_node/ – Heisenbug 2011-04-07 10:37:27

+0

你可以在任何圖靈完整的語言,包括C,Java等等。它們只在所需的努力和執行的性能上有所不同。 – jmg 2011-04-07 10:39:32

0

開始切換語言之前,我想先試着做以下事情:

  1. 找到最適合的算法。
  2. 查找可用於您的語言的算法的可用實現。 有例如用於Java的科學庫。嘗試使用這些庫。
  3. 如果他們沒有足夠快的調查是否有任何事情要做。你的問題比圖書館假設的更具體嗎?你能否根據這些知識改進算法。
  4. 這是什麼需要這麼多/記憶?這是否與你的語言有關?儘量避免觀察JVM的開始時間,而不是爲其執行計算的時間。
  5. 然後,我會考慮切換語言。但不要指望它很容易擊敗c中優化的第三方Java庫。
0

算法

語言之間切換Tipically順序僅通過降低一個常數因子所需的時間。假設您可以使用C將速度提高一倍,但如果您的算法爲O(n^2),則無論語言如何,您都需要四次來處理數據。

而JVM可以優化很多事情,獲得​​良好的結果。

在Java中

如果你有一個被稱爲很多次函數的一些更多鈔票優化對最終他們。全班同樣如此。編譯器會知道它可以內聯方法代碼,避免爲該調用創建方法調用堆棧幀。

1

這不是編程語言,它可能是你的算法。確定算法的最大表示法。如果您在循環中使用循環,您可以在Map中使用散列進行搜索,而您的算法可以更快地執行n倍。

注:現代的JVM(JDK 1.5或1.6)編譯剛剛在時間本身(如不解釋的),以特定的OS 和特定的操作系統版本和特定的硬件架構。您可以更積極地嘗試-server進行JIT(以更長的初始化時間爲代價)。

做到這一點上千次。

你確定它不是更多,像10^1000而不是?試着準確計算你需要運行該循環的次數,這可能會讓你感到驚訝。啓發式使用的問題類型往往有一個非常大的搜索空間。