65,210
社区成员
发帖
与我相关
我的任务
分享
/* distance.cpp 读取城市坐标信息,计算两两城市之间的距离,生成距离文件*/
#include <IOSTREAM>
#include <FSTREAM>
#include <STRING>
#include <CMATH>
using namespace std;
int main()
{
//申明和初始化变量
char city_name[20];
float city_x[20], city_y[20];
float city_distance[20][20];
float max_distance, min_distance;
int i=0, k, j;
string filename;
ifstream sensor;
ofstream inform;
//请求用户输入文件名
cout<<"enter the name of the data file:(it should be 'data.txt' here) ";
cin>>filename;
//打开文件读取数据信息
sensor.open(filename.c_str());
if(sensor.fail())
{
cout<<"Error opening input file\n";
}
else
{
//没有到达文件末尾时循环读取数据
while(!sensor.eof())
{
sensor>>city_name[i]>>city_x[i]>>city_y[i];
i++;
}
}
//计算任意两城市之间的距离,求出最大、最小距离
//初始化最大、最小距离值
max_distance=sqrt(pow(city_x[1]-city_x[0],2)+pow(city_y[1]-city_y[0],2));
min_distance=max_distance;
for(k=0;k<I-1;K++) if(min_distance } max_distance="city_distance[k][j];" { if(max_distance<city_distance[k][j]) city_distance[k][j]="sqrt(pow(city_x[j]-city_x[k],2)+pow(city_y[j]-city_y[k],2));" for(j="k+1;j<i;j++)">city_distance[k][j])
{
min_distance=city_distance[k][j];
}
}
}
for(k=0;k<i;k++)
{
city_distance[k][k]=0;
for(j=0;j<k;j++)
{
city_distance[k][j]=city_distance[j][k];
}
}
//生成距离文件distance.txt, 文件的开始一行显示的是最大、最小距离
//第i+1行显示的是:城市i和其他各城市之间的距离
filename="distance.txt";
//打开文件
inform.open(filename.c_str());
//设置输出格式
inform.setf(ios::fixed);
inform.precision(3);
//写入最大、最小距离信息
inform<<max_distance<<' '<<min_distance<<endl;
//写入全部距离信息
for(k=0;k<i;k++)
{
for(j=0;j<i;j++)
{
inform<<city_distance[k][j]<<' ';
}
inform<<ENDL; } pre < 0; return inform.close(); 关闭文件>
<SCRIPT src="/inc/gg_read2.js"></SCRIPT>
//分支限界法求解TSP问题的程序
#include
#include
#include
#include
using namespace std;
//定义相关结构体
typedef struct node_data //结点数据结构
{
float c[20][20]; /*费用矩阵*/
int row_init[20]; /*费用矩阵的当前行映射为原始行*/
int col_init[20]; /*费用矩阵的当前列映射为原始列*/
int row_cur[20]; /*费用矩阵的原始行映射为当前行*/
int col_cur[20]; /*费用矩阵的原始列映射为当前列*/
int ad[20]; /*回路顶点邻接表*/
int k; /*当前费用矩阵的阶*/
float w; /*结点的下界*/
}NODE;
typedef struct /*堆结构数据*/
{
NODE *p; /*指向结点元素的指针*/
float w; /*所指向结点的下界,堆元素的关键字*/
}HEAP;
//主要函数申明部分
float row_min(NODE *node,int row,float &second);
float col_min(NODE *node,int col,float &second);
float array_red(NODE *node);
float edge_sel (NODE *node,int &vk,int &vl);
void del_rowcol(NODE *node,int vk,int vl);
void edge_byp(NODE *node,int vk, int vl);
NODE *initial(float c[20][20],int n);
void insert(HEAP *&heap,int &n_heap,HEAP z);
HEAP delete_min(HEAP *&heap,int &n_heap);
//主函数开始
int main()
{
int n=20;
int ad[20],path[20];
float c[20][20];
float max_distance, min_distance;
string filename="distance.txt";
ifstream sensor;
sensor.open(filename.c_str()); //打开文件读取距离数据信息
if(sensor.fail())
{
cout<<"Error opening input file\n";
}
else
{
sensor>>max_distance>>min_distance; //没有到达文件末尾时循环读取数据
while(!sensor.eof())
{
for(int i=0;i<20;i++)
{
for(int j=0;j<20;j++)
{
sensor>>c[i][j];
}
c[i][i]=max_distance+1;
}
}
} //读取距离信息结束
int i,j,vk,vl;
float d,w=0;
NODE *xnode;
NODE *ynode;
NODE *znode;
int n_heap=0;
HEAP *heap=new HEAP[50*30];
HEAP x,y,z;
xnode=initial(c,n);
xnode->w=array_red(xnode);
while(xnode->k!=0)
{
d=edge_sel(xnode,vk,vl);
znode=new NODE;
*znode =*xnode;
znode->c[vk][vl]=max_distance+1;
array_red(znode);
znode->w=xnode->w+d;
z.w=znode->w;
z.p=znode;
insert(heap,n_heap,z);
ynode=new NODE;
*ynode=*xnode;
edge_byp(ynode,vk,vl);
del_rowcol(ynode,vk,vl);
ynode->w=array_red(ynode);
ynode->w+=xnode->w;
y.w=ynode->w;
y.p=ynode;
if(ynode->k==2)
{
if(ynode->c[0][0]==0)
{
ynode->ad[ynode->row_init[0]]=ynode->col_init[1];
ynode->ad[ynode->row_init[1]]=ynode->col_init[0];
}
else
{
ynode->ad[ynode->row_init[0]]=ynode->col_init[0];
ynode->ad[ynode->row_init[1]]=ynode->col_init[1];
}
ynode->k=0;
}
insert (heap,n_heap,y);
delete xnode;
x=delete_min(heap,n_heap);
xnode=x.p;
}
w=xnode->w;
for(i=0;iad[i];
delete xnode;
for (i=0;ip;
heap--;
}
heap++;
delete []heap; //释放堆空间
int t=0,k=1; //将邻接表转化为遍历城市的顺序列表,保存在path[]中
path[0]=0;
while(k<n)
{
j=t;
t=ad[j];
path[k]=t;
k++;
}
cout<<"the result of the path:"<<endl; //输出最优遍历城市顺序的结果,转化为A、B的形式
for(j=0;j<20;j++)
{
cout<<char(path[j]+65)<<' ';
}
cout<