2012-04-29 76 views
2

我想在HTML和JavaScript中编写模拟退火。我想编码它的位置,但为简单起见,我假设所有单元格都在一行中。我有大约30个电池。我在网上寻找一些材料,但我找不到代码。模拟退火

我的伪代码如下:

Simulated_Annealing{ 
    S = initial solution 
    T = initial temperature (>0) 
    while(T > 0) { 
    S’ = pick a random neighbor to S 
    C = cost of S – cost of S’ 
    if(C > 0){ 
     S = S’ 
    } else { 
     r = random number in range [0…1] 
     m = 1/e| C/T | 
     if(r < m) { 
     S = S’ 
     } 
    } 
    T = reduced T; 
    } 
} 

任何帮助表示赞赏。

谢谢。

+0

充分尊重我没有要求代码,我只是想要一些帮助,开始编码。由于我是JavaScript的初学者,我在网上发现了这个伪代码,而不是在我的作业中。 – user1325120 2012-04-29 08:10:11

回答

12

在GitHub上快速搜索找到https://github.com/ebobby/Jsqueens,它使用模拟退火来解决9皇后问题。这里的相关代码:

/** 
* @author Francisco Soto <[email protected]> 
*/ 
var SimulatedAnnealing = (function() { 
    var coolingFactor   = 0.0, 
     stabilizingFactor  = 0.0, 
     freezingTemperature  = 0.0, 
     currentSystemEnergy  = 0.0, 
     currentSystemTemperature = 0.0, 
     currentStabilizer  = 0.0, 

     generateNewSolution  = null, 
     generateNeighbor   = null, 
     acceptNeighbor   = null; 

    function _init (options) { 
     coolingFactor   = options.coolingFactor; 
     stabilizingFactor  = options.stabilizingFactor; 
     freezingTemperature  = options.freezingTemperature; 
     generateNewSolution  = options.generateNewSolution; 
     generateNeighbor   = options.generateNeighbor; 
     acceptNeighbor   = options.acceptNeighbor; 

     currentSystemEnergy  = generateNewSolution(); 
     currentSystemTemperature = options.initialTemperature; 
     currentStabilizer  = options.initialStabilizer; 
    } 

    function _probabilityFunction (temperature, delta) { 
     if (delta < 0) { 
      return true; 
     } 

     var C = Math.exp(-delta/temperature); 
     var R = Math.random(); 

     if (R < C) { 
      return true; 
     } 

     return false; 
    } 

    function _doSimulationStep() { 
     if (currentSystemTemperature > freezingTemperature) { 
      for (var i = 0; i < currentStabilizer; i++) { 
       var newEnergy = generateNeighbor(), 
        energyDelta = newEnergy - currentSystemEnergy; 

       if (_probabilityFunction(currentSystemTemperature, energyDelta)) { 
        acceptNeighbor(); 
        currentSystemEnergy = newEnergy; 
       } 
      } 
      currentSystemTemperature = currentSystemTemperature - coolingFactor; 
      currentStabilizer = currentStabilizer * stabilizingFactor; 
      return false; 
     } 
     currentSystemTemperature = freezingTemperature; 
     return true; 
    } 

    return { 
     Initialize: function (options) { 
      _init(options); 
     }, 

     Step: function() { 
      return _doSimulationStep(); 
     }, 

     GetCurrentEnergy: function() { 
      return currentSystemEnergy; 
     }, 

     GetCurrentTemperature: function() { 
      return currentSystemTemperature; 
     } 
    }; 
})(); 
+0

非常谢谢你比尔!我不知道如何开始编码,但是这段代码是很好的帮助.....再次感谢 – user1325120 2012-04-30 07:37:13

+5

他,很高兴看到我的代码被用于学习。 – 2013-07-26 03:06:51