TSPLIB95

TSPLIB是一个文件库,包含旅行商问题(和相关问题)各种实例数据。包含以下问题的实例:
  • 对称旅行商问题
  • 哈密顿回路问题
  • 非对称旅行商问题

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。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值