回溯法----旅行售货员问题

https://blog.csdn.net/jarvischu/article/details/6058931

一、问题

 

      同文章 <分支限界法—-旅行售货员问题>

 

二、代码实现

       程序实现了 递归回溯 解决该问题

       迭代回溯算法仍在考虑中…

[cpp] 
view plain
 copy

  1. /**************************************************************** 
  2.  *问  题:旅行售货员 
  3.  *算  法:回溯法 
  4.  *描  述:解空间为 排列树 
  5.  ****************************************************************/  
  6. #include <stdio.h>  
  7. #define N 4                //城市数目  
  8. #define NO_PATH -1         //没有通路  
  9. #define MAX_WEIGHT 4000  
  10. int City_Graph[N+1][N+1];  //保存图信息  
  11. int x[N+1];                //x[i]保存第i步遍历的城市  
  12. int isIn[N+1];             //保存 城市i是否已经加入路径  
  13. int bestw;                 //最优路径总权值  
  14. int cw;                    //当前路径总权值  
  15. int bestx[N+1];            //最优路径  
  16. //—————————————————————–  
  17. void Travel_Backtrack(int t){        //递归法  
  18.     int i,j;  
  19.     if(t>N){                         //走完了,输出结果  
  20.         for(i=1;i<=N;i++)            //输出当前的路径  
  21.             printf(“%d “,x[i]);  
  22.         printf(“/n”);  
  23.         if(cw < bestw){              //判断当前路径是否是更优解  
  24.             for (i=1;i<=N;i++){  
  25.                 bestx[i] = x[i];  
  26.             }  
  27.             bestw = cw;  
  28.         }  
  29.         return;  
  30.     }  
  31.     else{  
  32.         for(j=1;j<=N;j++){           //找到第t步能走的城市  
  33.             if(City_Graph[x[t-1]][j] != NO_PATH && !isIn[j]){ //能到而且没有加入到路径中  
  34.                 isIn[j] = 1;  
  35.                 x[t] = j;  
  36.                 cw += City_Graph[x[t-1]][j];  
  37.                 Travel_Backtrack(t+1);  
  38.                 isIn[j] = 0;  
  39.                 x[t] = 0;  
  40.                 cw -= City_Graph[x[t-1]][j];  
  41.             }  
  42.         }  
  43.     }  
  44. }  
  45. void main(){  
  46.     int i;  
  47.     City_Graph[1][1] = NO_PATH;  
  48.     City_Graph[1][2] = 30;  
  49.     City_Graph[1][3] = 6;  
  50.     City_Graph[1][4] = 4;  
  51.       
  52.     City_Graph[2][1] = 30;  
  53.     City_Graph[2][2] = NO_PATH;  
  54.     City_Graph[2][3] = 5;  
  55.     City_Graph[2][4] = 10;  
  56.     City_Graph[3][1] = 6;  
  57.     City_Graph[3][2] = 5;  
  58.     City_Graph[3][3] = NO_PATH;  
  59.     City_Graph[3][4] = 20;  
  60.       
  61.     City_Graph[4][1] = 4;  
  62.     City_Graph[4][2] = 10;  
  63.     City_Graph[4][3] = 20;  
  64.     City_Graph[4][4] = NO_PATH;  
  65.     //测试递归法  
  66.     for (i=1;i<=N;i++){  
  67.         x[i] = 0;               //表示第i步还没有解  
  68.         bestx[i] = 0;           //还没有最优解  
  69.         isIn[i] = 0;            //表示第i个城市还没有加入到路径中  
  70.     }  
  71.        
  72.     x[1] = 1;                   //第一步 走城市1  
  73.     isIn[1] = 1;                //第一个城市 加入路径  
  74.     bestw = MAX_WEIGHT;  
  75.     cw = 0;  
  76.     Travel_Backtrack(2);        //从第二步开始选择城市  
  77.     printf(“最优值为%d/n”,bestw);  
  78.     printf(“最优解为:/n”);  
  79.     for(i=1;i<=N;i++){  
  80.         printf(“%d “,bestx[i]);  
  81.     }  
  82.     printf(“/n”);  
  83. }  

 

    原文作者:分支限界法
    原文地址: https://blog.csdn.net/qq_20398345/article/details/80987304
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞