模拟退火算法求解TSP问题
2009-01-26 11:57:56 来源:WEB开发网四、主要代码
对应于流程框图,实现流程的主体函数是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
更多精彩
赞助商链接