分支限界法----旅行售货员问题

二、代码实现

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

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

[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. }  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分支限界法是一种求解问题的方法,可以用来解决旅行售货员问题。该问题是指一个售货员要依次访问n个城市,并且每个城市只能访问一次,最后回到起始城市。要求找出一条最短的路径,使得售货员完成销售任务。 为了用分支限界法求解旅行售货员问题,可以使用深度优先搜索算法。以下是用C语言编写的代码示例: ```c #include <stdio.h> #define MAX_CITIES 10 #define INF 9999999 int n; // 城市数量 int matrix[MAX_CITIES][MAX_CITIES]; // 城市距离矩阵 int bestPath[MAX_CITIES]; // 最短路径 int visited[MAX_CITIES]; // 是否已访问过 int minCost = INF; // 最小成本 void travel(int currentCity, int *path, int cost) { if (currentCity == 0 && cost < minCost) { minCost = cost; for (int i = 0; i < n; i++) { bestPath[i] = path[i]; } } for (int nextCity = 0; nextCity < n; nextCity++) { if (!visited[nextCity] && matrix[currentCity][nextCity] != INF) { visited[nextCity] = 1; path[currentCity + 1] = nextCity; travel(nextCity, path, cost + matrix[currentCity][nextCity]); visited[nextCity] = 0; } } } int main() { printf("请输入城市数量:"); scanf("%d", &n); printf("请输入城市间距离矩阵(用INF表示无法直接到达):\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &matrix[i][j]); } } int path[MAX_CITIES]; path[0] = 0; // 起始城市 visited[0] = 1; travel(0, path, 0); printf("最短路径:"); for (int i = 0; i < n; i++) { printf("%d ", bestPath[i]); } printf("0\n"); printf("最小成本:%d\n", minCost); return 0; } ``` 以上代码通过深度优先搜索算法遍历所有可能的路径,并记录最短路径和对应的成本。最后输出最短路径和最小成本。 请注意,以上代码仅为示例,实际使用时可能需要根据具体情况进行适当修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值