TSPLIB是一个文件库,包含旅行商问题(和相关问题)各种实例数据。包含以下问题的实例:
EDGE_LIST 通过边列表描述图
TWOD_COORDS 用二维坐标系表示点
THREED_COORDS 用三维坐标系表示点
NO_COORDS 没有坐标系
COORD_DISPLAY 由点坐标产生
TWOD_DISPLAY 明确的二维坐标
NO_DISPLAY 没有图形显示
<integer> <real> <real>
如果NODE_COORD_TYPE是TOWD_COORDS,则为
<integer> <real> <real> <real>
如果NODE_COORD_TYPE是THREED_COORDS。整数表示各个节点的编号。实数给出坐标系。
<integer> <integer>
第一个整数描述节点编号,第二个是它的需求。备用节点也必须出现在此节中。它们的需求是0。
<integer> <integer>
每一行给出边的两个终端节点。列表以-1结束。
如果格式是ADJ_LIST,这节包含节点的邻接表。一个节点的邻接表表示形式如下:
<integer> <integer> … <integer> -1
第一个整数表示节点编号,后面的表示与该节点连接的节点编号。邻接表列表以-1结束。
<integer> <integer>
表示这条边被包含到解中。这一节以-1为结束标志。
<integer> <real> <real>
整数表示各自的节点,实数表示坐标。
在二维实例中,点i和点j之间的距离计算如下:
在三维实例中,计算如下:
二维例子:
三维例子:
三维例子:
对于pcb442,gr666,和att532问题的权威旅程长度分别是221 440,423 710和309 636。
对于xray14012问题使用xray1距离为15 429 219,使用xray2距离为12 943 294。
- 对称旅行商问题
- 哈密顿回路问题
- 非对称旅行商问题
1. 文件格式
每个文件包含描述部分和数据部分。描述部分包含文件格式信息和数据的信息。数据部分包含确切的数据。1.1 描述部分
在此节中所有实体都是这种形式的:<keyword> : <value>,<keyword>表示一个文字的关键字,<value>表示文字或数字数据。<string>,<integer>和<real>分别表示字符串、整数和实数。文件中关键词的顺序是任意的,但必须是一致的,例如:一旦一个关键词被定义,我们必须知道这个关键词的一些必要信息。下面我们给出已知的关键词列表。1.1.1 NAME: <string>
标识数据文件。1.1.2 TYPE: <string>
表示数据的类型。可能的类型有:TSP | 对称旅行商问题 |
ATSP | 非对称旅行商问题 |
1.1.3 COMMENT: <string>
附加的注释(通常包含这个问题实例的创建者或贡献者的名字)。1.1.4 DIMENSION: <integer>
对于一个TSP问题或ATSP问题,维数表示节点的个数。1.1.5 CAPACITY: <integer>
在CVRP中表示卡车的容量。1.1.6 EDGE_WEIGHT_TYPE: <string>
表示边如何计量。可用值有:
EXPLICIT | 在相应节中会明确给出 |
EUC_2D | 二维的欧几里德距离 |
EUC_3D | 三维的欧几里德距离 |
MAX_2D | 二维空间中最大距离 |
MAX_3D | 三维空间中最大距离 |
MAN_2D | 二维的曼哈顿距离 |
MAN_3D | 三维的曼哈顿距离 |
CEIL_2D | 对二维的欧几里德距离上取整 |
GEO | 实际距离 |
ATT | 对于att48和att532的距离描述函数 |
1.1.7 EDGE_WEIGHT_FORMAT: <string>
如果明确给出了边的权重,用来描述它们的格式。可用值有以下:
FUNCTION | 通过函数给出 |
FULL_MATRIX | 通过矩阵给出 |
UPPER_ROW | 上三角阵(行优先,没有对角线) |
LOWER_ROW | 下三角阵(行优先,没有对角线) |
UPPER_DIAG_ROW | 上三角阵(行优先,有对角线) |
LOWER_DIAG_ROW | 下三角阵(行优先,有对角线) |
UPPER_COL | 上三角阵(列优先,没有对角线) |
LOWER_COL | 下三角阵(列优先,没有对角线) |
UPPER_DIAG_COL | 上三角阵(列优先,有对角线) |
UPPER_DIAG_COL | 下三角阵(列优先,有对角线) |
1.1.8 EDGE_DATA_FORMAT: <string>
如果图不是完全的,描述给出图的边的格式。有以下值:EDGE_LIST 通过边列表描述图
ADJ_LIST 通过邻接表描述图
1.1.9 NODE_COORD_TYPE: <string>
表示每个点之间是否有坐标关系(例如,可能使用图显示或距离计算)。可用值有:TWOD_COORDS 用二维坐标系表示点
THREED_COORDS 用三维坐标系表示点
NO_COORDS 没有坐标系
默认值是NO_COORDS。
1.1.10 DISPLAY_DATA_TYPE: <string>
表示怎样用图形显示这些点。可用值有:COORD_DISPLAY 由点坐标产生
TWOD_DISPLAY 明确的二维坐标
NO_DISPLAY 没有图形显示
如果有点坐标,默认值是COORD_DISPLAY。其他情况是NO_DISPLAY。
1.1.11 EOF:
结束标志。这项是可选的。
1.2 数据部分
根据描述部分的选择可能需要一些附加数据。这些数据会在描述部分下面的相应节中给出。每个数据节以相应的关键字开始。节的长度要么在格式描述部分给出,要么以结束标志结束。1.2.1 NODE_COORD_SECTION :
在这一节中给出节点坐标。每行格式如下:<integer> <real> <real>
如果NODE_COORD_TYPE是TOWD_COORDS,则为
<integer> <real> <real> <real>
如果NODE_COORD_TYPE是THREED_COORDS。整数表示各个节点的编号。实数给出坐标系。
1.2.2 DEPOT_SECTION :
包含备用车站节点列表。列表以-1结束。1.2.3 DEMAND_SECTION
CVRP中所有节点的需求用以下格式(每行)给出:<integer> <integer>
第一个整数描述节点编号,第二个是它的需求。备用节点也必须出现在此节中。它们的需求是0。
1.2.4 EDGE_DATA_SECTION :
表示一张图的边在EDGE_DATA_FORMAT中允许以两种格式表示。如果格式是EDGE_LIST,按以下格式给出:<integer> <integer>
每一行给出边的两个终端节点。列表以-1结束。
如果格式是ADJ_LIST,这节包含节点的邻接表。一个节点的邻接表表示形式如下:
<integer> <integer> … <integer> -1
第一个整数表示节点编号,后面的表示与该节点连接的节点编号。邻接表列表以-1结束。
1.2.5 FIXED_EDGES_SECTION :
在这一节中,列出的边要求出现在问题的每个解中。这些边以如下形式给出(每行):<integer> <integer>
表示这条边被包含到解中。这一节以-1为结束标志。
1.2.6 DISPLAY_DATA_SECTION :
如果DISPLAY_DATA_TYPE的值是TWOD_DISPLAY,二维的坐标系可以由以下形式的数据形成:<integer> <real> <real>
整数表示各自的节点,实数表示坐标。
1.2.7 TOUR_SECTION :
这一节中是路径的集合。每条路径是一个整数的列表,它们表示此路径的节点访问序列。每条路径以“-1”结束。外加一个“-1”代表此节结束。1.2.8 EDGE_WEIGHT_SECTION :
边的权重的格式是由EDGE_WEIGHT_FORMAT给出。所有的数据是整型的并且以一种矩阵格式给出。
2.距离函数
由于EDGE_WEIGHT_TYPE有多种选择,我们现在描述各种距离的计算。在每个例子中,我们给出一段简短的C实现用于计算距离。所有的计算将浮点数转化为双精度类型的数。整型被假设成是32-bits的字。由于距离要求是整数,我们进行取整。一下我们使用取证函数“nint”。2.1 欧几里德距离(L2-metric)
对于边权重类型为EUC_2D和EUC_3D,必须用浮点坐标系来表示每个点。用x[i],y[i]和z[i]来表示节点i的各个坐标。在二维实例中,点i和点j之间的距离计算如下:
xd = x[i] - x[j];
yd = y[i] - y[j];
dij = nint( sqrt( xd*xd + yd*yd ) );
在三维实例中,计算如下:
xd = x[i] - x[j];
yd = y[i] - y[j];
zd = z[i] - z[j];
dij = nint( sqrt( xd*xd + yd*yd + zd*zd ) );
2.2 曼哈顿距离(L1-metric)
如果边的权重类型为MAN_2D或MAN_3D,曼哈顿距离计算方法如下。二维例子:
xd = abs( x[i] - x[j] );
yd = abs( y[i] - y[j] );
dij = nint( xd + yd );
三维例子:
Xd = abs( x[i] - x[j] );
yd = abs( y[i] - y[j] );
zd = abs( z[i] - z[j] );
dij = nint( xd + yd +zd );
2.3 最大距离
二维例子:xd = abs( x[i] - x[j] );
yd = abs( y[i] - y[j] );
dij = max( nint( xd ), nint( yd ) );
三维例子:
Xd = abs( x[i] - x[j] );
yd = abs( y[i] - y[j] );
zd = abs( z[i] - z[j] );
dij = max( nint( xd ), nint( yd ), nint( zd ) );
其他略
2.4 验证
为了验证距离函数的正确性,我们给出了“权威”旅程1,2,...,n的长度。对于pcb442,gr666,和att532问题的权威旅程长度分别是221 440,423 710和309 636。
对于xray14012问题使用xray1距离为15 429 219,使用xray2距离为12 943 294。