旅行售货员问题

我刚学算法设计,对旅行售货员问题不是很了解。我在网上下了一个算法,算法有些注释,但我的水平低。看的不是很懂。希望有高手将注释写的详细点,
尤其是void backtrack(int i)里的。(最好每一句都有注释)。
附(算法)
/**
旅行售货员问题(回溯)
**/
#include<iostream>
using namespace std;

#define MAX_VALUE 10000

//int e[4][4];
class Bttsp
{
private:
int n;//图G的顶点个数
int *x;//当前解
int *bestx;//当前最优解
int vestc;//当前最优值
int cc;//当前费用
int **a;//图的邻接矩阵
public:
//打印G
void printG()
{
cout<<"当前创建的图的二维结构为:"<<endl;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
printf("%10d",e[i][j]);
//cout<<e[i][j]<<" ";
cout<<endl;
}
}//printG

//初始化G
void initG()
{
int count;
cout<<"请输入图中各个边的权值(源结点--目的结点--权值):"<<endl;
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
e[i][j]=MAX_VALUE;
cout<<"请输入图中边的个数:"<<endl;
cin>>count;
for(i=1;i<=count;i++)
{
int ii,jj;
cout<<"请输入边"<<i<<"的源结点:"<<endl;
cin>>ii;
cout<<"请输入边"<<i<<"的目的结点:"<<endl;
cin>>jj;
cout<<"请输入边"<<ii<<"--"<<jj<<"的权值(费用):"<<endl;
cin>>e[ii][jj];
e[jj][ii]=e[ii][jj];//无向图
cout<<endl;
}
}//initG

//计算最优解
int tsp(int *v)
{
//置x为单位排列
x=new int[n+1];
for(int i=1;i<=n;i++)
x[i]=i;
bestc=MAX_VALUE;
bestx=v;
cc=0;
//搜索x[2:n]的全排列
backtrack[2];
return bestc;
}//tsp

//回溯算法
void backtrack(int i)
{
if(i==n)
{
if(a[x[n-1]][x[n]]<MAX_VALUE&&a[x[n]][1]<MAX_VALUE&&(bestc==MAX_VALUE||(cc+a[x[n-1]][x[n]]+a[x[n]][1])<bestc))
{
for(int j=1;j<=n;j++)
bestx[j]=x[j];
bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1];
}
}
else
{
for(int j=i;j<=n;j++)
//是否可进入x[j]子树
if(a[x[i-1]][x[j]]<MAX_VALUE&&(bestc==MAX_VALUE||(cc+a[x[i-1]][x[j]])<bestc))
{//搜索子树
swap(x,i,j);
cc+=a[x[i-1]][x[i]];
backtrack(i+1);
cc-=a[x[i-1]][x[i]];
swap(x,i,j);
}
}
}//backtrack

//交换x[]中的i和j位置处的值
void swap(int x[],int i,int j)
{
int abc;//中间变量
abc=x[i];
x[i]=x[j];
x[j]=abc;
}//swap
};//Bttsp

void main()
{
int st;//最短路径
Bttsp b;
b.initNet();
b.printNet();

}//main

第1个回答  2010-05-30
我有这方面的相关教材,可以借给你看看,希望你帮得上你,请你留个邮箱吧,我给你发过去。本回答被提问者采纳
相似回答