6

我目前正在開發一個項目(TSP),並試圖將一些模擬退火僞代碼轉換爲Java。我過去在將僞代碼轉換爲Java代碼方面取得了成功,但是我無法將其成功轉換。來自僞代碼的Java模擬退火

僞代碼:

T0(T and a lowercase 0) Starting temperature 
Iter Number of iterations 
λ The cooling rate 

1. Set T = T0 (T and a lowercase 0) 
2. Let x = a random solution 
3. For i = 0 to Iter-1 
4. Let f = fitness of x 
5. Make a small change to x to make x’ 
6. Let f’ = fitness of new point 
7. If f’ is worse than f then 
8.  Let p = PR(f’, f, Ti (T with a lowercase i)) 
9.  If p > UR(0,1) then 
10.   Undo change (x and f) 
11.  Else 
12.   Let x = x’ 
13.  End if 
14.  Let Ti(T with a lowercase i) + 1 = λTi(λ and T with a lowercase i) 
15. End for 
Output: The solution x 

如果有人能告訴我這在Java中一個基本的標記了,我會非常感激 - 我似乎無法推測出來!

我正在跨多個類使用一些函數(我不會列出,因爲它是無關我的要求)。我已經有了一個smallChange()方法和一個fitness函數 - 我是否可能需要創建一些不同版本的所述方法?例如,我有這樣的東西:

public static ArrayList<Integer> smallChange(ArrayList<Integer> solution){ 

//Code is here. 

} 

我可能需要另一個版本的這種方法接受不同的參數?沿着線的東西:

public static double smallChange(double d){ 

//Code is here. 

} 

所有我需要是如何用Java編寫的時候,這將看一個基本的想法 - 我將能夠使它適應我的代碼,一旦我知道它應該是什麼樣子的正確的語法,但我似乎無法通過這個特殊的障礙。

謝謝。

米克

+0

在這裏,你還可以看看我的實現(它的一部分)。它保持非常通用。 http://stackoverflow.com/a/18657788/1809463 – mike 2013-09-06 12:39:20

回答

5

基本代碼應該是這樣的:

public class YourClass { 
    public static Solution doYourStuff(double startingTemperature, int numberOfIterations, double coolingRate) { 
    double t = startingTemperature; 
    Solution x = createRandomSolution(); 
    double ti = t; 

    for (int i = 0; i < numberOfIterations; i ++) { 
     double f = calculateFitness(x); 
     Solution mutatedX = mutate(x); 
     double newF = calculateFitness(mutatedX); 
     if (newF < f) { 
     double p = PR(); // no idea what you're talking about here 
     if (p > UR(0, 1)) { // likewise 
      // then do nothing 
     } else { 
      x = mutatedX; 
     } 
     ti = t * coolingRate; 
     } 
    } 
    return x; 
    } 

    static class Solution { 
    // no idea what's in here... 
    } 
} 

現在就想要不同的版本smallChange()方法 - 完全可行的,但你必須在繼承讀了一點點

+2

我感覺'ti = t * coolingRate;'應該是'ti = ti * coolingRate;' – Deleplace 2015-03-20 12:42:02

3

此外,基於Java的方法來教學模擬退火(樣本代碼)是在這裏:

Neller,託德。 Teaching Stochastic Local Search,I.Russell和Z.Markov,eds。 2005年5月15日至17日在佛羅里達州克利爾沃特海灘舉行的第18屆國際FLAIRS會議(FLAIRS-2005)會議記錄,AAAI出版社,第8-13頁。

相關資源,參考和演示在這裏:http://cs.gettysburg.edu/~tneller/resources/sls/index.html

+0

這篇論文真的值得去閱讀。它通過編碼實例激發並解釋了模擬退火的功能。他們提供的代碼可以很容易地適應任何類型的優化問題。 – Michael 2013-03-01 02:02:20