顺序查找求简单TSP 问题

目录

摘要

TSP问题-旅行商问题

分析

以12 个地点为例

 


摘要

纯菜鸟来了。运用顺序查找法一个一个比较得出。其他算法如:(1)动态规划(2) 模拟退火算法(4)遗传算法(5)粒子群算法。        

TSP问题-旅行商问题

它是数学领域中著名问题之一。假设有一个旅行商要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

分析

走访n个城市,他的所有走法有n!种

以12 个地点为例

无人机从管理站出发,对每台风机巡检后返回管理站。根据给定坐标,设计算法使得无人机飞行距离最短。

流程图 

cb4d88736e2f468c99f282f3f8f75387.png

 

代码段

 以下是本人编写的代码,简单易懂。

#include<stdio.h>
#include"stdlib.h"
#include<string.h>
#include<math.h>
struct Position//风机坐标(x,y) 
{
	int x0;
	int y0;
};
	struct Position a[50]={0};

int Input_Output_Fan()//输入输出所有风机坐标,风机总数 
{
printf("输入结束请输入over\n\n");
	char V;
here:
	int i=0,j=0;
	char str[10]="0";
	printf("请依次输入各风机坐标:\n"); 
	for(;strcmp(str,"over");i++)
	{
		scanf("%d%d",&(a+i)->x0,&a[i].y0);
		gets(str);
	}
	printf("\n是否输入正确(T/F):");
	scanf("%c",&V); 
	if(V=='F')
	{
		goto here; 
	 }
	 
	printf("A基站的坐标(%d,%d)\n",a[0].x0,a[0].y0); 
	for(j=1;j<i;j++)
	{
		printf("%c风机的坐标(%d,%d)\n",j+66,a[j].x0,a[j].y0);
	}
	printf("\n风机总数%d",i-1);
	return i;
}


double Distance(struct Position a1,struct Position a2)//两点之间距离 
{
	int i=1,j=0;
	double X=0.0;
	X=sqrt(pow((a1.x0-a2.x0),2)+pow((a1.y0-a2.y0),2));
	return X;
}


void total(int N)//方法总数 
{
	int x=1,i=1,j=1;
	for(;x<=N;i++,x++)
	{
		i=x*j;
		j=i;
	}
	printf("\n\n方法总数%d",j);
}

int main()
{	
	int N=0; 
	N=Input_Output_Fan(); 
	total(N);
	int i=0,j=0,n, m,x=1,l=1,y,z,o,p,q,r,s;
	double min=9999.0,mid=0.0;
	double A[50][50]={0.0};
	int Max[20]={0};
	printf("\n\n距离方阵:\n");
	for(i=1;i<=N;i++)
	{	
		for(j=2;(j<=N+1);j++)
		{
			if(i<=j)
			{
			A[i][j]=Distance(a[i-1],a[j-1]);
			A[j][i]=A[i][j];
			}	
		}
	}
	for(i=0;i<=N;i++)
	{
		for(j=0;j<=N;j++)
		{
		
		printf("%.1lf  ",A[i][j]);
		}
		printf("\n\n");
	}
	
	for(x=2;x<=12;x++)                      
   {                                   
   		for(y=2;y<=12;y++)                  
   		{  
		   if(y!=x)                           
   			for(z=2;z<=12;z++)                  
   			{   
			   if(z!=x&&z!=y)                      
   				for(l=2;l<=12;l++)                      
   				{
				   if(l!=z&&l!=x&&l!=y)                       
   					for(m=2;m<=12;m++)                  
   					{
					   if(m!=z&&m!=x&&m!=y&&m!=l)
					   for(n=2;n<=12;n++)
					   {
					   	
					   		if(n!=z&&n!=x&&n!=y&&n!=l&&n!=m)
					   		for(o=2;o<=12;o++)
					   		{
							    if(o!=z&&o!=x&&o!=y&&o!=l&&o!=m&&o!=n)
							    for(p=2;p<=12;p++)
							    {
							    	if(p!=z&&p!=x&&p!=y&&p!=l&&p!=m&&p!=n&&p!=o)
							    	for(q=2;q<=12;q++)								//K 
							    	{
							    		if(q!=z&&q!=x&&q!=y&&q!=l&&q!=m&&q!=n&&q!=o&&q!=p)
							    		for(r=2;r<=12;r++)							//L
							    		{
							    			if(r!=z&&r!=x&&r!=y&&r!=l&&r!=m&&r!=n&&r!=o&&r!=p&&r!=q)
							    			for(s=2;s<=12;s++)
							    			{
							    				if(s!=z&&s!=x&&s!=y&&s!=l&&s!=m&&s!=n&&s!=o&&s!=p&&s!=q&&s!=r)
												{
													mid=A[1][x]+A[x][y]+A[y][z]+A[z][l]+A[l][m]+A[m][n]+A[n][o]+A[o][p]+A[p][q]+A[q][r]+A[r][s]+A[s][1];
										  	   	    if(mid<min)
													{
													min=mid;
													Max[0]=x;Max[1]=y;Max[2]=z;Max[3]=l;Max[4]=m;Max[5]=n;Max[6]=o;Max[7]=p;
													Max[8]=q;Max[9]=r;Max[10]=s;
													}
												}
							    			}
										}
									
									}
								}
						  	    
							}
						}
					}
					                
				}
			}
		}
   }
   printf("min=%lf\n",min);
   printf("1->");
    for(i=0;i<N-1;i++)
   {
   	printf("%d->",Max[i]);
   }
    return 0;
}
	


    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值