⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tsp.cpp

📁 算法分析问题:用VC编写的旅行商程序
💻 CPP
字号:

#include<iostream>

#include <iomanip>

#define pnum 5 //pnum=总点数减1 
 int d[pnum+1][pnum+1]={{0,10,20,30,40,50},{12,0,18,30,25,21},{23,19,0,5,10,15},
 {34,32,4,0,8,16},{45,27,11,10,0,18},{56,22,16,20,12,0}};//费用数组
 int road[pnum+2];
 int curpoint ;//计算路径用 
using namespace std;
class mylist
{
public:
	
	int s[pnum];
	int num;
public:
	void delk(int k);//减小集合,计算路径用 
	int getdata(int i);
	void setdata(int j,int data);
	    
};
 int min(int *p,int length) {//计算数组里的最小值
 int mindata,pos;            //并返回返回该值的序号在curpoint中
 mindata=1000;
 pos=0;
 while(pos<length)
 {
   if(*p<mindata)
   {
    mindata=*p;   
    curpoint=pos;
    }
   p++;     
   pos+=1;
 }    
 return mindata;
}

void mylist::delk(int k)  //最后计算路径时逐步减小集合逆向计算路径
{
	int i;
	int position;
	for(i=0;i<=num-1;i++)
	{
		if(s[i]==k)
		{
			position=i;
			break;
		}
	}
	if(i<(num-1))
	{
		for(i=position;i<(num-1);i++)
		{
			s[i]=s[i+1];
		}
	}
	num=num-1;
}
int mylist::getdata(int i)
{
     return s[i];
}
void mylist::setdata(int j,int data)
{
     s[j]=data;
}
int tsp(mylist &mls,int k )   //递归子程序计算最小费用
{
	int b[pnum],i,j;
	mylist mls2;
    if(mls.num==1)
	{
		return d[0][k];
	}
	else
	{   j=0;
		for(i=0;i<mls.num;i++) //把mls-k赋给mls,从而利用算法的公式计算 
		{
            if((mls.getdata(i))!=k)
            {
             mls2.setdata(j,mls.getdata(i));
             j++;
            }
            else
            {
            }
        }
        mls2.num=mls.num-1; //把mls-k赋给mls2 
		
        for(i=0;i<mls2.num;i++)
		{
            j=mls2.getdata(i);        //TSP的递推公式
			b[i]=tsp(mls2,j)+d[j][k]; //使用mls2避免在引用中的修改				
		}                            
		return min(b,mls2.num);

   } 
}
int main()
{
    int a[pnum],i;//a[pnum]存放引用TSP后的各条路径费用
	int result; 
	mylist ml;
	ml.num=pnum;
	for(i=0;i<ml.num;i++)
	ml.setdata(i,i+1);
	for(i=0;i<pnum;i++)  //计算最后到i节的费用
	{
		a[i]=tsp(ml,i+1)+d[i+1][0];
	}
	
	result=min(a,ml.num);
	road[pnum+1]=0;
	road[pnum]=curpoint+1;
	for(i=pnum-1;i>=1;i--)
	{
     tsp(ml,road[i+1]);//得到连接road[i]的节点的序号 
	 ml.delk(road[i+1]);//得到tsp程序中的mls2进行下一步计算  
	 road[i]=ml.getdata(curpoint);//分析min函数的curpoint, 
    }							  //得到当前子集的最后通过点ml.getdata(curpoint)
	road[0]=0;
	cout<<"**动态规划球旅行商问题**"<<endl;
	cout<<setw(10)<<"耗费矩阵:"<<endl;
	cout<<setw(25)<<"{0,10,20,30,40,50}"<<endl;
	cout<<setw(25)<<"{12,0,18,30,25,21}"<<endl;
	cout<<setw(25)<<"{23,19,0,5 ,10,15}"<<endl;
	cout<<setw(25)<<"{34,32,4,0 ,8 ,16}"<<endl;
	cout<<setw(25)<<"{45,27,11,10,0,18}"<<endl;
	cout<<setw(25)<<"{56,22,16,20,12,0}"<<endl;

	cout<<"最低耗费量 :"<<result<<endl;
	cout<<"最低耗费路径 :";
	for(i=0;i<(pnum+2);i++)
	cout<<road[i]+1<<"->";
	cout<<endl;
	return 0;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -