WEB开发网
开发学院软件开发数据结构 模拟退火算法求解TSP问题 阅读

模拟退火算法求解TSP问题

 2009-01-26 11:57:56 来源:WEB开发网   
核心提示:四、主要代码对应于流程框图,实现流程的主体函数是SACompution(),模拟退火算法求解TSP问题(2),代码如下:UINT SACompution(LPVOID pParam){while(1){double deltatotaldis = 0.0;while(1){SYRouter SelRouter( Res

四、主要代码

对应于流程框图,实现流程的主体函数是SACompution(),代码如下:
UINT SACompution(LPVOID pParam)
{
  while(1)
  {
    double deltatotaldis = 0.0;
    while(1)
    {
      SYRouter SelRouter( ResultRouter.m_CityRouter,
                NowTemperature,
                NowExternalIterNumber,
                NowInnerIterNumber );  
      //从某路径的邻域中随机选择一个新的路径,邻域映射为2-opt
      deltatotaldis = SelRouter.m_fTotalDistance-ResultRouter.m_fTotalDistance;
      //计算新路径与当前路径的路程长度差值
      if( deltatotaldis <= 0.0 )
        ResultRouter = SelRouter;  //如果新路径的路程短,则用它替换当前路径
      else
      {
        double chgprobability = exp( -(deltatotaldis/NowTemperature) );
        int randomnum = rand();
        double random = ((double)(randomnum%10000))/10000.0;
        if(chgprobability > random )
          ResultRouter = SelRouter;
        //如果新路径长于当前路径,但exp(-Δf/t) > random(0,1),则仍然替换当前路径
      }
      if( JudgeOverInnerLoop(0) )    
        break;   //判断内循环是否结束,结束则跳出当前温度的内循环
      else
        NowInnerIterNumber++;  //判断内循环是否结束,不结束则继续内循环
    }
    if( JudgeOverExternalLoop(0) )
      break;  //判断外循环是否结束,结束则结束模拟退火计算
    else
    {
      NowTemperature = CountDownTemperature( NowTemperature, 0 );
      NowExternalIterNumber++;
      NowInnerIterNumber = 0;
      //判断外循环是否结束,不结束则计算出下降后的温度,并继续循环
    }
  }
}   

五、算例测试

程序对48个城市的TSP问题(城市坐标文件对应于48.txt,已放在发布的源码中)进行计算,求解得到的最优路径图如下。

图3 模拟退火算法获得的最优路径图

48个城市的计算结果,大的红*表示路径开始城市,途经城市依次用蓝色方块和红色*标示。

六、调试环境

Windows XP Professional

Visual C++ 6.0

STLport 4.6.2

上一页  1 2 

Tags:模拟 退火 算法

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接