目录
摘要
纯菜鸟来了。运用顺序查找法一个一个比较得出。其他算法如:(1)动态规划(2) 模拟退火算法(4)遗传算法(5)粒子群算法。
TSP问题-旅行商问题
它是数学领域中著名问题之一。假设有一个旅行商要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
分析
走访n个城市,他的所有走法有n!种
以12 个地点为例
无人机从管理站出发,对每台风机巡检后返回管理站。根据给定坐标,设计算法使得无人机飞行距离最短。
流程图
代码段
以下是本人编写的代码,简单易懂。
#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;
}