TSP的动态规划算法

 程序运行之前先新建一个名为1.txt的文本,里面存储一个邻接矩阵的相关数据,如:0    3     1     5     8 23
 564    0    6     654     9 5
 56    6    0    4     2 123
 5    654     54   0    3 6
 8     9     654    3    0 12
22    25   100   23 236 0

点到其本身的权值输入0

#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
void ToBinary(char *a,int num,int vexnum)
{
 int i;
 for(i = 0;i < vexnum;i++)
  a[i] = '0';
 i -= 1;
 while(num != 0)
 {
  a[i--] = num%2 + 48;
  num /= 2;
 }

}
void StringAdd(char *&a,char *b,int vexnum)
{
 int i;
 char c = '1';
 a = (char *)malloc((1+vexnum)*sizeof(char));        /
 strcpy(a,b);
 for(i = vexnum-1;i >= 0;i--)
 {
  char temp;
  if(a[i] != c)
   temp = '0';
  else if(a[i] == '0')
   temp = '0';
  else temp = '1';
  if(a[i] != c)
   a[i] = '1';
  else a[i] = '0';
  c = temp;
 }
}

int OneNum(char *a,int vexnum)
{
 int i,count = 0;
 for(i = 1;i < vexnum;i++)
  if(a[i] == '1')
   count++;
  return count;
}
void Create(int **&D,char **&V,int **&admatrix,int **&path,int &vexnum)
{
 int arcnum;
 ifstream matrix,tomb;
 matrix.open("1.txt");
 if(!matrix)
 {
  cout << "Cannot open input file"<< endl;
  return;
 }
 int c,count = 0;
 while(!matrix.eof())
 {
  matrix >> c;
  count++;
 }
 //cout << count << endl;
 matrix.clear();
 matrix.seekg(0,ios::beg);
 vexnum = (int)sqrt(count);
 arcnum = count-vexnum;
 admatrix = (int **)malloc(vexnum*sizeof(int *));
 D = (int **)malloc(vexnum*sizeof(int *));
 V = (char **)malloc(pow(2,vexnum-1)*sizeof(char *));
 path = (int **)malloc(vexnum*sizeof(int *));
 int i,j;
 for(i = 0;i < vexnum;i++)
 {
  admatrix[i] = (int *)malloc(sizeof(int)*vexnum);
  D[i] = (int *)malloc(pow(2,vexnum-1)*sizeof(int));
  path[i] = (int *)malloc(pow(2,vexnum-1)*sizeof(int));
 }
 for(i = 0;i < pow(2,vexnum-1);i++)
  V[i] = (char *)malloc((vexnum+1)*sizeof(char));      /
 for(i = 0;i < vexnum;i++)
  for(j = 0;j < vexnum;j++)
   admatrix[i][j] = INT_MAX;
  count = 0;
 
  while(!matrix.eof())
  {
   matrix >> c;
   count ++;
   if(count % vexnum)
    admatrix[count/vexnum][count % vexnum-1] = c;
   else
    admatrix[count/vexnum-1][vexnum-1] = c;
  }
  matrix.close();
  for(i = 0;i < vexnum;i++)
   admatrix[i][i] = INT_MAX;
  for(i = 0;i < vexnum;i++)
   V[0][i] = '0';
  V[0][i] = 0;
  for(i = 1;i < pow(2,vexnum-1);i++)
   StringAdd(V[i],V[i-1],vexnum);

 /* for(i = 0;i < vexnum;i++)
  {
   for(int j = 0;j < vexnum;j++)
    cout << admatrix[i][j] << " ";
   cout << endl;
  }*/

}
int Solution(int **D,char **V,int **admatrix,int **path,int vexnum)
{
 int i,j,k,l;
 for(i = 0;i < vexnum;i++)
  for(j = 0;j < pow(2,vexnum-1);j++)
  {
   D[i][j] = INT_MAX;
   path[i][j] = -1;
  }
  for(i = 1;i < vexnum;i++)
   D[i][0] = admatrix[i][0];
  for(k = 1;k < pow(2,vexnum-1)-1;k++)
   for(j = 0;j < pow(2,vexnum-1);j++)
   {
    if(OneNum(V[j],vexnum) == k)
    {
     for(l = 1;l < vexnum;l++)
     {
      if(V[j][l] == '0')
      {
       int min = INT_MAX,tag = -1;
       for(i = 0;i < vexnum;i++)
        if(V[j][i] == '1')
         if(admatrix[l][i]+D[i][j-(int)pow(2,vexnum-i-1)] < min)
         {
          tag = i;
          min = admatrix[l][i]+D[i][j-(int)pow(2,vexnum-i-1)];
         }
         D[l][j] = min;
         path[l][j] = tag;
      }
     }
    }
   }
   int min = INT_MAX,tag = -1;
   for(i = 1;i < vexnum;i++)
   {
    
    if(admatrix[0][i]+D[i][(int)pow(2,vexnum-1)-1-(int)pow(2,vexnum-i-1)] < min)
    {
     tag = i;
     min = admatrix[0][i]+D[i][(int)pow(2,vexnum-1)-1-(int)pow(2,vexnum-i-1)];
    }
   }
   D[0][(int)pow(2,vexnum-1)-1] = min;
   path[0][(int)pow(2,vexnum-1)-1] = tag;
   return min;

}
int main()
{
    int **D;
 char **V;
 int **admatrix;
 int **path;
 int vexnum,i,j = 0;
 Create(D,V,admatrix,path,vexnum);
 cout << Solution(D,V,admatrix,path,vexnum) << endl;
 char *a = (char *)malloc((vexnum+1)*sizeof(char));
 cout << "经过的路径如下:" << endl;
 a[j++] = 0;
 int col = (int)pow(2,vexnum-1)-1;
 for(i = path[0][col];i != -1;i = path[i][col])
 {
  col -= (int)pow(2,vexnum-i-1);
  a[j++] = i;
 }
    a[j] = 0;
 for(i = 0;i < vexnum+1;i++)
  cout << a[i]+1 << " ";
 cout << endl;

 for(i = 0;i < vexnum;i++)
 {
  free(D[i]);
  free(admatrix[i]);
  free(path[i]);
 }
 for(i = 0;i < pow(2,vexnum-1);i++)
  free(V[i]);
 free(V);
 free(D);
 free(admatrix);
 free(path);
 free(a);
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值